逛FreeBuf的时候偶然看到一篇讲解CTF比赛题目的文章,才知道最近看雪论坛有CTF比赛,兴冲冲去瞅了瞅,没敢直接报名参加Q2阶段的比赛,先去试了试Q1阶段的题目,果然,都是逆向题目,第一题跟着各位大佬的文章分析了两天总算解出来了,但是第二题跟着分析文章也还走不下去,说到底还是对逆向不熟~现在先看第一题的解题思路~
从看雪论坛ctf.pediy.com中找到CTF模块,找到晋级赛Q1,下载第一题的压缩包,解压,是个exe文件:
我们试着运行一下,看看是个什么东东~
明显是要输入正确的password,怎么才能验证通过呢?我们看看程序逻辑是如何实现的~
使用IDA逆向工具加载程序:
点击OK后,界面如下:
粗略介绍一下各个窗口:
Functions window:程序样本的函数窗口,列举了识别出的每一个函数
IDA View-A:反汇编窗口,显示了IDA对程序的反汇编结果
Hex view-1:十六进制格式显示的窗口,显示了程序内容和对应地址空间的十六进制数据,可直接对代码和数据进行修改,相当于十六进制的编辑器。
Structures:结构体窗口,显示数据结构
Enums:枚举窗口,显示检测到的标准枚举类型
Imports:导入窗口,列出了被载入文件导入的所有函数
Exports:导出窗口,列出了被载入文件的所有导出函数
查看载入程序的strings:
可以看到有类似于跟逻辑处理相关的字符串,双击进去看看,来到了反汇编窗口:
在这附近看到了几个函数:
sub_4017B0
sub_4017F0
sub_401890
分别右键进行一下graph:
看看这几个函数的前后处理顺序,发现顺序如下:
那我们就先看看sub_401890做了什么吧。
从Functions window窗口中找到sub_401890,点击进入后,反汇编窗口(IDA View-A)就显示出该函数的反汇编代码,为了能看懂一些,我们使用F5快捷键将它转为伪代码:
看到for循环就知道了处理逻辑在这里:
大写字母减29,小写字母减87,数字减48;
然后将结果传给sub_4017F0函数:
再看下一个sub_4017F0:
While循环中,取aAbcdefghiabcde参数中,sub_401890传入的值所代表的位置的字符,将这串字符串跟KanXueCTF2019JustForhappy对比,相同则走sub_401770函数的处理逻辑:Pass!
好,总结一下思路:
假设有一个字符串A,转换为ASCII码后,将它的大写字母减29,小写字母减87,数字减48,将结果作为下标取出aAbcdefghiabcde中的值,取出的值为KanXueCTF2019JustForhappy
要想求得字符串A,就逆回去,代码如下:
最终结果如下: