ISG 2014 逆向题分析

文章作者:Crack_Qs[4st][PDG]

使用工具:Vs 2013、ollydbg 1.10

测试平台:windows 7 x64

/////////////////////////////////////////////////////////////////////////////////////////////////////

验证CALL:

013C1050 /$ 55 PUSH EBP ; 验证CALL
013C1051 |. 8BEC MOV EBP, ESP
013C1053 |. 51 PUSH ECX
013C1054 |. C745 FC 00000>MOV DWORD PTR SS:[EBP-0x4], 0x0 ; 循环计数器清0
013C105B |. EB 09 JMP SHORT Test.013C1066
013C105D |> 8B45 FC /MOV EAX, DWORD PTR SS:[EBP-0x4]
013C1060 |. 83C0 01 |ADD EAX, 0x1
013C1063 |. 8945 FC |MOV DWORD PTR SS:[EBP-0x4], EAX
013C1066 |> 837D FC 07 CMP DWORD PTR SS:[EBP-0x4], 0x7 ; 循环比较7次
013C106A |. 73 3A |JNB SHORT Test.013C10A6
013C106C |. 6A 04 |PUSH 0x4 ; int nCount;
013C106E |. 8B4D FC |MOV ECX, DWORD PTR SS:[EBP-0x4]
013C1071 |. 8B55 0C |MOV EDX, DWORD PTR SS:[EBP+0xC]
013C1074 |. 8D048A |LEA EAX, DWORD PTR DS:[EDX+ECX*4]
013C1077 |. 50 |PUSH EAX
013C1078 |. E8 83FFFFFF |CALL Test.013C1000 ; void Encryption(char *pInputBuf,int nCount);
013C107D |. 83C4 08 |ADD ESP, 0x8
013C1080 |. 8B4D FC |MOV ECX, DWORD PTR SS:[EBP-0x4]
013C1083 |. 39048D 18303C>|CMP DWORD PTR DS:[ECX*4+0x13C3018],>
013C108A |. 74 18 |JE SHORT Test.013C10A4
013C108C |. 6A 00 |PUSH 0x0 ; /Style = MB_OK|MB_APPLMODAL
013C108E |. 68 E8203C01 |PUSH Test.013C20E8 ; |Title = "ISG 2014"
013C1093 |. 68 F4203C01 |PUSH Test.013C20F4 ; |Text = "Wrong"
013C1098 |. 8B55 08 |MOV EDX, DWORD PTR SS:[EBP+0x8] ; |
013C109B |. 52 |PUSH EDX ; |hOwner
013C109C |. FF15 BC203C01 |CALL NEAR DWORD PTR DS:[<&USER32.Mes>; \MessageBoxA
013C10A2 |. EB 18 |JMP SHORT Test.013C10BC
013C10A4 |>^ EB B7 \JMP SHORT Test.013C105D
013C10A6 |> 6A 00 PUSH 0x0 ; /Style = MB_OK|MB_APPLMODAL
013C10A8 |. 68 FC203C01 PUSH Test.013C20FC ; |Title = "ISG 2014"
013C10AD |. 68 08213C01 PUSH Test.013C2108 ; |Text = "Correct!!"
013C10B2 |. 8B45 08 MOV EAX, DWORD PTR SS:[EBP+0x8] ; |
013C10B5 |. 50 PUSH EAX ; |hOwner
013C10B6 |. FF15 BC203C01 CALL NEAR DWORD PTR DS:[<&USER32.Mess>; \MessageBoxA
013C10BC |> 8BE5 MOV ESP, EBP
013C10BE |. 5D POP EBP
013C10BF \. C3 RETN

算法CALL:

013C1000 /$ 55 PUSH EBP                                 void Encryption(char *pInputBuf,int nCount):
013C1001 |. 8BEC MOV EBP, ESP
013C1003 |. 83EC 0C SUB ESP, 0xC
013C1006 |. C745 F8 83000>MOV DWORD PTR SS:[EBP-0x8], 0x83 ; nNum = 0x83
013C100D |. C745 FC 00000>MOV DWORD PTR SS:[EBP-0x4], 0x0 ; nKey = 0
013C1014 |. C745 F4 00000>MOV DWORD PTR SS:[EBP-0xC], 0x0 ; int i 循环计数器
013C101B |. EB 09 JMP SHORT Test.013C1026
013C101D |> 8B45 F4 /MOV EAX, DWORD PTR SS:[EBP-0xC]
013C1020 |. 83C0 01 |ADD EAX, 0x1
013C1023 |. 8945 F4 |MOV DWORD PTR SS:[EBP-0xC], EAX
013C1026 |> 8B4D F4 MOV ECX, DWORD PTR SS:[EBP-0xC]
013C1029 |. 3B4D 0C |CMP ECX, DWORD PTR SS:[EBP+0xC]
013C102C |. 73 17 |JNB SHORT Test.013C1045
013C102E |. 8B55 FC |MOV EDX, DWORD PTR SS:[EBP-0x4]
013C1031 |. 0FAF55 F8 |IMUL EDX, DWORD PTR SS:[EBP-0x8] ; nKey * nNum
013C1035 |. 8B45 08 |MOV EAX, DWORD PTR SS:[EBP+0x8]
013C1038 |. 0345 F4 |ADD EAX, DWORD PTR SS:[EBP-0xC]
013C103B |. 0FB608 |MOVZX ECX, BYTE PTR DS:[EAX]
013C103E |. 03D1 |ADD EDX, ECX ; nKey * nNum + pInputBuf[i]
013C1040 |. 8955 FC |MOV DWORD PTR SS:[EBP-0x4], EDX ; nKey = nKey * nNum + pInputBuf[i];
013C1043 |.^ EB D8 \JMP SHORT Test.013C101D
013C1045 |> 8B45 FC MOV EAX, DWORD PTR SS:[EBP-0x4]
013C1048 |. 8BE5 MOV ESP, EBP
013C104A |. 5D POP EBP
013C104B \. C3 RETN

其加密算法逆向后得知:

void Encryption1(char *pInputBuf,int nCount)
{
    int nKey = 0;

for (int i = 0; i < nCount ; i++)
    {
    nKey = (0x83 * nKey) + pInputBuf[i];
    }
}

也就是说:

nKey = (0x83 * nKey ) + pInputBuf[0]

nKey = (0x83 * nKey ) + pInputBuf[1]

nKey = (0x83 * nKey ) + pInputBuf[2]

nKey = (0x83 * nKey ) + pInputBuf[3]

如此循环4次,计算完一次校验的值,那也就是说:

nKey == 0x83 * 0x83 * 0x83 * pInputBuf[1] + 0x83 * 0x83 * pInputBuf[1] + 0x83 * pInputBuf[2] + pInputBuf[3]

01361083 |. 39048D 183036>|CMP DWORD PTR DS:[ECX*4+0x1363018],>

data_0x1363018:

01363018 E5 AD 50 0D 89 27 30 0E 1F 6F D6 0E FF 63 D4 0C 瀛P.?0o?c?
01363028 DD 94 0D 0E 1F 46 A4 0F A2 1D D9 0C 輸.F???....

通过分析,知道该题是分为7次验证,验证的值为:0x0D50ADE5、0x0E302789、0x0ED66F1F、0x0CD463FF、0x0E0D94DD、0x0FA4461F、0x0CD91DA2

解密算法如下(以下代码肯定不是最优解):

void Decryption()
{
    int szKeyNum[] = {
    0x0D50ADE5,0x0E302789,0x0ED66F1F,0x0CD463FF,
    0x0E0D94DD,0x0FA4461F,0x0CD91DA2
    };
    char szBuf[40] = {0};

for (int i = 0,nCount = 0; i < 7; i++, nCount+= 4)
    {
        for (int nBuf1 = 0; nBuf1 < 127; nBuf1++)
        {
            for (int nBuf2 = 0; nBuf2 < 127; nBuf2++)
            {
                for (int nBuf3 = 0; nBuf3 < 127; nBuf3++)
                {
                    for (int nBuf4 = 0; nBuf4 < 127; nBuf4++)
                    {
                        if (szKeyNum[i] == 0x83 * 0x83 * 0x83 * nBuf1
                                                  +0x83 * 0x83 * nBuf2
                                                  +0x83 * nBuf3 + nBuf4)
                        {
                            szBuf[nCount+0] = nBuf1;
                            szBuf[nCount+1] = nBuf2;
                            szBuf[nCount+2] = nBuf3;
                            szBuf[nCount+3] = nBuf4;
                        }
                    }
                }
            }
        }
    }
    printf("Key:%s\r\n",szBuf);
}

程序输出 Key:c011isi0n_is_a_thre4t_t0_sec

CrackMe附件:

链接: http://pan.baidu.com/s/1o61CIq2 密码: xkmn

时间: 2024-08-10 20:08:45

ISG 2014 逆向题分析的相关文章

“金山杯2007逆向分析挑战赛”第一阶段第一题分析

题目来自于如下网址: http://www.pediy.com/kssd/ 第13篇 论坛活动 \ 金山杯2007逆向分析挑战赛 \ 第一阶段 \ 第一题 \ 题目 \ [第一阶段 第一题]: 现将此题目概述粘贴如下: CrackMe.exe 是一个简单的注册程序,见附件,请写一个注册机: 要求: 1. 注册机是KeyGen,不是内存注册机或文件Patch 2. 注册机可以使用ASM,VC,BC,VB,Delphi等语言书写,其他谢绝使用. 3. 注册机必须可以运行在Windows系统上. ..

OCJP(1Z0-851) 模拟题分析(八)

Exam : 1Z0-851 Java Standard Edition 6 Programmer Certified Professional Exam 以下分析全都是我自己分析或者参考网上的,定有疏漏,还请大家对我的分析提出质疑. QUESTION 235Given:5. class Payload {6. private int weight;7. public Payload (int w) { weight = w; }8. public void setWeight(int w) {

OCJP(1Z0-851) 模拟题分析(五)

Exam : 1Z0-851 Java Standard Edition 6 Programmer Certified Professional Exam 以下分析全都是我自己分析或者参考网上的,定有疏漏,还请大家对我的分析提出质疑. QUESTION 134 Given:11. class Snoochy {12. Boochy booch;13. public Snoochy() { booch = new Boochy(this); }14. }15.16. class Boochy {1

OCJP(1Z0-851) 模拟题分析(七)

Exam : 1Z0-851 Java Standard Edition 6 Programmer Certified Professional Exam 以下分析全都是我自己分析或者参考网上的,定有疏漏,还请大家对我的分析提出质疑. QUESTION 201 Given:1. public class TestString3 {2. public static void main(String[] args) {3. // insert code here5. System.out.print

OCJP(1Z0-851) 模拟题分析(三)

Exam : 1Z0-851 Java Standard Edition 6 Programmer Certified Professional Exam 以下分析全都是我自己分析或者参考网上的,定有疏漏,还请大家对我的分析提出质疑. QUESTION 61Given:1. public class TestString1 {2. public static void main(String[] args) { 3. String str = "420";4. str += 42;5.

OCJP(1Z0-851) 模拟题分析(九)

Exam : 1Z0-851 Java Standard Edition 6 Programmer Certified Professional Exam 以下分析全都是我自己分析或者参考网上的,定有疏漏,还请大家对我的分析提出质疑. QUESTION 261Given:3. class Employee {4. String name; double baseSalary;5. Employee(String name, double baseSalary) {6. this.name = n

OCJP(1Z0-851) 模拟题分析(六)

Exam : 1Z0-851 Java Standard Edition 6 Programmer Certified Professional Exam 以下分析全都是我自己分析或者参考网上的,定有疏漏,还请大家对我的分析提出质疑. QUESTION 167Given:1. import java.util.*;2. public class WrappedString {3. private String s;4. public WrappedString(String s) { this.

03 Hibernate错题分析

1.在Hibernate中,以下关于主键生成器说法错误的是( C). A.increment可以用于类型为long.short或byte的主键 B.identity用于如SQL Server.DB2.MySQL等支持标识列的数据库 C.sequence用于如Oracle.SQL Server等支持序列的数据库 D.native由Hibernate根据底层数据库自行判断采用何种主键生成策略,是由使用的数据库生成主键的值 解析:C .sequence不能用于SQL Server数据库 2.使用HQL

SCUT 2014 B题 Numbers (DFA有穷自动机)

题目链接:   SCUT 2014 题目大意:   判断给出的字符串中是否是正确的科学计数法 A+1.5Be+8C,可以是实数或者含有指数的实数,ABC三个部分表示空格,可有可无,正负号可有可无 指数部分只能是整数 解题思路:   建立有穷自动机状态转移表,一共是10种状态 -1表示无法不合法,最终状态为0 2 4 5 8 9五种状态均为合法,其余的都为非法 代码: #include <stdio.h> #include <stdlib.h> #include <string