-
-
[原创]CTF2018-第二题-半加器
-
发表于: 2018-12-4 17:06 3055
-
一、分析工具
IDA、OD
二、分析过程
1、双击运行,发现有个输入序列号的提示: "Please Input:"
2、打开IDA,把exe拖进去shift+F12查看字符串,根据字符串的交叉引用定位到提示输入系列号的地址在:0x004A19D8
.text:004A19D8 push offset aPleaseInput ; "Please Input:" .text:004A19DD push offset unk_5F31E0 .text:004A19E2 call sub_48CD46 .text:004A19E7 add esp, 8 .text:004A19EA push 1Eh .text:004A19EC push offset unk_5F3068 .text:004A19F1 push offset aS ; "%s" .text:004A19F6 call sub_48C0EE .text:004A19FB add esp, 0Ch .text:004A19FE push offset unk_5F3068 .text:004A1A03 call j_strlen_ .text:004A1A08 add esp, 4 .text:004A1A0B mov [ebp+var_8], eax .text:004A1A0E cmp [ebp+var_8], 1Eh .text:004A1A12 jg short loc_4A1A1A;序列号的长度大于0x1E,输入错误 .text:004A1A14 cmp [ebp+var_8], 0Ah .text:004A1A18 jge short loc_4A1A30;序列号的长度大于等于0x0A,继续
.text:004A19D8 push offset aPleaseInput ; "Please Input:" .text:004A19DD push offset unk_5F31E0 .text:004A19E2 call sub_48CD46 .text:004A19E7 add esp, 8 .text:004A19EA push 1Eh .text:004A19EC push offset unk_5F3068 .text:004A19F1 push offset aS ; "%s" .text:004A19F6 call sub_48C0EE .text:004A19FB add esp, 0Ch .text:004A19FE push offset unk_5F3068 .text:004A1A03 call j_strlen_ .text:004A1A08 add esp, 4 .text:004A1A0B mov [ebp+var_8], eax .text:004A1A0E cmp [ebp+var_8], 1Eh .text:004A1A12 jg short loc_4A1A1A;序列号的长度大于0x1E,输入错误 .text:004A1A14 cmp [ebp+var_8], 0Ah .text:004A1A18 jge short loc_4A1A30;序列号的长度大于等于0x0A,继续
3、根据第二步的长度判断,符合长度限定之后来到地址:0x4A1A30,并找到序列号生成算法的函数在sub_48D3A4
.text:004A1A30 loc_4A1A30: ; CODE XREF: main+68j .text:004A1A30 push offset unk_5F3068 .text:004A1A35 push 1Eh .text:004A1A37 mov eax, dword_5F3088 .text:004A1A3C push eax .text:004A1A3D call sub_48E5BF;拷贝序列号到地址0x5F3068 .text:004A1A42 add esp, 0Ch .text:004A1A45 mov eax, 1 .text:004A1A4A imul ecx, eax, 7 .text:004A1A4D mov edx, dword_5F3088 .text:004A1A53 movsx eax, byte ptr [edx+ecx] .text:004A1A57 cmp eax, 41h .text:004A1A5A jz short loc_4A1A70;判断序号的第8位是不是'A',如果不是则失败 .text:004A1A5C push offset unk_5B25CC .text:004A1A61 call sub_48A6DB .text:004A1A66 add esp, 4 .text:004A1A69 push 0 .text:004A1A6B call sub_48C274 .text:004A1A70 .text:004A1A70 loc_4A1A70: ; CODE XREF: main+AAj .text:004A1A70 mov eax, dword_5F3088 .text:004A1A75 push eax .text:004A1A76 call sub_48D3A4;序列号生成算法 .text:004A1A7B add esp, 4 .text:004A1A7E .text:004A1A7E loc_4A1A7E: ; CODE XREF: main+7Ej .text:004A1A7E xor eax, eax
.text:004A1A30 loc_4A1A30: ; CODE XREF: main+68j .text:004A1A30 push offset unk_5F3068 .text:004A1A35 push 1Eh .text:004A1A37 mov eax, dword_5F3088 .text:004A1A3C push eax .text:004A1A3D call sub_48E5BF;拷贝序列号到地址0x5F3068 .text:004A1A42 add esp, 0Ch .text:004A1A45 mov eax, 1 .text:004A1A4A imul ecx, eax, 7 .text:004A1A4D mov edx, dword_5F3088 .text:004A1A53 movsx eax, byte ptr [edx+ecx] .text:004A1A57 cmp eax, 41h .text:004A1A5A jz short loc_4A1A70;判断序号的第8位是不是'A',如果不是则失败 .text:004A1A5C push offset unk_5B25CC .text:004A1A61 call sub_48A6DB .text:004A1A66 add esp, 4 .text:004A1A69 push 0 .text:004A1A6B call sub_48C274 .text:004A1A70 .text:004A1A70 loc_4A1A70: ; CODE XREF: main+AAj .text:004A1A70 mov eax, dword_5F3088 .text:004A1A75 push eax .text:004A1A76 call sub_48D3A4;序列号生成算法 .text:004A1A7B add esp, 4 .text:004A1A7E .text:004A1A7E loc_4A1A7E: ; CODE XREF: main+7Ej .text:004A1A7E xor eax, eax
4、分析序列号生成算法 :
sub_48D3A4 ,这个算法分两个步骤
1)、把序列号的第8位‘A’替换成'#'
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2018-12-4 20:46
被MTRush编辑
,原因:
赞赏
他的文章
看原图
赞赏
雪币:
留言: