逆向学习手记

走过路过,不要错过这个公众号哦!

逆向学习手记

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)

看不过瘾?合天2017年度干货精华请点《【精华】2017年度合天网安干货集锦

别忘了投稿哟!!!

合天公众号开启原创投稿啦!!!

大家有好的技术原创文章。

欢迎投稿至邮箱:[email protected]

合天会根据文章的时效、新颖、文笔、实用等多方面评判给予100元-500元不等的稿费哟。

有才能的你快来投稿吧!

重金悬赏 | 合天原创投稿等你来!

逆向学习手记

    合天智汇

网址 : www.heetian.com

电话:4006-123-731

逆向学习手记

长按图片,据说只有颜值高的人才能识别哦→