记一次逆向--解看雪CTF之Q1第一题

逛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,就逆回去,代码如下:

最终结果如下:

你可能感兴趣的:(记一次逆向--解看雪CTF之Q1第一题)