运行程序
32位ida打开,shift+f12查看运行时的中文,这里双击flag get字符串进入rdata段
![](https://upload-images.jianshu.io/upload_images/19589241-08f0a5544807607e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
双击后面的函数,进入text段,小的窗口视图里可以看见汇编代码调用函数的句子
![](https://upload-images.jianshu.io/upload_images/19589241-37896bf0cbf46955.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
右边的即是鼠标滑到函数上面出现的小窗口
tab键查看伪代码,v8是我们输入的,v4是需要相比较的,flag get最后的输出和v4有关
![](https://upload-images.jianshu.io/upload_images/19589241-c53b0a21f3878bc9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
观看通篇代码寻找可疑的点,或者叫做关键的地方
双击打开v4,发现
①在堆里的数据字符串变量名叫xmmword,那么v4是程序运行时加载进去的
②返回两个寄存器地址,那么猜测xmmword数据由两个变量组成
返回伪代码我们看到第12行,xmmword的数据通过xmmword_413E34传递(_mm_storeu_si128存储,v4代表所指示的变量xmmword)
第14行,qword_413E44所指示的地址刚好在xmmword里(_mm_storel_epi64存储,v5代表所指向的指针,指针指向的地址刚好在xmmword里)
所以v4内容由xmmword_413E34和qword_413E44组成
![](https://upload-images.jianshu.io/upload_images/19589241-bf9e74581461ebcc.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](https://upload-images.jianshu.io/upload_images/19589241-189432fc680f78d4.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
双击xmmword_413E34,按R将内容转换成字符串,因为cpu是小端存储,又align 4对齐,所以倒过来就是flag;DUCTF{We1c0met0DUTCTF}
![](https://upload-images.jianshu.io/upload_images/19589241-ff7a9b952e569603.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)