此题目与攻防世界re1相同
1.解题过程:
(1)
下载附件打开,输入测试
首先查壳
无壳(刚开始我以为是有壳,然后脱壳,发现没有壳,下图是我进行脱壳时的程序)
按照流程32位直接拖入IDA查看
shift+f12查找字符串,没有特别的东西
f5反汇编查看伪代码
(2)分析:
所以查看寄存器
其中有一段数据
按下a键转换为字符串
即为flag
(3)出现的问题
①在末尾转换字符串时使用r键会出现
00413E44 合并到了 00413E34 中,并且a键同时将字符串进行倒置处理
2.第二种方法
可以从栈入手分析(尝试中)
movq由于是传送数值并未做出改变
所以v5中的值未变的原因应该是
qword_413E44 寄存器数值接入了 xmmword_413E34 寄存器的数值
3.知识点:
(1)IDA常用快捷键:
f5:一键反汇编
shift+f12:可以打开string窗口,一键找出所有的字符串
a:将数据直接转化为字符串
(2)伪代码中涉及到的函数:
①strcmp():
C 库函数 int strcmp(const char *str1, const char *str2) 把 str1 所指向的字符串和 str2 所指向的字符串进行比较
如果 str1 小于 str2,则表示返回值 小于 0。
如果 str1 大于 str2,则表示返回值 大于 0。
如果 str1 等于 str2,则表示返回值 等于 0。
(3)涉及到的SSE指令:
①_mm_storeu_si128( __m128i *p, __m128i a);
作用:将__m128i 变量a的值存储到p所指定的变量中
②_mm_loadu_si128(__m128i *p);
作用:返回值代表寄存器的变量中的相同值
(4)汇编语言:
① CS(Code Segment):代码段寄存器;
DS(Data Segment) :数据段寄存器;
SS(Stack Segment):堆栈段寄存器;
ES(Extra Segment) :附加段寄存器。
②movqu xmm1, xmm2/m128
作用:将xmm2寄存器 或者 128位内存地址的内容拷贝到xmm1寄存器中
movq,传送指令