一道简单的ctf 分析

  • 前言

ReverseMe来自https://www.52pojie.cn/thread-816369-1-1.html

今天晚自习闲来无事,发现haoj好久没有玩过有意思的CM了,在吾爱发现了一个有意思的CM

  • 开始工作

准备工具:Ollydbg,Exeinfope,解压工具

Ollydbg载入

字符串定位关键算法

00B91059    2BCA            sub ecx,edx
00B9105B    83F9 12         cmp ecx,0x12
00B9105E    74 15           je short gift.00B91075
00B91060    68 1C21B900     push gift.00B9211C                       ; 长度错误\n
00B91065    E8 16010000     call gift.00B91180
00B9106A    83C4 04         add esp,0x4
00B9106D    6A 00           push 0x0
00B9106F    FF15 7820B900   call dword ptr ds:[<&api-ms-win-crt-runt>; ucrtbase.exit
00B91075    56              push esi
00B91076    33C9            xor ecx,ecx
00B91078    BE 0B000000     mov esi,0xB
00B9107D    0F1F            ???                                      ; 未知命令
00B9107F    008B C199F7FE   add byte ptr ds:[ebx+0xFEF799C1],cl
00B91085    8A82 F820B900   mov al,byte ptr ds:[edx+0xB920F8]        ; h3ll0_w0rld
00B9108B    32840D FCFEFFFF xor al,byte ptr ss:[ebp+ecx-0x104]
00B91092    F6D0            not al
00B91094    3285 0CFFFFFF   xor al,byte ptr ss:[ebp-0xF4]
00B9109A    3285 0DFFFFFF   xor al,byte ptr ss:[ebp-0xF3]
00B910A0    88840D FCFEFFFF mov byte ptr ss:[ebp+ecx-0x104],al
00B910A7    41              inc ecx
00B910A8    83F9 10         cmp ecx,0x10
00B910AB  ^ 7C D3           jl short gift.00B91080
00B910AD    B9 1830B900     mov ecx,gift.00B93018
00B910B2    8D95 FCFEFFFF   lea edx,dword ptr ss:[ebp-0x104]
00B910B8    BE 0C000000     mov esi,0xC
00B910BD    0F1F            ???                                      ; 未知命令
00B910BF    008B 013B0275   add byte ptr ds:[ebx+0x75023B01],cl
00B910C5    2F              das
00B910C6    83C1 04         add ecx,0x4
00B910C9    83C2 04         add edx,0x4
00B910CC    83EE 04         sub esi,0x4
00B910CF  ^ 73 EF           jnb short gift.00B910C0
00B910D1    0FBE8D 0CFFFFFF movsx ecx,byte ptr ss:[ebp-0xF4]
00B910D8    0FBE95 0DFFFFFF movsx edx,byte ptr ss:[ebp-0xF3]
00B910DF    8BC1            mov eax,ecx
00B910E1    2BC2            sub eax,edx
00B910E3    83F8 04         cmp eax,0x4
00B910E6    75 0D           jnz short gift.00B910F5
00B910E8    8D040A          lea eax,dword ptr ds:[edx+ecx]
00B910EB    83F8 6A         cmp eax,0x6A
00B910EE    B8 2821B900     mov eax,gift.00B92128                    ; 压缩包密码正确!等等,压缩包在哪里呢?\n
00B910F3    74 05           je short gift.00B910FA
00B910F5    B8 5021B900     mov eax,gift.00B92150                    ; 密码错误\n
00B910FA    50              push eax
00B910FB    E8 80000000     call gift.00B91180
00B91100    8B4D FC         mov ecx,dword ptr ss:[ebp-0x4]
  • 代码分析
00B910D1    0FBE8D 0CFFFFFF movsx ecx,byte ptr ss:[ebp-0xF4]
00B910D8    0FBE95 0DFFFFFF movsx edx,byte ptr ss:[ebp-0xF3]
00B910DF    8BC1            mov eax,ecx
00B910E1    2BC2            sub eax,edx
00B910E3    83F8 04         cmp eax,0x4
00B910E6    75 0D           jnz short gift.00B910F5
00B910E8    8D040A          lea eax,dword ptr ds:[edx+ecx]
00B910EB    83F8 6A         cmp eax,0x6A
00B910EE    B8 2821B900     mov eax,gift.00B92128                    ; 压缩包密码正确!等等,压缩包在哪里呢?\n
00B910F3    74 05           je short gift.00B910FA
00B910F5    B8 5021B900     mov eax,gift.00B92150                    ; 密码错误\n

可得知注册码后两位的关系

a-b=4

a+b=106

我们可以轻易解出

b=51
a=55

可知最后两位为"73"

 

00B91080    8BC1            mov eax,ecx
00B91082    99              cdq
00B91083    F7FE            idiv esi
00B91085    8A82 F820B900   mov al,byte ptr ds:[edx+0xB920F8]        ; h3ll0_w0rld
00B9108B    32840D FCFEFFFF xor al,byte ptr ss:[ebp+ecx-0x104]
00B91092    F6D0            not al
00B91094    3285 0CFFFFFF   xor al,byte ptr ss:[ebp-0xF4]
00B9109A    3285 0DFFFFFF   xor al,byte ptr ss:[ebp-0xF3]
00B910A0    88840D FCFEFFFF mov byte ptr ss:[ebp+ecx-0x104],al
00B910A7    41              inc ecx
00B910A8    83F9 10         cmp ecx,0x10
00B910AB  ^ 7C D3           jl short gift.00B91080

 

Key每位,"h3ll0_w0rld",注册码后两位 xor not xor 得到的数据为

 0xa4, 0x8a, 0xae, 0xa7, 0xfb, 0x93, 0xba, 0x88, 0xbd, 0xd2, 0xda, 0xa1, 0xff, 0xaf, 0xd2, 0xfd, 0x00

因此我们将他的数据解密即可得到正确的Key

下面给出C代码

int main()
{
	byte data[] =
	{
		0xa4, 0x8a, 0xae, 0xa7, 0xfb, 0x93, 0xba, 0x88, 0xbd, 0xd2, 0xda, 0xa1, 0xff, 0xaf, 0xd2, 0xfd, 0x00
	};
	char table[] = "h3ll0_w0rldh3ll0";
	
	for (int i = 0; i < 16; i++) {
		data[i] = data[i] ^ 0x33;
		data[i] = data[i] ^ 0x37;
		data[i] = ~data[i];
		data[i] = data[i] ^ table[i];
	}
	printf("%s\n", data);
	system("pause");
    return 0;
}

求出Key为 7B90076C4EE278E673

密码正确,收工.

一道简单的ctf 分析_第1张图片

你可能感兴趣的:(软件逆向)