淘先锋技术网

首页 1 2 3 4 5 6 7

0x01 题目

http://www.shiyanbar.com/ctf/49
拿到一个re1.exe。

打开运行之后:

re1.exe

随便输入一个”flag”:

re1

0x02 初步分析

惯例IDA PRO打开看,从函数里边有一个start开始分析,走了几步发现有点乱.
(对PE不太熟悉,还没有补PE的知识。。只是临时拿到这么一个题目直接做,所以一开始猜了一下start是入口,不知道对不对,我也没管。。就跟了一下)

start:

start

sub_4052B4:

sub_4052B4
并没有找到什么有意思的东西。

想到打开之后的提示,中文搜索我怕会有编码问题,于是搜DUTCTF好了,
IDA -> Search -> Text

搜索DUTCTF:
搜索dutctf

找到引用的位置,进入:
引用的位置

这里应该就是出现提示开始的逻辑了

0x03 分析提示处的逻辑

从函数看,每一次调用sub_40127B都先push一个字符串,这应该是一个输出的函数,而sub_4010D1,push了eax和一个字符串”%s”,push eax 之前的 lea eax, [ebp+var_24] 决定了其实是将ebp+var_24的地址压入栈内,然后将%s压入栈内,调用sub_4010D1。%s明显是一个占位符,这里应该是一个输入的函数,根据之前的“输入flag吧:”这个字符串也可以推断出来。那么这里输入的应该就是ebp+var_24这个位置了。

现在我们知道了[ebp+var_24]是我们输入的字符串的offset,然后根据ida的graph view,从”flag get”开始分析。

flag get
graph view
从含有”flag get”的字符串从下往上分析,在loc_40108D这里,如果test eax, eax的结果为0则跳到flag get,所以需要eax为0,loc_401088这里,or eax, 1所以eax一定不会为0,只能走loc_401084这条线,看到xor eax, eax就知道走对了,这句话的意思是把eax 清零(自己和自己异或得0)。再往上看,有两个都可以走到loc_401084,先看右边,需要dl为0,再向上看,需要dl和[eax+1]相等,而dl是[ecx+1],换句话说,[ecx+1]和[eax+1]相等才可以。另外一边,dl为0就可以了,如果dl不为0则需要[eax+1]和[ecx+1]相等。往上看loc_401068,是比较[ecx]和[eax],如果相等才能看dl是不是0,即[ecx]是不是0。

这一段的逻辑总结出来就是:
比较[ecx]和[eax],相等的话,如果[ecx]是0,则到”flag get”,否则还需要[ecx+1]和[eax+1]相等才到”flag get”

那么[ecx],[eax],[ecx+1],[eax+1]怎么得到呢?

提示处

回到输出提示处,最后的

lea eax, [ebp+var_24]
lea ecx, [ebp+var_44]

告诉我们eax就是[ebp+var_24]的地址,[eax]就是其值
ecx就是[ebp+var_44]的地址,[ecx]就是其值
[ebp+var_24]通过之前的分析我们知道,这是我们输入的字符串,
[ebp+var_44],高亮一下,
highlight var_44
可以看到是

movdqu xmm0, ds:xmmword_413E34movdqu [ebp+var_44], xmm0

这两句生成的。
也就是说,用来和我们输入的字符串比较的就是这个ds:xmmword_413E34了。

跳转到这个神秘的413E34,发现是一串数。

413E34

这串数什么意思?
就这么看,看来是看不出来了,但是做过ctf的应该对一段16进制的数字都有一定的感觉吧,感觉如果没有加密,那就是ASCII,UNICODE之类的。于是打开hex view
flag
这里就出现了flag啦