欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

四川第三届信息安全大赛逆向破解题目分析

程序员文章站 2022-03-06 15:55:39
 前几日某些原因碰到2011年四川省第三届信息安全技术大赛的题目。题目为绿盟出的,做起来还可以的样子,有些题目也蛮有趣。 关于逆向破解部分题目,看了下网上貌似没有具体解决方案。今天...

 前几日某些原因碰到2011年四川省第三届信息安全技术大赛的题目。题目为绿盟出的,做起来还可以的样子,有些题目也蛮有趣。
关于逆向破解部分题目,看了下网上貌似没有具体解决方案。今天闲下来把心得分享下。
第一题:1分
Tags:寻码,.NET
如图1。
四川第三届信息安全大赛逆向破解题目分析

当时做题,想着第一关比然很简单,直接放到OD,可意外的是OD没有停下来。瞬间诧异,莫非有反调试?大脑第一时间否定这一想法。
PEID一查,恍然大悟Microsoft Visual C# / Basic .NET。DotNet编写的,难怪不能用OD调。
这样就丢进ILDasm里分析一下,找到Form1::Button1_Click过程:
.method private instance void Button1_Click(object sender,
class [mscorlib]System.EventArgs e) cil managed
{
// 代码大小 69 (0×45)
.maxstack 3
.locals init (string V_0)
IL_0000: ldarg.0
IL_0001: callvirt instance class [System.Windows.Forms]System.Windows.Forms.TextBox WindowsApplication1.Form1::get_TextBox1()
IL_0006: callvirt instance string [System.Windows.Forms]System.Windows.Forms.TextBox::get_Text()
IL_000b: call string [Microsoft.VisualBasic]Microsoft.VisualBasic.Strings::Trim(string)
IL_0010: stloc.0
IL_0011: ldloc.0
IL_0012: ldstr “zhimakaimen@2011″
IL_0017: ldc.i4.0
IL_0018: call int32 [Microsoft.VisualBasic]Microsoft.VisualBasic.CompilerServices.Operators::CompareString(string,
string,
bool)
……
} // end of method Form1::Button1_Click
关键部分如上,很快找到key:zhimakaimen@2011,ok,过一关。

第二题:3分
Tags:追码,分析流程
如图2,
四川第三届信息安全大赛逆向破解题目分析

要求得到用户名为hello的注册码作为Key提交。
这次比较正统了。C++编写,无壳无反调试。有字符串参考,故表示无压力。
字符串参考下断。单步F8跟踪就好。
如图3,
四川第三届信息安全大赛逆向破解题目分析

判断
00401053 . E8 78010000 call CrackMe1.004011D0
为关键Call,F7跟进分析。
00401265 |> /0FBE4434 08 /movsx eax, byte ptr ss:[esp+esi+8]
0040126A |. |0FAFC0 |imul eax, eax
0040126D |. |0FAFC6 |imul eax, esi
00401270 |. |03C6 |add eax, esi
00401272 |. |33D2 |xor edx, edx
00401274 |. |B9 42000000 |mov ecx, 42
00401279 |. |8D7C24 08 |lea edi, dword ptr ss:[esp+8]
0040127D |. |F7F1 |div ecx
0040127F |. |83C9 FF |or ecx, FFFFFFFF
00401282 |. |33C0 |xor eax, eax
00401284 |. |80C2 21 |add dl, 21
00401287 |. |885434 28 |mov byte ptr ss:[esp+esi+28], dl
0040128B |. |46 |inc esi
0040128C |. |F2:AE |repne scas byte ptr es:[edi]
0040128E |. |F7D1 |not ecx
00401290 |. |49 |dec ecx
00401291 |. |3BF1 |cmp esi, ecx
00401293 |.^\72 D0 \jb short CrackMe1.00401265
有兴趣可以分析一下上面代码,经过上面处理,用户名hello处理后为!GA0U
而后分析,注册码加前缀Happy@后得到真码“Happy@!GA0U”。
坑爹的地方出现了- -
提交Key果断直接提交Happy@!GA0U。却发现木有加分,后来知道,答案为用户名:注册码形式,即hello:Happy@!GA0U,晕倒。
孔子曰:审题很重要。

第三题:5分
TAG:算法,注册机,MD5+RC6
如图4,
四川第三届信息安全大赛逆向破解题目分析

传说压轴题目出现了。要求给出nsfocus的注册码。
因为涉及到MD5与RC6加密算法,所以比较烦人,后来了解当初比赛没一组提交此题答案。
无壳,但有所保护,可以无视。
运行起来,bp MessageBoxA下断点回溯可以一点一点找到关键代码。
首先判断
00401882 |. 83F9 20 cmp ecx, 20 ; 判断长度32位
00401885 |. 75 28 jnz short CrackMe2.004018AF
00401887 |. 33C9 xor ecx, ecx
00401889 |> 8A0411 /mov al, byte ptr ds:[ecx+edx]
0040188C |. 3C 30 |cmp al, 30 ; 与0比较
0040188E |. 7C 04 |jl short CrackMe2.00401894
00401890 |. 3C 39 |cmp al, 39 ; 与9比较
00401892 |. 7E 08 |jle short CrackMe2.0040189C
00401894 |> 3C 41 |cmp al, 41
00401896 |. 7C 0A |jl short CrackMe2.004018A2 ; 与A比较
00401898 |. 3C 46 |cmp al, 46
0040189A |. 7F 06 |jg short CrackMe2.004018A2 ; 与F比较
0040189C |> 41 |inc ecx
0040189D |. 83F9 20 |cmp ecx, 20
004018A0 |.^ 7C E7 \jl short CrackMe2.00401889
004018A2 |> 83F9 20 cmp ecx, 20 ; 这里正常
004018A5 |. 75 08 jnz short CrackMe2.004018AF
004018A7 |. B8 01000000 mov eax, 1
这里确定注册码为32位,且字符只可能为0-F。瞬间不淡定了,32位,很可能就出现MD5。而注册字符只可能是0-F。
接着分析。越分析越没头绪,越来越复杂。
到最后比较之处,如图5。
四川第三届信息安全大赛逆向破解题目分析

在数据窗口发现如下部分。
0012F664 35 47 82 5C 33 8C 85 77 9A 67 45 7A 6D 5C 16 47 5G俓3寘w歡Ezm\G
0012F674 F6 AD DD 6C 46 EB B6 44 BD A2 65 36 6E 8C A6 75 霏輑F攵D舰e6n對u
0012F684 B9 B7 DD 1C 42 1E 00 5B C9 A7 F7 0B 84 8E 3D 0E 狗?B.[骚?剮=
其中B9B7DD1C421E005BC9A7F70B848E3D0E是nsfocus的MD5值。
F6ADDD6C46EBB644BDA265366E8CA675是个人输入的注册码[这里为展示输入为正确注册码]。
而上面一串3547825C338C85779A67457A6D5C1647瞬间让我不淡定了。
也就是说,CrackMe判断方式为Eecode(Key)=MD5(Name)。
加密算法只用到0-F,且可能有自身的密钥串3547825C338C85779A67457A6D5C1647。猜想可能用到RC6加密算法。
因为有一种方式为RC6Decrypt(MD5(Name))=Key。也算是偶尔查到看雪的一个帖子。
这样用RC6解密试一下,如图6,
四川第三届信息安全大赛逆向破解题目分析

密钥串果然是3547825C338C85779A67457A6D5C1647
好吧,周折之下总算得到Key:nsfocus:F6ADDD6C46EBB644BDA265366E8CA675

总结:
其实也没什么好总结的
第一关考察DotNet的基础知识及基础的找码知识。
第二关是一个普通程序的追码测试。
第三关则涉及到反调试与密码学知识。