-
-
[原创]2019看雪CTF晋级赛Q1第一题 流浪者WriteUp
-
2019-3-25 00:46
6416
-
[原创]2019看雪CTF晋级赛Q1第一题 流浪者WriteUp
程序分析
使用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。
结果验证:
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法
最后于 2019-3-25 00:50
被wenyuanzh编辑
,原因: 图片挂了