0x00 序言

去年玩了几个月的渗透測试,当初认为非常高端的样子。如今看来只是都是些小把戏,于是開始折腾逆向project。

学习过程中參考的是《逆向project核心原理》这本书。讲的非常具体。依照上面的步骤破解了几个crackme。然后自己在网上找了一些程序来玩,第一次独立成功破解Afkayas.1,有点兴奋,于是将破解过程记录下来,算是一个开启逆向project大门的里程碑吧。

0x01 准备

玩逆向project须要至少一个调试工具。这里我推荐OllyDbg。还须要一些小程序,能够利用已有的 CrackMe 小程序。

0x02 初次执行

拿到程序后,首先执行,看看有什么特征:

这个是典型的字符串序列破解程序,依据name的值推出serial。

我们尝试输入:

一个非常明显的特征就是点击 OK button后。程序会弹框,并且会显示特征字符串。

0x03 開始调试

我们打开 OllyDbg,载入程序后大致是这样:

1、查询特征字符串

依据上面的弹框能够猜測,假设serial输入正确。则会提示成功的信息;上面我们获得了失败时的字符串。按例如以下步骤在代码段中查找:

首先右键代码区,”Search for” => “All referenced text strings”

在新的对话框中找到失败的提示字符串:

双击当中一个。回到代码区,能够看到凝视中出现了失败和成功时的字符串:

2、条件推断

我们发现成功和失败时的字符串相隔不远。能够初步断定程序会在这之前进行推断,假设输入的serial正确则成功,否则失败;接着我们向上看,发现调用字符串比較函数的入口点:

3、參数传递

我们知道调用一个函数时须要给它传递适当的參数。汇编调用函数之前会先把參数入栈,然后用 call 指令调用函数。我们发如今字符串比較函数之前有一句 PUSH EAX 指令,能够猜測这里的 EAX 就是字符串的首地址。

4、找出真正的 serial

我们在字符串比較函数这条指令前设置断点(按 F2)。然后执行(按 F9)。注意中间会弹出程序主界面,我们须要输入然后点击 OK button:

这时程序停在了我们设置断点的地方,查看栈区(右下角)。能够发现栈顶处就是真正的 serial 的地址。凝视已经标明了 serial:

接着我们打开原程序,输入 name 和 serial:

发现已经成功破解。

以下我们进一步查找真正的原因。

0x04 破解加密方式

以上我们已经成功破解了 serial,可是并不知道怎样从 name 得到 serial。以下我们将具体讲述。

1、函数的起点

每一个函数都有起始点,在 IA32 架构下,函数都有自己的栈帧,所以首先会创建自己的帧:

PUSH EBP        ;保存调用者的帧指针
MOV EBP, ESP ;创建自己的帧
SUB ESP, 0C ;分配局部存储空间

我们单击 OK button时会调用函数来读取 name,加密 name 得到 serial,比較 serial等操作,所以我们首先要找到该函数的起点:

从刚才的字符串比較函数处往上找能够看到:

2、获取 name

我们应该明确的一点是。单击button后。程序首先会获得 name 字符串,从而生成 serial,所以我们以下须要找到 name 字符串的位置:

单步执行(按 F8),到程序调用 strlen 之前。我们在栈顶发现了输入的 name:

3、发现可疑目标

得到name后,紧接着就是得到 serial,往下看。我们发现了一些可疑的函数,都加上断点(按 F2):

4、锁定目标

我们直接执行(按 F9)。发现三个可疑函数并没有什么特别的。当执行到之前的字符串比較函数处时突然冒出正确的 serial,往上看发现了 serial 中的 “AKA-“:

这部分就是直接拼接上去的,所以能够断定 serial 的其余部分就在那几个可疑函数产生的,于是我们继续执行。又一次输入 name。执行到最后一个可疑函数处。按 F7 进入函数:

按 F8 单步执行指令,到以下会跳转:

跳转之后:

这里把跳转点加上断点。然后继续 F8 单步执行:

执行到第二个 call 指令时寄存器中出现了 serial:

这条指令的前一条指令是:

