这是做者的系列网络安全自学教程,主要是关于网安工具和实践操做的在线笔记,特分享出来与博友共勉,但愿您们喜欢,一块儿进步。上一篇文章分享了IDA Pro反汇编工具的基础用法,并简单讲解一个EXE逆向工程解密实战方法;本篇文章将讲解动态分析OllyDbg工具的基础用法,主要是结合两个Crakeme案例逆向破解。但愿对初学者有帮助,大神请飘过,谢谢各位看官!php
下载地址:https://github.com/eastmountyxz/NetworkSecuritySelf-study
百度网盘:https://pan.baidu.com/s/1dsunH8EmOB_tlHYXXguOeA 提取码:izebhtml
PS:做为初学者,深知网络安全这块要学习的知识太多,但愿本身能始终保持满腔热情,科研结合实践慢慢前行。python
前文学习:
[网络安全自学篇] 一.入门笔记之看雪Web安全学习及异或解密示例
[网络安全自学篇] 二.Chrome浏览器保留密码功能渗透解析及登陆加密入门笔记
[网络安全自学篇] 三.Burp Suite工具安装配置、Proxy基础用法及暴库示例
[网络安全自学篇] 四.实验吧CTF实战之WEB渗透和隐写术解密
[网络安全自学篇] 五.IDA Pro反汇编工具初识及逆向工程解密实战git
前文欣赏:
[渗透&攻防] 一.从数据库原理学习网络攻防及防止SQL注入
[渗透&攻防] 二.SQL MAP工具从零解读数据库及基础用法
[渗透&攻防] 三.数据库之差别备份及Caidao利器
[渗透&攻防] 四.详解MySQL数据库攻防及Fiddler神器分析数据包github
参考下面大神的文章,推荐你们阅读:
《加密与解密》段钢等著
《OllyDBG入门教程》看雪学院 - CCDebuger
初练160个CrakeMe程序之002 - 吾爱破解海天一色大神
160个CrackMe002 - CSDN鬼手大神
[Crack杰CM破解实战系列] 之AfKayAs.2 - Crack杰大神
逆向工程实战–Afkayas.1 - epsilon大神web
OllyDbg是一个新的动态追踪工具,将IDA与SoftICE结合起来的思想,Ring 3级调试器,很是容易上手,是当今最为流行的调试解密工具之一。它还支持插件扩展功能,是目前最强大的调试工具之一。数据库
OllyDbg打开以下图所示,包括反汇编窗口、寄存器窗口、信息窗口、数据窗口、堆栈窗口。浏览器
下图是打开EXE后显示的界面。安全
下面简单讲解经常使用的快捷键调试方式。网络
F2
设置断点,以下图所示的红色位置,程序运行到此处会暂停,再按一次F2键会删除断点。
F9
按下这个键运行程序,若是没有设置相应的点,被调试的程序直接开始运行。
F8
单步步过,每按一次这个按键,将执行反汇编窗口中的一条指令,遇到CALL等子程序不进入其代码。
F7
单步步入,功能通单步步过(F8)相似,区别是遇到CALL等子程序时会进入其中,进入后首先停留在子程序的第一条指令上。以下图进入CALL子程序。
F4
运行到选定位置,即运行到光标所在位置处暂停。
CTRL+F9
执行到返回,按下此键会执行到一个返回指令时暂停,经常使用于从系统领空返回到咱们调试的程序领空。
ALT+F9
执行到用户代码,从系统领空快速返回咱们调试的程序领空。
第一个案例是 《加密与解密》书中Crakeme v3.0的文件,须要解密用户名和序列号。
点击“Register now”按钮,会有输入错误相关的提示,以下图所示。
OllyDbg动态分析的基本流程以下:
下面开始正式的分析。
第一步:调用PEiD检测程序是否加壳。
反馈结果为“Borland Delphi 4.0 - 5.0”,无壳Delphi编写的文件。
第二步:运行CrakeMe V3.0文件,并点击“Register now”,提示错误信息。
对话框提示错误信息“Wrong Serial, try again!”。
第三步:启动OllyDbg软件,选择菜单“文件”,打开CrackMe3文件。
此时文件会停留在以下位置,双击注释位置能添加自定义注释。
第四步:在反汇编窗口右键鼠标,选择“查找”->“全部参考文本字串”。
弹出以下图所示的对话框。
第五步:右键选择“查找文本”,输入“Wrong”定位“Wrong Serial, try again!”位置。
以下图所示,定位到“Wrong Serial”位置。
第六步:接着右键鼠标,点击“反汇编窗口中跟随”。
接着定位到以下图所示位置。
第七步:选中该语句右键“查找参考”-:“选定地址”(快捷键Ctrl+R)。
弹出以下图所示的“参考页面”。
第八步:双机上面的两个地址(00440F7九、00440F93),去到对应的位置。
在反汇编窗口中向上滚动窗口,能够看到核心代码:
第九步:经过查看跳转到“Wrong serial, try again”字符串的指令,能够查询相应的程序。
在“调试选项”->“CPU”->勾选“显示跳转路径”及“如跳转未实现则显示灰色路径”和“显示跳转到选定命令的路径”。
以下图所示:
第十步:详细分析反汇编代码。
在下图中,地址0040F2C处按下F2键设置断点,接着按F9运行程序。
输入“Test”和“754-GFX-IER-954”,点击“Register now!”,显示结果以下图所示。
程序会在断点处中止,同时提示刚才输入的内容。
输出内容以下所示,其中内存地址02091CE0中输入了刚才的“Test”。
第十一步:左击“ss:[0019F8FC]=02091CE0,(ASCII “Test”)”,右键选择“数据窗口中跟随数值”,会在数据窗口中看到输入的内容。EAX=00000004 表示输入内容的长度为4个字符。
第十二步:调用F8按键和F7按键一步步分析代码。
回到下面00440F2C这部分代码,按下F8一步步运行,注意下面的核心代码。
00440F2C |. 8B45 FC mov eax,[local.1] ; 输入的内容送到EAX,即"Test" 00440F2F |. BA 14104400 mov edx,crackme3.00441014 ; ASCII "Registered User" 00440F34 |. E8 F32BFCFF call crackme3.00403B2C ; 关键点:用按F7进入子程序 00440F39 |. /75 51 jnz Xcrackme3.00440F8C ; 调走到这里就错误:Wrong serial ...
第十三步:当F8运行到“00440F34 |. E8 F32BFCFF call crackme3.00403B2C”时,按下F7进入CALL子程序,此时光标停留在以下所示位置(00403B2C)。
这里的PUSH ebx、PUSH esi等都是调用子程序保存堆栈时使用的命令,按F8一步步运行代码。其核心解释以下,是基础的汇编语言:(参考看雪CCDebuger大神的《OllyDBG入门教程》)
重点:程序运行到以下图所示界面时,能够看到“Test”和“Registered User”的比较。经过上面图片的分析,咱们知道用户名必须为“Registered User”。
第十四步:接着按F9键运行程序,出现错误对话框,点击肯定,从新在编辑框中输入“Registered User”,再次点击“Register now!”按钮,分析调试程序。
注意,F12键为暂停。
核心代码以下,其中地址00440F34的CALL已经分析清楚,继续F8执行下一步,知道第二个关键地方,即00440F51,按下F7进入子程序。
注意:注释内容的提示不必定存在,须要动态调试程序到寄存器查看对应的注册码,才是正确的作法。
00440F34 |. E8 F32BFCFF call crackme3.00403B2C 00440F51 |. E8 D62BFCFF call crackme3.00403B2C
上面两句代码能够看到用户名和注册码都是调用同一子程序,这个CALL分析方法和上面同样。
第十五步:按F8调试该子程序,发现cmp比较两个值是否相等,其中0044102C为注册码内容。
第十六步:按F12暂停,再按F9从新运行,输入正确的用户名和密码,解密成功。
Registered User
GFX-754-IER-954
难点:调试程序时如何核心代码,好比这里的CMP比较,同时汇编代码也比较晦涩。
这个案例是破解Crakeme中的Afkayas.1.EXE,这是典型的字符串序列破解程序,根据name的值推出serial。
第一步:经过PEiD检查它无壳,VB编写的。
第二步:OllyDbg工具打开Afkayas.1.EXE文件以下图所示。
第三步:反汇编区域右键鼠标,选择“查找”->“全部参考文本字串”。
第四步:在弹出的对话框中找到失败的提示字符“You Get Wrong”,右键“反汇编窗口中跟随”。
此时会回到代码区,能够看到失败和成果的字符串。
第五步:一般成功和失败的反馈字符串相隔不远,须要在以前判断,若是输入的serial正确则成功,不然失败;接着向上找到调用字符串比较函数的入口点。
注意,这一步比较关键,但我的以为须要长时间的经验和实践,才能准肯定位。
汇编调用函数以前会先把参数入栈,而后用CALL指令调用函数。在字符串比较函数以前有一句 PUSH EAX 指令,能够推测这里的EAX就是字符串的首地址。
第六步:在比较函数00402533处按下F2键设置断点,接着按F9键执行,此时会弹出运行界面,咱们输入“Eastmount”和“12345678”,而后点击OK按钮。
此时程序停留在断点处,右下角堆栈区显示了提示的正确Serial。
第七步:输入正确的用户名和Serial,成果注册。
Eastmount
AKA-877848
下面结合鬼手大神和海天一色大神的博文,简单分析加密的基本逻辑,同时强烈推荐你们阅读他们的文章,参见前面的参考文献。这些逆向的经验真不是一朝一夕就能获取的,深知本身要学习和经历的东西太多,你我一块儿加油。
基本流程以下:
serial = ‘AKA-’ + 逆序itoa(strlen(name) * 0x17CFB + name[0])
下面分享一段Python的解密代码。
# encoding: utf-8 key = "AKA" name = "Eastmount" #获取用户名长度 nameLen = len(name) print(u'获取用户名长度:') print(nameLen) #用户名长度乘以0x17CFB获得结果 res = nameLen * 0x17CFB print(u'用户名长度乘以0x17CFB:') print(res) #将结果加上用户名的第一个字符的ASCII print(name[0], ord(name[0])) res = res + ord(name[0]) print(u'结果加上用户名第一个字符的ASCII:') print(res) #转换为十进制 省略 #拼接序列号 key = key + str(res) print(u'最终结果:') print(key)
定义不一样的用户名能够获得对应的Serial。
写到这里,这篇基础性文章就叙述完毕,网络安全要学习的知识真的不少,涉及面很广,包括汇编、网络、操做系统、加密解密、C/C++、Python等。但愿本身能慢慢进步,科研与实践并重,也但愿读者喜欢这系列总结笔记。不喜勿喷,与你同行~
(By:杨秀璋 2019-08-13 周一深夜2点写于贵阳 https://blog.csdn.net/Eastmount )