前言
把22年寒假的WP转移到blog上,这次是花指令专题的,原题链接在最底下。
JunkCode
先拖到die看看,是无壳pe32,拖到ida32打开,先找到main函数,发现main函数分析不出来
找到地址0x411810处的代码,出问题的代码如下
经过学习,这里有一段花指令,clc和jnb构成了跳转指令,紧跟着的指令很可能有垃圾数据,导致ida分析出错,用x32dbg打开找到这段指令
可以看出来正常程序是跳转到0x411832处,单步走,发现跳过6A的话程序结构就正常了
在ida里把6Apatch掉,改成90,重新分析代码,得到正确的main函数
这里的sub_411046即printf函数,最终会输出this is junk code
reverseMe
先用die打开,无壳pe32,用ida32打开,先找到main函数,发现函数很怪,直接跳转到下面一段代码就结束了,查看字符串也没收获,想要od调试也不行。
经过指导找到tls函数,经过学习知道tls函数里面有反调试。
查看tls函数,发现有几个函数都显示jumpout,并且tls函数和main函数一样出现了错误的返回值,找到之前函数jumpout的位置,基本都在main函数跳过的区间里,可以判断main函数里面藏了花指令,经过查找对比花指令应该是类似如下部分的
搜索找到类似的花指令patch掉,然后把之前未识别的函数创建出来,代码逻辑清晰了一些
在main函数原先跳转位置找到关键跳转代码
顺着跳转找到输出错误提示的函数sub_411A80,函数通过异或隐藏字符串信息
回到刚刚找到的跳转表,查看谁调用了它,发现另外一个跳转表
查看里面的函数,sub_415170是另一个关键函数,负责获得flag输入
里面的字符串也是用了异或来隐藏,其中有个疑似是判断flag的数组byte_41D1E0,猜想flag可能为8位,且需要与0x4D异或,查看引用这个数组的函数
其中sub_411E70应该是flag判断函数,打开看看发现只有前4位,查看汇编发现了retf指令,说明这个函数可能采用了32位和64位指令的混淆,猜测mov后面跟着的数据有64位长,即flag异或前为*+!,6(0**
编写代码如下可得flag
#include <stdio.h>
int main()
{
char flag[100] = "+!,*6(0";
for (int i = 0; i < 7; i++)
{
flag[i] = flag[i] ^ 0x4D;
printf("%c", flag[i]);
}
return 0;
}
得到flag为flag{e}
验证通过