CTF****入门_2
CTF****入门_1:http://blog.****.net/s1054436218/article/details/71698904
CTF****入门_2:http://blog.****.net/s1054436218/article/details/71809403
上一篇讲了算是最简单的一类逆向题目,.Net类型的****,这次主要是对于C/C++编写的软件。
前面已经介绍简简略提了下IDA是一种用于静态分析的反编译软件。什么是静态分析呢?在计算机中,几乎任何程序都要编译器编译到汇编级别才可以使用,也就是说,对于一个可执行文件,一定是可以把它的机器码转换成汇编语言来查看逻辑的。而IDA是一款十分优秀的静态反汇编软件,不仅可以清楚的查看程序所用到的各个函数还有函数的汇编源码,还可以在汇编的基础上将汇编语言解释为C/C++以便逆向人员来理解。
具体运用的方法以一道Crackme的例子来说明IDA的运用和一般**思路:
样例下载地址:http://reversing.kr/download.php?n=1
首先观察这个软件,界面如下:
图1: Easy_CrackMe界面
任意输入一串字符或者不输入字符,点击??按钮,会有以下得到以下反馈:
图2: 任意输入一个字符串的反馈
于是我们不难推测,这个软件的逻辑大概就是输入一串字符串,点击按钮后,程序会获取输入框的数据,假设你输入的字符串满足某种条件(比方说跟一个明文字符串相同、或者按某种数学运算得到的字符串满足什么规律或者移位后有什么规律),就是正确答案,否则就会弹框出“Incorrect Password”。如果我们不是逆向人员,想要知道真正的密码可能要尝试无数次数字和字母组合才能得到正确答案,如果我们用IDA分析这个软件的话,便可以从逻辑角度获取真正的密码,首先把它拖入到IDA中:
图3: 使用IDA打开后可见Easy_CrackMe.exe的源码
得到由于汇编源码比较庞大,可以直接按F5进行反编译,反编译后可以看到C语言的源码:
图4: C语言源码
发现反编译后的源码只有一句,而且只是一个初始化的函数,可见我们首要的任务是要找到关键函数(也就是点击button触发的函数)。回想一下刚才我们出入错误时反馈的字符串"Inocrrcet Password",那我们其实只要找到调用字符串"Incorrcet Password"这个字符串的位置,就应该离关键函数不远了,而IDA为我们提供了调用明文字符串的的查找方法,回到汇编窗口(上面的IDA浏览标签)点击快捷键: A/t+t 会弹出一个文本查找窗口:
图5: IDA自带的文本搜索
输入,Incorrect Password,然后点确定,搜索结果如下:
图6: 搜索结果
搜索出两处,我们只用点开第一处就可以了:(因为第一处是在函数中调用的,第二处是在堆里,所以附近没有一般代码,更没有关键函数了)
图7: 调用“Incorrect Password!”的地方
于是我们找到了调用Incorrect Password的地方,看左边,调用了“Congratulation !!”字符串,意思是恭喜,那么我们就清楚了,输入错误的串弹窗就是“Incorrect Password”,输入正确的弹窗应该就是“Congratulation”了,点击F5,查看C语言代码会更清晰一些:
图8: 反编译后的代码
代码比较短,逻辑很容易懂,memset是个赋值的函数,它先把0x60(注意带0x是十六进制)长度的v3都赋值为0。然后把文本框里长度最多为100的字符串赋值给String所在的地址,由于String只是char类型,所以实际上输入的串会直接按顺序排,比方说输入的是123,那么String就是1,v3就是2,v4就是3。
__int16和 char类型差不多,也就是说这几个字符分别代表字符串中的:
变量 | String | v3 | v4 | v5 | v6 | v7 |
位置 | 0 | 1 | 2 | 3 | 4 | 5 |
也就是说String==69=='E',v3==97=='a',v4==a5y=="5y",v5==aR3versing=="R3versing"。
连起来,密码就是Ea5yR3versing,输入我们的答案,结果是正确的: