Windows Reverse1
a windows reverse
本程序有upx壳,拿工具直接脱掉,程序较为简单,只是一个索引表转换,我们具体分析一下转换函数
Analysis
Let’s see it
unsigned int __cdecl sub_401000(const char *a1)
{
_BYTE *v1; // ecx
unsigned int v2; // edi
unsigned int result; // eax
int v4; // ebx
v2 = 0;
result = strlen(a1);
if ( result )
{
v4 = a1 - v1;
do
{
*v1 = byte_402FF8[(char)v1[v4]];
++v2;
++v1;
result = strlen(a1);
}
while ( v2 < result );
}
return result;
}
我们看到byte_402FF8
便是表的首地址
00402FF0 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ????????????????
00403000 4E E6 40 BB B1 19 BF 44 FF FF FF FF FF FF FF FF N鍬 槐 .緿 ........
00403010 FE FF FF FF 01 00 00 00 7E 7D 7C 7B 7A 79 78 77 ........~}|{zyxw
00403020 76 75 74 73 72 71 70 6F 6E 6D 6C 6B 6A 69 68 67 vutsrqponmlkjihg
00403030 66 65 64 63 62 61 60 5F 5E 5D 5C 5B 5A 59 58 57 fedcba`_^]\[ZYXW
00403040 56 55 54 53 52 51 50 4F 4E 4D 4C 4B 4A 49 48 47 VUTSRQPONMLKJIHG
00403050 46 45 44 43 42 41 40 3F 3E 3D 3C 3B 3A 39 38 37 FEDCBA@?>=<;:987
00403060 36 35 34 33 32 31 30 2F 2E 2D 2C 2B 2A 29 28 27 6543210/.-,+*)('
00403070 26 25 24 23 22 21 20 00 00 00 00 00 00 00 00 00 &%$#"! .........
分析一下循环
do
{
*v1 = byte_402FF8[(char)v1[v4]];
++v2;
++v1;
result = strlen(a1);
}
while ( v2 < result );
我们举例加以说明,例如我将Z输入,在循环中会索引找到Z的位置,之后得到一个数字即为距离byte_402FF8
的偏移,得到90,即为D的ASCII码,根据输入将得到的字符串和 DDCTF{reverseME}
进行比较,相同即为flag
现在来看本题关键即为索引表函数的逆向,算是一个较为基础的逆向