首页
社区
课程
招聘
[原创] CCTF_pwn3 题解
发表于: 2019-10-4 22:25 14922

[原创] CCTF_pwn3 题解

2019-10-4 22:25
14922

从基本的程序信息上看,没有什么特殊的地方。运行程序,根据输入的结果,可以肯定对输入进行了验证处理,具体的功能和逻辑还需要看一下代码。

strings查看一下是否有明显的字符串信息:

从搜索到字符串来看,程序中存在几个高危函数,之所以考虑printf是预防一下格式化字符串漏洞的出现。

main函数:

从main函数来看,没有明显的问题,但是main函数下调用了几个其他的函数,依次进去查看一下。

ask_username()函数:

在这个函数里,我们发现src中是我们输入的username,然后下面的循环对username进行了处理:依次将src中的字符的ascii码进行+1的操作,完事之后copy到了dest中,没有发现后续的处理了,也没有发现条件判断和对比。既然对输入做了处理,那么就需要对输入进行判断,可能在其他函数中实现。

ask_password()函数:

在这个函数中发现了对处理后的username进行的判断,判断是否与"sysbdmin"相等,然后返回welcome。
那我们可以使用下面的代码还原出正确的username:

最后得到的正确的username为rxraclhm。

重新输入正确的username,看程序反应:

ok,现在可以正常进入到程序流程了。继续回到IDA查看源码。

get_command()函数:

在这个函数中我们看到对根据不同的输入执行不同的判断并返回不同的数值,而该函数是在进行完username后执行的,也就是这里期望我们输入的是"get","put","dir"这三个字符串。

put_file()函数:

输入的字符串为"put",就会执行到该函数,但看该函数的代码没有发现明显的问题,需要我们输入file的名字以及内容。

get_file()函数:

输入的字符串为"get",就会执行到该函数。在该函数的代码中,主要是根据输入的file的名字来获取文件并输出内容,而且还调皮了一下判断是不是输入的"flag"。在输出的时候,printf函数有明显的格式化字符串漏洞,这里我们先记一下,有可能是主要的漏洞利用的地方。

show_dir()函数:

输入的字符串为"dir",就会执行到该函数。但是看函数代码,也没有发现特殊的地方。

根据上面对各个函数的代码的分析,我们总结一下:
该程序是一个类似ftp服务器的程序,可以输入put|get|dir三个命令。

在put函数中发现了一个明显的格式化字符串漏洞,那么我们就可以从这里入手,搞一波。

大体思路就是上面的思路,解题过程中遇到的坑在exp中进行说明。

对格式化字符串偏移的计算:


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2019-10-4 22:30 被有毒编辑 ,原因:
上传的附件:
收藏
免费 2
支持
分享
最新回复 (3)
雪    币: 26205
活跃值: (63302)
能力值: (RANK:135 )
在线值:
发帖
回帖
粉丝
2
感谢分享~
2019-10-5 10:13
0
雪    币: 14530
活跃值: (17548)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
3
mark,楼主辛苦了
2019-10-7 19:48
0
雪    币: 20
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4
请教一下楼主。。。为啥payload“'%8$s'+p32(puts_got)”里面,要把地址卸载后面。。。。格式化字符串漏洞的利用格式不是地址写在前面嘛?有点想不明白
2020-3-22 19:27
0
游客
登录 | 注册 方可回帖
返回
//