CTF,第二题

https://adworld.xctf.org.cn/task/answer?type=pwn&number=2&grade=0&id=5052&page=1

有了之前第一题的基础,这个就非常容易了,事实证明,第二题也确实比第一题难度低,直接下载文件,看代码

 

 

主要看这三段就够了,第一段是当前函数的唯一一个函数体,功能是输出提示接受输入,其实 read 0 ,就是从标准输入流接受输入

它read 了16个字节,然后判断了一个变量,如果值符合要求,那么久调用下面的函数,下面的函数输出flag(读一个文件)

很简单,那么我只需要看一下那个输入的缓冲区和那个普通变量就好了。

全局变量也不怕,内存分布很巧,等待输入的变量和后需要判断的变量挨着,

结果导致,如果我可以精心构造一个字符串的话,就有可能在输入这个字符串之后,修改了邻接的第二个变量,最后让if 判断符合条件,

if的条件是要求 判断变量处内存需要为 == “aaun”

根据内存分布,发现,判断变量前,到上一个变量即接收输入的字符串起始地址,差距4个字节,判断变量长度又是4个字节,

所以我们精心构造的字符串应该是这样的:????aaun。

后面什么样,就随它去吧,我比较习惯把后面填满,即再补8字节,但是其实不填也没问题,

代码如下

 1 from pwn import *
 2 
 3 a = remote('124.126.19.106', 39129)
 4 r = a.recvuntil('bof
')
 5 print(r)
 6 
 7 str = "a" * 4 + "aaun" 
 8 print(str)
 9 a.send(str);
10 
11 a.interactive()

执行效果

有了第一次的经验,这次就知道怎么玩了,挺容易的,没难度,

一共就用了五分多,之间还去了倒了一杯咖啡,之后又去了一趟WC。

循序渐进吧。

原文地址:https://www.cnblogs.com/suanguade/p/12963654.html