LEA ECX,[EBP-1C]

能够猜測是跳转后的第一个 call 指令调用的函数计算出的 serial,于是我们 F7 进去看看:

重复的 F7 我们发现有一个循环:

这段指令非常有趣,它把 ECX 中的值存入 EAX。然后不断的用 EAX 除 10(十六进制 0xA)。得到的商放在 EAX 中,余数移到 EDI 指向的内存缓冲区中;实际上就是把 ECX 转化成十进制字符串。

我们发现 serial 来源于 ECX。记录下其值(000D6504)。我们往前找 ECX。

5、逆向分析

F9 执行究竟,又一次输入 name,继续执行到断点处(第三个可疑函数),发现 EDI 已经改动为 000D6504。于是我们跟踪 EDI:

细致观察附近的指令,发现有非常多针对 EDI 的。于是我们又一次回到三个可疑函数的第一个以下開始单步执行:

结果是非常令人兴奋的: EDI = strlen(name) * 0x17CFB;

算出来是 000D64D3,和 000D6504 差了 0x31,继续 F8 单步:

看见了吗。第二个可疑函数返回了 0x31。于是我们仅仅须要搞清楚这个 0x31 究竟是怎么回事即可了。继续跟踪第二个可疑函数:

F7 进入后。F8 单步。命中目标:

调用系统函数之后,出现了MOVZX AX,BYTE PTR [EBP-2]。此时 AX 变成 0x31,右键寄存器区查看 name 在内存中的区域:



发现 0x31 就是 name 第一个字符 ‘1’ 的ASCII码。

6、最后的判定

经过以上分析,我们能够猜測出由 name 到 serial 的算法:

serial = 'AKA-' + 逆序itoa(strlen(name) * 0x17CFB + name[0]);

0x05 程序验证

依据上述步骤。我们破解了其加密方式,以下我们用 C语言程序验证:

#include <stdio.h>
#include <string.h>
#define BUFSIZ 1024 int main()
{
char name[BUFSIZ];
char serial[BUFSIZ];
int num, i = 0; printf("Input your name: ");
scanf("%s", name);
printf("Serial: AKA-"); num = strlen(name) * 0x17cfb + name[0];
while (num > 0) {
serial[i++] = num % 10 + '0';
num /= 10;
} while (i--)
putchar(serial[i]);
putchar('\n'); return 0;
}

程序非常easy。首先获取 name。 然后依据上面的分析得到中间数 num,接着把 num 转化成字符串,最后逆序输出该字符串。

1、C语言程序执行结果

2、Afkayas.1执行结果

我们能够发现,事实上该程序的中间数仅仅与字符串的长度和第一个字符有关.

0x06 总结

第一次写这么长的博文,第一次做逆向分析,第一次破解一个小程序。

