2025-强网杯S9-wp
PWN
flag-market(复现)
这类对flag文件读取的题目之前在susctf,这边做到过一题也是简单的溢出类题型,但是这次牢不动了。溢出点找出来了,flag残留在堆上也找出来了,就是没看出来溢出后可以利用printf那边的格式化字符串漏洞泄露flag。
flag-market分析
- 先查看一下保护机制,发现
没有开PIE。

- 接下来就是运行一下这个程序,算是一个循环菜单题,但是这个菜单只有两个选项。

- 接下来逆向一下这个程序,首选发现了一个关键点,我们输入选项
1,使用255购买flag就会使得程序输出flag。

- 但是触发了这个输出flag功能,其实没啥用处,因为遇到
{就不会再将flag输出下去了,并且在逐个输出flag之前程序已经将flag这个文件描述符给关闭了。

- 尝试运行的时候会出现这样的情况,发现还有一个输入点

- 接着继续逆向这个程序,发现这个输入点存在
scanf的一个溢出漏洞,可以实现.data段溢出。

- 然后注意到上面存在一个
printf函数,并且scanf输入的时候可以溢出修改format,这样很可能就是一个字符串格式化漏洞。


flag-market调试
- 接下来调试一下,先看看是否能溢出修改
format那边的字符串。

- 发现
format那边的字符串是已经因为溢出而被修改了。

- 接下来其实可以利用字符串格式化漏洞直接输出flag,但是flag存放在什么位置呢,接下来我们要寻找一下,由于flag直接会存放在栈上,现在我们看看栈上的flag还存不存在。其实栈上的flag不会存在的,因为在出现
error的时候会先将v9清零。

- 接下来需要看看哪里还存放着flag,由于我们知道前面是有打开flag文件,需要添加一个
IO_FILE结构体,而这个结构体需要用堆存放,这个时候我们来看看堆。果然,堆上有flag的残留数据,所以我们需要泄露的是堆上的这个字符串。

- 由于地址随机偏移的问题,程序每次运行时堆地址都不是固定的,所以我们要看看能不能先泄露出堆地址(所以先要使用printf先泄露堆地址),看看栈上是否有存放堆地址,发现栈上是存在堆地址的。
- 并且在printf输出的这个位置
rsp的地址比存放堆地址的栈地址更低


- 这样就可以先使用
%9$p将堆地址给泄露出来。但是还存在一个问题,我们只能利用1次scanf溢出,所以这次溢出还需要输入%xxx$s。

- 接下来就需要调试栈上哪个地址是有效的保存字符串的地址,以便我们在第一次printf触发格式化字符串漏洞的时候
%xx$s不会导致程序崩溃,但是栈上发现没有什么有效地址。但是发现``

- 但是发现这个地方我们是可以直接控制的,可以直接输入一个地址,使得
printf触发%xx$s的时候不会导致程序崩溃。并且在泄露地址之后我们还可以将这个地址修改为flag所存放的堆地址,非常巧妙。


flag-market-EXP
就直接按照上面调试的思路去编写exp即可
- exp如下:
1 | from pwn import * |

ez-stack(复现)
ez-stack分析
ez-stack调试
ez-stack-EXP
Crypto
check-little
ezran
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 iyheart的博客!

