我的解题过程
-
下载后为一个exe程序,拖入exeinfo检查,发现无壳
Microsoft Visual C++ v.12 - 2013 ( E8 ) www.microsoft.com [ Win Vista ] [ Debug:02 ] Big sec. 1 .text , Not packed
-
首先运行该程序浏览大致功能,首先输出了一些字,提示输入flag,所以很难从程序本身获取信息。字符串“flag不太对呦,再试试呗,加油呦”是在校验之后打印的,可以用来快速定位关键函数。
-
将程序拖入OllyDbg中进行下一步分析,打开之后发现一开始就断在了call上,而不是常见的push ebp,一旦F8单步步过就会等待输入flag,所以核心函数一定在这个call里面。
-
此时长按F8,断在了00EB1423这个call上,所以F2下断点,Ctrl+F2重新调试,按F9到达断点,F7进入。
-
进入之后看到了一些之前输出到控制台的字符串,已经到了核心函数,直到0120105F 这个地址call了scanf函数获取输入字符串,之后紧跟的应该就是对flag的校验。
-
之后,在寄存器窗口看到了flag的真实地址,为DUTCTF{We1c0met0DUTCTF}
-
提交答案,正确
别人的解题过程
-
使用ida分析反汇编代码,发现为字符串比较,输入的字符串在v9,而另一个字符串是从xmmword_413E34复制过来的
int main(){ _mm_storeu_si128((__m128i *)&v5, _mm_loadu_si128((const __m128i *)&xmmword_413E34)); scanf("%s", &v9); v3 = strcmp((const char *)&v5, &v9); if(v3) printf("get"); }
-
查看该地址,为一长串十六进制,数据类型为xmmword多媒体操作数,点击R快捷键将其转为字符串后为0tem0c1eW{FTCTUD,因为小端存储所以顺序需要颠倒,但是仍然不够,紧接着还有一段十六进制,点击R快捷键转为字符串为}FTCTUD,拼接起来就是DUTCTF{We1c0met0DUTCTF},即正确答案
.rdata:00413E34 xmmword_413E34 xmmword 3074656D30633165577B465443545544h