逆向学习手记

逆向学习手记

首页休闲益智堆栈平衡更新时间:2024-07-30
1、前言

逆向工程技术在信息安全领域有着重要的作用,无论是在软件保护、恶意病毒分析还是其它方面,均需要使用逆向工程来获得程序运行逻辑,进而分析软件或者程序行为,从而判断是否存在恶意行为,对软件进行更好的加固保护,因此,在本文中,我从逆向常用分析工具Ollydbg和IDA出发,学习8086、80386汇编语言,结合软件在三大平台(Window/Linux/Android)的不同特点,以几道典型的CTF逆向赛题作分析,展开基于逆向工程的软件安全的学习。

2、准备

1、掌握基本的汇编指令

2、学习window系统下动态分析工具Ollydbg的使用

常用快捷键整理:

常用于下断点的API(适用于分析MFC程序)

3、学习Linux系统下动态分析工具GDB的使用

常用命令整理:

4、学习静态分析工具IDA的使用

常用快捷键:

5、学习注册码算法破解思路

常见的注册码算法分为4种:

(1)以用户名作为自变量,通过验证算法生成对应序列号,并和用户输入的序列号进行比较;

序列号=F(用户名)

(2)以注册码作为自变量,通过验证算法的反函数生成对应用户名,并和用户输入的用户名进行比较;

序列号=F(用户名)

用户名=F-1(序列号)

(3)通过对等函数检查注册码;

F1(用户名)=F2(序列号)

(4)同时采用用户名和注册码作为自变量,采用二元函数生成某个数值并和某个特定的值比对;

特定值=F(用户名,序列号)

破解思路可分为两方面:

A.通过内存读取正确的序列号

这种方法多用在软件作者采用{序列号=F(用户名)}的验证方式,通过OD跟踪,在最后进行strcmp比较或者是数值比较时查看内存就可知道通过F函数得出的正确的序列号。

B.分析算法逻辑,对验证算法求逆,从而可以根据自定义的用户名得出正确的序列号。

这种方法对算法的掌握度要求较高,而且可破解程度与软件作者选择的验证算法是否容易求逆有很大关系。通常需要使用IDA对程序静态分析来了解整个算法实现过程。

6、学习脱壳思路

ESP定律:根据堆栈平衡原理,单步调试时,观察esp寄存器的值,当值与加壳后的程序入口处的esp值相同时,说明到达程序的真正入口点。

3、实战分析DDCTF第3题

题目:

其中evil.exe是个伪装成文档文件的恶意exe程序,使用IDA进行分析,发现加壳痕迹导致IDA无法准确辨识代码区和数据区:

进而使用PEID查壳,但是没有结果,考虑到可能是作者对壳的特征进行了混淆,在linux下使用strings命令查看是否有提示信息,发现UPX字眼,初步确定加了UPX壳:

另外,也可以发现恶意程序通常调用的可疑API函数LoadLibraryA、ShellExecuteA和InternetOpenA:

接下来将程序载入Ollydbg进行手动脱壳,首先明确UPX壳解码的过程有如下几个步骤:

(1)初始化

(2)进行代码还原

对于UPX壳无法压缩的代码,直接将代码从UPX1区段还原到UPX0区段;

已经压缩的代码,UPX壳根据UPX1中的KEY值找到UPX0中重复指令的位置,再进行代码还原。

(3)进行CALL修复:对CALL调用的函数地址进行修正

(4)函数表还原

(5)节表初始化

(6)解码完毕后跳转至实际程序入口

其中,可以用来定位解码开始和结束的标志指令分别是pushad和popad,

往下寻找到popad处,在popad指令的下一条指令下F4硬件断点,

再次发现pushad处,和上一步相同,寻找popad,F4执行,

跳转到了实际的程序入口处

使用Ollydump对程序进行脱壳,修正程序入口点

将脱壳后程序载入IDA分析,可以找到main函数如下

分析程序逻辑可知,该程序运行时是先进入gen_docx函数,该函数内操作如下,复制自身程序到%Temp%文件夹中,创建.docx后缀的文件并写入'Welcome!'内容后调用Shell打开文件,并且创建了执行evil.exe的新进程:

之后进入delete_exe函数,在该函数中首先检查命令行参数的个数,如果为2,则循环删除evil.exe文件,由于在上一步中,新创建的进程命令行参数为2,所以执行删除操作:

Read_payload_from_jpg函数中首先访问http://www.ddctf.com/x.jpg,然后读取x.jpg内容:

所以首先我们在本地搭建web服务器,修改本地host指向www.ddctf.com,将题目给的x.jpg放入web根目录;

之后程序对读取到的数据进行解密操作,genkey函数负责生成解密需要的key,decrypt函数负责将数据根据key解密,最后在函数Execute_payload中执行解密后的payload

因此,只要在动态调试观察程序运行到if判断时Result的值即为payload,此处直接修改了判断语句使得跳转实现:

4、实战分析ISG2017 re1000-BMP_Wannacry

题目如下:

给了三个文件,bmp_wannacry是一个64位的ELF文件,flag.bmp_enc是被加密了的flag.bmp图像,key.bak应该是加密使用的密钥,下面分析bmp_wannacry的程序逻辑。

将程序载入IDA,载入aes头文件,手动修改反编译出错的地方,得到如下的main函数:

给了三个文件,bmp_wannacry是一个64位的ELF文件,flag.bmp_enc是被加密了的flag.bmp图像,key.bak应该是加密使用的密钥,下面分析bmp_wannacry的程序逻辑。

将程序载入IDA,载入aes头文件,手动修改反编译出错的地方,得到如下的main函数:

AES_cfb_encrypt函数中,主要的加密操作如下,由iv需要经过AES_encrypt加密后才参与和明文的异或操作可知,加密时选择的模式是CFB模式:

写脚本进行CFB模式下的解密:

得到解密后的flag.bmp:

5、实战分析2017强网杯 re150-NonStandard

题目给了一个Nonstandard.exe文件,IDA载入发现程序是对输入的字符串进行某种加密操作后和内存中已有的密文进行验证,因此解题的关键在加密的操作,验证程序如下:

加密的算法部分如下:

由算法特征,可以知道使用了base32对输入字符串进行编码,但是加密表不是规则的,通过下面函数

生成:

最后的加密表为:zYxWvUtSrQpOnMlKjIhGfEdCbA765321

最终脚本:

6、总结

就我个人感觉,学习逆向工程所需的知识还是比较多的,从汇编语言、动态分析工具OllyDbg及静态分析工具IDA的使用,到加解密算法(AES/DES/RSA/RC4等)的学习,再到CTF比赛中对恶意样本的分析等等,这篇文章也只是讲了一点而已,更多的还要在实践中学习:)

附:题目下载链接(https://github.com/sherlly/CTF/tree/master/collect)

注:本文属合天原创奖励文章,未经允许,禁止转载!

查看全文
大家还看了
也许喜欢
更多游戏

Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved