方法一:强行动调
开头下个断点一直F8
走到这里发现字符串
这里发现输出
这里有个分支,应该要加密判断
似乎在验证长度
该标志位走到左边去
被混淆的TEA,魔改加了个0x33
unk_223004
是密文,四个dword
是密钥,进行还原
密文convert成32位
密钥也是提出来
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
unsigned int enc[] =
{
0x31363010, 0xAD938623, 0x8492D4C5, 0x7567E366, 0xC786696B,
0xA0092E31, 0xDB695733, 0xDD13A893, 0x88D8A53E, 0x7E845437
};
unsigned int key[4] =
{
0x67626463, 0x696D616E, 0x79645F65, 0x6B696C69
};
int i, j;
for (i = 0; i < 10; i += 2)
{
unsigned int v0 = enc[i], v1 = enc[i + 1], sum = 0xC6EF3720;
unsigned int delta = 0x9e3779b9;
unsigned int k0 = key[0], k1 = key[1], k2 = key[2], k3 = key[3];
for (j = 0; j < 32; j++)
{
v1 -= ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3) ^ 0x33;
v0 -= ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1) ^ 0x33;
sum -= delta;
}
enc[i] = v0; enc[i + 1] = v1;
}
printf("%s", enc);
return 0;
}
变量的数据类型注意一下,密文别写成char类型的
方法二:静态分析去混淆
**处理思路**:在输入位置下断点找到输入的地址,再在输入的地址上下硬件断点,运行断下来后就可以找到处理flag的位置了
**动态去除混淆的方法**:单步调试时如果ret运行到下一个地址就改为nop,call $+0,同样改为nop,如果ret是跳转到远处的地址就改为jmp +地址,这样以后就可以f5了!!
真不会,写不出来