逆向project实战--Afkayas.1的更多相关文章

  1. 逆向project实战--Acid burn

    0x00 序言 这是第二次破解 crackme 小程序,感觉明显比第一次熟练.破解过程非常顺利,差点儿是分分钟就能够找到正确的 serial,可是我们的目标是破解计算过程.以下将具体介绍. 0x01 ...

  2. Android 逆向project 实践篇

    Android逆向project 实践篇 上篇给大家介绍的是基础+小Demo实践. 假设没有看过的同学能够进去看看.(逆向project 初篇) 本篇主要给大家介绍怎样反编译后改动源代码, 并打包执行 ...

  3. Android Cocos2dx引擎 prv.ccz/plist/so等优化缓存文件,手把手ida教你逆向project反编译apk库等文件

    前段时间在 Android play 上看到一个非常牛逼的 3D 动态天气预报,效果真的非常炫.二话不说动手 dex2jar.bat/apktool 发现这并没 有什么卵用,在核心的地方看见 nati ...

  4. 【逆向&编程实战】Metasploit中的安卓载荷凭什么吊打SpyNote成为安卓端最强远控

    文章作者:MG1937 QQ:3496925334 CNBLOG:ALDYS4 未经许可,禁止转载 前言 说起SpyNote大家自然不陌生,这款恶意远控软件被利用在各种攻击场景中 甚至是最近也捕获到了 ...

  5. 逆向project第003篇:跨越CM4验证机制的鸿沟(上)

    一.前言 <冠军足球经理>系列作为一款拟真度极高的足球经营类游戏.赢得过无数赞誉,而CM4可以说是这个传奇的起点. 可是在游戏安装过程中.当用户输入完序列号之后.程序并不会对用户的输入进行 ...

  6. 逆向project第005篇:跨越CM4验证机制的鸿沟(下)

    一.前言 本文是逆向分析CM4系列的最后一篇,我会将该游戏的序列号验证机制分析完成,进而编写出注冊码生成器. 二.分析第二个验证循环 延续上一篇文章的内容,来到例如以下代码处: 图1 上述代码并没有特 ...

  7. android 逆向project smail 语法学习

    众所周知,android 是开源的.如今市场上反编译别人的劳动果实的人也不少.所以我们也是有必要学习下smail语言,(就是androidproject反编译后出的语法语音),看看改怎么给我们的代码 ...

  8. 逆向project第004篇:令计算器程序显示汉字(下)

    一.前言 钩子技术是一项很有有用价值的技术.在Windows下HOOK技术的方法比較多,使用比較灵活,常见的应用层的HOOK方法有Inline HOOK(详见<反病毒攻防研究第012篇:利用In ...

  9. 【逆向&编程实战】Metasploit安卓载荷运行流程分析_复现meterpreter模块接管shell

    /QQ:3496925334 作者:MG193.7 CNBLOG博客号:ALDYS4 未经许可,禁止转载/ 关于metasploit的安卓模块,前几次的博客我已经写了相应的分析和工具 [Android ...

随机推荐

  1. BZOJ 4552 [Tjoi2016&Heoi2016]排序 ——线段树 二分答案

    听说是BC原题. 好题,二分答案变成01序列,就可以方便的用线段树维护了. 然后就是区间查询和覆盖了. #include <map> #include <cmath> #inc ...

  2. 算法复习——区间dp

    感觉对区间dp也不好说些什么直接照搬讲义了2333 例题: 1.引水入城(洛谷1514) 这道题先开始看不出来到底和区间dp有什么卵关系···· 首先肯定是bfs暴力判一判可以覆盖到哪些城市····无 ...

  3. 【CCF】送货 欧拉路径

    80分,暂时没找出20分的Bug #include<iostream> #include<cstdio> #include<cstring> #include< ...

  4. Nginx配置https双向认证

    1.      前期的准备工作: 安装openssl和nginx的https模块 cd ~/ mkdir ssl cd ssl mkdir demoCA cd demoCA mkdir newcert ...

  5. 大视野 1016: [JSOI2008]最小生成树计数(最小生成树)

    总结:此类题需要耐心观察规律,大胆猜想,然后证明猜想,得到有用的性质,然后解答. 简单的说:找隐含性质. 传送门:http://61.187.179.132/JudgeOnline/problem.p ...

  6. hdu 1181(Floyed)

    变形课 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Total Submis ...

  7. LeetCode OJ--Unique Paths II **

    https://oj.leetcode.com/problems/unique-paths-ii/ 图的深搜,有障碍物,有的路径不通. 刚开始想的时候用组合数算,但是公式没有推导出来. 于是用了深搜, ...

  8. AC日记——最短路 洛谷 P2384

    题目背景 狗哥做烂了最短路,突然机智的考了Bosh一道,没想到把Bosh考住了...你能帮Bosh解决吗? 他会给你100000000000000000000000000000000000%10金币w ...

  9. 洛谷——P2737 [USACO4.1]麦香牛块Beef McNuggets

    https://www.luogu.org/problemnew/show/P2737 题目描述 农夫布朗的奶牛们正在进行斗争,因为它们听说麦当劳正在考虑引进一种新产品:麦香牛块.奶牛们正在想尽一切办 ...

  10. ionic build Android错误记录 error in opening zip file

    0.写在前头 运行 :cordova requirements Requirements check results for android: Java JDK: installed 1.8.0 An ...