啊呀,第一次写writeup!!!一个小尝试!
本道题针对于xctf攻防世界的新手逆向题re1
首先,我们把附件下载下来,发现是一个可执行程序。呃,其实最开始是要查有没有壳的,但是把这个拖入IDA后,发现可以找到main函数,也就知道它没有壳啦,不过谨慎点,可以用PEID来进行有无壳的判断。
先直接运行一下下载来的可执行文件,发现
然后,拖入IDA(32)后,F5反编译找到main主体函数
在这里,我们可以大概看一下主程序的执行过程,一开始看到这个main里的内容的时候,其实脑子一片空白,后来使用Shift+F12查看字符串
发现有个关键字flag get,于是我们点进去
就可以知道执行到unk_413E90处,那么flag就获得成功啦,再去看下主函数,发现,只要后一个if里v3=0,就可以啦
然后再继续往上想,v3怎样才能=0呢,我们来仔细分析下过程(把源码放这啦)
*************************************************************************************************************
_mm_storeu_si128((__m128i *)&v5, _mm_loadu_si128((const __m128i *)&xmmword_413E34));
v7 = 0;
v6 = qword_413E44;
v8 = 0;
printf(&byte_413E4C);
printf(&byte_413E60);
printf(&byte_413E80);
scanf("%s", &v9);
v3 = strcmp((const char *)&v5, &v9);
if ( v3 )
v3 = -(v3 < 0) | 1;
if ( v3 )
printf(aFlag);
else
printf((const char *)&unk_413E90);
*************************************************************************************************************
在这里出现了_mm_storeu_si128()与 _mm_loadu_si128()
前者的函数原型:void _mm_store_si128 ( __m128i *p, __m128i a);
功能就是把__m128i 变量a的值存储到p所指定的变量中去;
后者的函数原型:
__m128i _mm_loadu_si128(__128i *p)
功能就是返回P变量中的值
所以_mm_storeu_si128((__m128i *)&v5, _mm_loadu_si128((const __m128i *)&xmmword_413E34))指令就是把xmmword_413E34的值赋给v5
之后,我们要特别注意‘|’这个二进制按位操作符,也就是说进行或运算,但由于v3 = -(v3 < 0) | 1 ,故只要v3=strcmp((const char *)&v5, &v9)的值不是0,那么无论v3是否小于0大于0,进行或运算的结果都不会是0,因此,可以直接忽略这个,于是我们就知道了,只要字符串v5和我们输入的字符串v9完全相同,那么就会有printf((const char *)&unk_413E90);,故我们就知道flag其实也就是字符串v5。
进去xmmword_413E34
我们可以发现xmmword的值就是3074656D30633165577B465443545544h(h代表是用16进制表示),然而其实它的值还不是这个,放入16进制转ASCII,发现得到0tem0c1eW{FTCTUD,呀,这个一看就很奇怪,发现它倒着读DUTCTF{We1c0met0还差不多,不过确实是这样的,因为涉及到了大小端顺序的转换,呃,为什么会有大端小端的问题,我其实也不大懂,我只知道网络字节序是大端(高位字节排放在内存低地址端,低位字节排放在内存高地址端),主机字节序是小端(与大端相反)。
一开始我以为输入这个,flag 就会出现,后来我发现我错了,还是显示错误,之后,我又尝试了许久,发现,我漏掉了qword_413E44 dq 7D465443545544h !!! 把它再进行转换后,}FTCTUD,反过来也就是DUTCTF},啊啊啊,这才看着像答案!!!
然后我们把DUTCTF{We1c0met0DUTCTF}放入可执行文件试试
Oh!!!我的天哪,看来它就是我们心心念念的flag啦
提交flag 后,我看了其他人写的writeup ,发现有一个好有用的小技巧哦!
那就是:
在相应16进制数处按R键可以自动转化为字符,有了它,就不用去在线转字符啦
还有就是用记事本打开的话,就直接能找到flag,噢,如此简单直接。这道题自己花了一个多小时做出来,虽然它好像很简单,但我,好开心!!!!!!!!!!!!!因为这是自己第一次独立解出的逆向题!!!!!
这道题还能用OllyDebug来解,步骤更简单,当然,我是看了大佬的writeup啦
第一次写writeup ,多多包涵,肯定有解释有误的地方或者是不到位的地方,希望谅解!!!如有不正确的地方,也欢迎指出!!!