Windows Reverse1
a windows reverse
本程序有upx壳,拿工具直接脱掉,在做本程序时遇到了一些问题,在这里记录一下
Analysis
Let’s see it
其实本题就是麻烦,必须用好多flag碎片拼凑,我在第一处和第三处遇到了问题,直接贴出来,其中第三处的base64我愣是看不出来,最后通过peid小插件才发现是,(我真是。。
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全成立
.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进制数
.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撸汇编
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了