前言:做题笔记。
下载 查壳。
upx32脱壳。
32ida打开。
先运行看看:
没有任何反应?
猜测又是 地址随机化(ASLR)---遇见过。
操作参考:
攻防世界---->Windows_Reverse1_dsvduyierqxvyjrthdfrtfregreg-CSDN博客
然后可以正常运行了。
ida分析:
main:
跟进 encode看看;
分析:
很妙啊~(兴奋,通过溢出取值,实现变量表( 奇->偶 ),)
看不明白直接看内存:(记得按a)
(这是一张表。)
通俗:
v8 = 表的偶数位
v10 = 表的奇数位
观察:算法比较独立,发现没有?
突破点:
因为它的计算与传入的 a1(input) 没有任何关联,所以值是可以进行计算的。
诺:
可以计算。
没必要去,硬 v6 v7的值 >>>v5>>>a1[i] ——没必要。。思路最重要。
正向求解简单很多。因为(v11 + v12) ^ 0x19 的值(已知)
爆破v5(input)就好了
完整代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
int i; // edx
char v5; // al
int v6; // esi
int v7; // edi
char v8; // al
int v9; // eax
char v10; // cl
int v11; // eax
int v12; // ecx
unsigned char table[100] = "2a49f69c38395cde96d6de96d6f4e025484954d6195448def6e2dad67786e21d5adae6";//表
unsigned char byte_4021A0[300] =// CMP的数组
{
99, 124, 119, 123, 242, 107, 111, 197, 48, 1,
103, 43, 254, 215, 171, 118, 202, 130, 201, 125,
250, 89, 71, 240, 173, 212, 162, 175, 156, 164,
114, 192, 183, 253, 147, 38, 54, 63, 247, 204,
52, 165, 229, 241, 113, 216, 49, 21, 4, 199,
35, 195, 24, 150, 5, 154, 7, 18, 128, 226,
235, 39, 178, 117, 9, 131, 44, 26, 27, 110,
90, 160, 82, 59, 214, 179, 41, 227, 47, 132,
83, 209, 0, 237, 32, 252, 177, 91, 106, 203,
190, 57, 74, 76, 88, 207, 208, 239, 170, 251,
67, 77, 51, 133, 69, 249, 2, 127, 80, 60,
159, 168, 81, 163, 64, 143, 146, 157, 56, 245,
188, 182, 218, 33, 16, 255, 243, 210, 205, 12,
19, 236, 95, 151, 68, 23, 196, 167, 126, 61,
100, 93, 25, 115, 96, 129, 79, 220, 34, 42,
144, 136, 70, 238, 184, 20, 222, 94, 11, 219,
224, 50, 58, 10, 73, 6, 36, 92, 194, 211,
172, 98, 145, 149, 228, 121, 231, 200, 55, 109,
141, 213, 78, 169, 108, 86, 244, 234, 101, 122,
174, 8, 186, 120, 37, 46, 28, 166, 180, 198,
232, 221, 116, 31, 75, 189, 139, 138, 112, 62,
181, 102, 72, 3, 246, 14, 97, 53, 87, 185,
134, 193, 29, 158, 225, 248, 152, 17, 105, 217,
142, 148, 155, 30, 135, 233, 206, 85, 40, 223,
140, 161, 137, 13, 191, 230, 66, 104, 65, 153,
45, 15, 176, 84, 187, 22
};
i = 0;//控制循环
while (1)
{
v8 = table[2 * i];
if (v8 < 48 || v8 > 57)
v9 = v8 - 87;
else
v9 = v8 - 48;
//对 表偶数位的加密
v10 = table[(2 * i) + 1];
v11 = 16 * v9;
if (v10 < 48 || v10 > 57)
v12 = v10 - 87;
else
v12 = v10 - 48;
//对 表奇数位的加密
/* (v11 + v12) ^ 0x19)无压力计算。。 */
for (int v5 = 0; v5 < 128; v5++)
{
//爆破v5的值
v6 = (v5 >> 4) % 16;
v7 = ((16 * v5) >> 4) % 16;
if (byte_4021A0[(16*v6+v7)] == ((v11 + v12) ^ 0x19))
{
printf("%c",v5);
break;
}
}
i++;
if (i >= 35) break;
}
printf("\n");
system("pause");
return 0;
}
flag{Th1s_1s_Simple_Rep1ac3_Enc0d3}
题外话:
地址随机化,并不影响你静态分析,只对动调影响,对于这题影响不大。
感觉,接触了其他方向,确实是有助于reverse学习的。。。