首页
论坛
专栏
课程

[原创]2019看雪CTF晋级赛Q1第一题 流浪者WriteUp

2019-3-25 00:46 3903

[原创]2019看雪CTF晋级赛Q1第一题 流浪者WriteUp

2019-3-25 00:46
3903

程序分析

使用IDA载入程序,程序载入后按下Shift+F12查看Strings,如图。


可以假设一下程序在对pass进行校验时第一步是先检查输入框内容是否为空,因此可以双击“请输入pass!”文本跳到该字符串地址,再找到引用该字符串的函数。


双击字符串跳转至字符串地址,右键单击该字符串,选择“Xrefs graph to…”选项,如下图。


如下图,可以看到该字符串被sub_401890函数所引用。


在IDA左侧Functions window窗口中找到该函数后双击进入IDA View-A反汇编窗口,按下F5键查看伪代码,如下图。


通过理解上述代码,可得知,pass的每一位都必须由0-9,a-z,A-Z组成,否则程序跳转至sub_4017B0函数,该函数会提示pass错误并终止程序运行。

对于满足0-9,a-z,A-Z组成的字符,在0-9范围内的字符减去48;在a-z范围内的字符减去87;在A-Z范围内的字符减去29。

之后将处理后的字符放入数组中,再传入sub_4017F0函数中进行下一步处理。

双击sub_4017F0函数查看伪代码,如下图。


在该函数中我们可以看到,最终处理完的字符串为“KanXueCTF2019JustForhappy”时将调用sub_401770方法提示pass正确,否则调用sub_4017B0提示错误。

在while循环中可以发现程序定义了一个名为aAbcdefghiabcde的字符数组,双击可以看到该字符数组的内容为“abcdefghiABCDEFGHIJKLMNjklmn0123456789opqrstuvwxyzOPQRSTUVWXYZ”,如下图。


也就是说sub_4017F0函数将上一步骤sub_401890函数中处理后的传入数组中的值当作数组aAbcdefghiabcde的下标值取出对应字符,当满足最后组成的字符串为“KanXueCTF2019JustForhappy”时即为正确的pass。

解题工具编写

根据上文的分析,首先取出字符串“KanXueCTF2019JustForhappy”在aAbcdefghiabcde数组中对应的下标值,如下图。


编写程序代码如下:


运行该脚本得到pass。


结果验证:




[公告][征集寄语] 看雪20周年年会(12.28上海) | 感恩有你,一路同行

最后于 2019-3-25 00:50 被wenyuanzh编辑 ,原因: 图片挂了
最新回复 (1)
皮皮豪 2019-3-26 19:07
2
0
感谢大佬分享
游客
登录 | 注册 方可回帖
返回