日行一pwn:pwn1_sctf_2016

459 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

距离上一次日行一pwn已经快一个月了,干脆改成月行一pwn吧(汗。这段时间去恶补了王爽老师的汇编语言。

结果一回来就做了这么一道题,函数封装的严严实实,打眼一看全是C++。想入门pwn这么难吗。

正片

buuoj.cn/challenges#…

使用BUUCTF靶场,首先标准步骤下载--放到kali里面查--拖到windows用ida反汇编

屏幕截图 2022-05-13 154354.png

发现只有一个NX保护

NX保护就是CPU不会执行放在内存段中的代码,也就是我们之前在BOF中学习的像内存中写入Shell的方法,在开启NX后是不可行的

之后打开IDA进入主函数,可以发现主函数只干了一件事就是调用vuln函数

image-20220513155005044.png

然后去看看Vuln函数,噩梦开始了

image-20220513155005044.png

用或不用F5都是封装的整整齐齐的C++语句

去cplusplus.com上查了半天,那一大段语句的意思大概就是把输入的字符串中的I换成You。

那么思路就来了

image-20220513155445124.png

image-20220513155544421.png

我们可以看到s是定义在栈段3c-1c的变量,长度32字节。输入有fgets严格控制长度。但是由于I被替换成You就导致了输入长度可以扩展成三倍,也就是说最大输入长度可以达到96字节,

而这道题只需要3x16+12(栈长度)+4(32位寄存器ebp长度)+4(函数偏移地址)=68位,所以是可以造成溢出的。

然后就需要查找可以利用的后门函数了,在函数列表里发现了get_flag函数

image-20220513160546815.png

image-20220513160534607.png

然后直接执行这个函数就行了。

所以直接编写Exp

from pwn import *

p = remote('node4.buuoj.cn','28976')

payload = "I" * 20 +"AAAA" + p32(0x08048F0D)
p.sendline(payload)

p.interactive()

\