Reverse1 逆向题

Windows Reverse1

a windows reverse

本程序有upx壳,拿工具直接脱掉,在做本程序时遇到了一些问题,在这里记录一下

Analysis

Let’s see it

其实本题就是麻烦,必须用好多flag碎片拼凑,我在第一处和第三处遇到了问题,直接贴出来,其中第三处的base64我愣是看不出来,最后通过peid小插件才发现是,(我真是。。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
if ( strlen(input) == 29 )
{
if ( input[28] == 125 )
{
v7 = 0;
v4 = input;
v5 = 8;
do
{
if ( (*v4 ^ dword_40803C[&v4[3 - input] % 8]) == v4[aMwwCTw - input] )
++v7;
++v4;
--v5;
}
while ( v5 );
if ( v7 == 8 )
sub_401170(input);
else
sub_4012E0(aHereIsGxnnctf);
result = 0;
}
else
{
sub_4012E0(aUnlikeFlag);
result = 0;
}
}

这个if语句贼奇怪,根本看不懂,后来动态调试的时候了然了,我们要做的便是让v7为8,这样必须让if全成立

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
.data:0040803C word_40803C     dw 14h                  ; DATA XREF: _main+7B↑r
.data:0040803E db 0
.data:0040803F db 0
.data:00408040 dw 12h
.data:00408042 db 0
.data:00408043 db 0
.data:00408044 dw 0Ch
.data:00408046 db 0
.data:00408047 db 0
.data:00408048 dw 0Ah
.data:0040804A db 0
.data:0040804B db 0
.data:0040804C dw 0Fh
.data:0040804E db 0
.data:0040804F db 0
.data:00408050 dw 19h
.data:00408052 db 0
.data:00408053 db 0
.data:00408054 dw 31h
.data:00408056 db 0
.data:00408057 db 0

dword_40803C处的几个16进制数

1
2
3
4
5
6
7
8
9
10
.data:00408030 byte_408030     db 6Dh                  ; DATA XREF: _main+4E↑o
.data:00408031 db 77h ; w
.data:00408032 db 77h ; w
.data:00408033 db 5Fh ; _
.data:00408034 db 63h ; c
.data:00408035 db 60h ; `
.data:00408036 db 74h ; t
.data:00408037 db 77h ; w
.data:00408038 db 0
.data:00408039 align 4

byte_408030处的字符

我们直接动态跑一下,毕竟还搞不清为啥是dword,直接上od撸汇编

1
2
3
4
5
6
7
00401268  |> \0FBE28        |movsx ebp,byte ptr ds:[eax]
0040126B |. 8B1C9D 3C8040>|mov ebx,dword ptr ds:[ebx*4+0x40803C]
00401272 |. 33DD |xor ebx,ebp
00401274 |. 0FBE2C02 |movsx ebp,byte ptr ds:[edx+eax]
00401278 |. 3BDD |cmp ebx,ebp
0040127A |. 75 04 |jnz short SMC.00401280
0040127C |. FF4424 10 |inc dword ptr ss:[esp+0x10]

关键代码如上,我们可以看到,在ebp处是我们的输入,程序把某些字符(ds:[ebx*4+0x40803C])取出放入ebx中,然后两者异或又与某些数(ds:[edx+eax])比较

这么看直接每次按f8把得到的字符搞出来就行,但是我们看看ida到底是怎么想的(手动滑稽

我不太清楚为什么ida把dword_40803C认成dw?应该是dd才对,很奇怪,还有发现它控制%8的时候思路很清奇,是利用与0x80000007进行and运算,感觉很强,所以我们何止直接导出来ida的值也可以跑

Summary

Assembly language is the best

这几天通过看各种题终于发现汇编才是王道,真的不能太依赖ida了