方法一:强行动调
开头下个断点一直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了!!
真不会,写不出来
本文主要介绍了如何通过强行动调和静态分析方法来处理加密的TEA算法代码。内容包括在代码中识别加密步骤,如使用密钥和混淆操作,以及通过动态调试技术如设置硬件断点和修改指令来去除混淆以便于分析。
1995

被折叠的 条评论
为什么被折叠?



