Hi,这里是关于REVERSE(逆向)的入门。关于逆向,有些话想说。逆向的学习需要理论,也需要实践。广义上,逆向不仅仅是调试二进制可执行格式,反汇编,破解;逆向是心理模型的建立过程,以及模型实现的底层细节的定位过程。从理论上,为了理解一个程序,系统,你读代码,无论是源码还是汇编,甚至二进制机械指令,都是一个逆向过程.
本篇将对REVERSE(逆向)一些常用工具及使用方法进行介绍。逆向所需具备的知识技能很多很杂,要学好逆向和熟练掌握反汇编,编程是必须会的,再接着就是必须熟练密码学,往更高处走,格局放大点,到软件逆向,就需要熟悉软件工程,因为都是会工程化的。如果热爱逆向并且想走这条路,CTF只是开始。
在了解查壳工具之前,让我们了解了解壳的概念,这个“壳”是指的什么,为什么会有壳?
下面列出的是常用的功能较强大的查壳工具:
将文件拖入查壳软件即可:
EXEInfoPE会显示文件的信息
PEID同理
去壳:顾名思义,就是对软件加壳的逆操作,把软件上存在的壳去掉。在一些计算机软件里也有一段专门负责保护软件不被非法修改或反编译的程序。以下是常用的一些去壳工具
通过一个题目让我们简单了解下去壳工具的使用:
先拖进EXEInfoPE去查询信息
发现其不是windows的可执行文件(windows下的文件是PE文件,Linux/Unix下的文件是ELF文件)并且是upx的壳
从main函数开始分析,Get flag.
IDA(Interactive Disassembler,交互式反汇编器)是业界一个功能十分强大的反汇编工具,是安全渗透人员进行逆向安全测试的必备工具,其强大的静态反汇编和逆向调试功能能够帮助安全测试人员发现代码级别的高危致命安全漏洞。IDA支持多种不同的处理器架构(包括IA-32、IA-64、AMD64等),还支持不同格式的可执行文件,如PE(Portable Executable,Windows系统中使用)、ELF(Executable and Linking Format,在Linux/Unix系统中使用),苹果公司的Mac机的可执行文件、PDA/手持设备/手机中的ARM可执行文件等。
打开之后,IDA会提供3种不同的打开方式;New(新建),Go(运行),Previous(上一个)。当我们初次打开的时候选择GO就可以了。进入之后,选择左上角的file中的open打开文件,或者可以直接把文件拖进IDA。
Hex View 十六进制窗口
Imports 导入函数窗口
Struceures 结构体窗口
Exports 导出函数窗口
Enums 枚举窗口
Strings 字符串窗口
资料转移指令:
MOV 移动
MOVC 程式记忆体移动
MOVX 外部RAM和扩展I/O口与累加器A的数据传送指令
PUSH 放入堆叠
POP 由堆叠取回
XCH 8位元交换
XCHD 低4位元交换
SWAP 高低4位元交换
算术指令:
ADD 两数相加
ADDC 两数相加再加C
SUBB 两数相减再减C
INC 加一指令
DEC 减一指令
MUL (MUL AB乘法指令仅此一条)相乘指令,所得的16位二进制数低8位存累加器A高8位存B
DIV (DIV AB 除法指令仅此一条)相除指令,所得商存A,余数存B
DA (DA A 只此一条指令)调整为十进数
逻辑指令:
ANL做AND(逻辑与)运算
ORL做OR(逻辑或)运算
XRL 做(逻辑异或)运算
CLR 清除为0
CPL 取反指令
RL 不带进位左环移
RLC 带进位左环移
RR 不带进位右环移
RRC 带进位右环移
控制转移类指令:
JNC C=0时跳
JC C=1时跳
JNB 位元=0时跳
JB 位元=1时跳
JBC 位元=1时跳且清除此位元
LCALL 长调用子程序
ACALL 绝对调用子程序
RET 由副程式返回
RETI 由中断副程式返回
AJMP 绝对转移
SJMP 相对转移
JMP @A+DPTR 散转,相对DPTR的间接转移
JZ A=0时跳
JNZA 0时跳
CJNE 二数比较,不相等时跳
DJNZ 减一,不等於0时跳
NOP 空操作
常用功能及快捷键:
Space(空格):切换文本视图与图标视图
ESC:返回上一个操作地址
G:搜索地址和符号
N:对符号进行重命名
:(冒号):常规注释
;(分号):可重复注释
Alt + M:添加标签
Ctrl + S:查看段的信息
代码数据切换 C->代码;D->数据;A->ascii字符串;U->解析成未定义的内容
X:查看交叉应用
F5:查看伪代码
Alt + T:搜索文本
Alt + B:搜索十六进制
下面通过一道例题来熟悉IDA的使用
先将文件拖进EXEInfoPE进行分析
是用C++写的文件并且没有壳
我们直接拖进IDA进行静态分析:
然后,查找主函数main,可以看到右侧的是反汇编的汇编代码,这时候,我们可以直接分析汇编语言,但是,汇编语言看起来太多,费劲。这个时候就可以是有IDA是最强大的功能F5了,它能够直接将汇编代码生成C语言代码,虽然和这个程序的源码不完全一样,但是逻辑关系是一样的。
F5查看伪代码
可以看到一个关键的字符串,print(aFlag),那么证明这就是输入正确flag,然后,会输出aFlag证明你的flag正确,然后,继续往上分析,可以看到v3的值,是由strcmp()决定的,比较v5和输入的字符串,如果一样就会进入后面的if判断,所以,我们继续往上分析,看看哪里又涉及v5,可以看到开头的_mm_storeu_si128(),对其进行分析发现它类似于memset(),将xmmword_413E34的值赋值给v5,所以,我们可以得到正确的flag应该在xmmword_413E34中,然后,我们双击413E34进行跟进
这时,我们使用IDA的另一个功能 R ,能够将十进制的数转换为字符串。
于是我们便得到了flag
c32asm 是款非常好用的反汇编程序,具有反汇编模式和十六进制编辑模式,能跟踪exe文件的断点,也可直接修改软件内部代码 ,提供输入表、输出表、参考字符、跳转、调用、PE文件分析结果等显示 ,提供汇编语句逐字节分析功能,有助于分析花指令等干扰代码。
什么时候需要?
1.当你遇到一个可疑程序,而不想让它运行起来,又想迅速获得其PE头结构,内部字符串信息的时候。
2.当你想Dump一个运行起来的程序的时候。
3.当你需要手工修改目标程序的时候
4.写日志,写笔记也可以使用它
VB Decompiler pro是一个用来反编译VB编写的程序的工具。VB Decompiler反编译成功后,能够修改VB窗体的属性,查看函数过程等 ,VB Decompiler Pro 能反编译Visual Basic 5.0/6.0的p-code形式的EXE, DLL 或 OCX文件。对native code形式的EXE, DLL或OCX文件,VB Decompiler Pro 也能给出反编译线索。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TW9de1ZL-1619274739168)(https://i.loli.net/2021/04/24/BKDTykuxbq7PXlR.png)]
Ollydbg 通常称作OD,是反汇编工作的常用工具,OD内置了强大的反汇编器,且该反汇编器具有强大的代码分析能力,可以识别循环、switch控制块以及其它主要的代码结构。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0zTZ1m6K-1619274739169)(https://i.loli.net/2021/04/24/eyw1b8Hq4lUvsTp.gif)]
反汇编窗口:显示被调试程序的反汇编代码,标题栏上的地址、HEX 数据、反汇编、注释可以通过在窗口中右击出现的菜单 界面选项->隐藏标题 或 显示标题 来进行切换是否显示。用鼠标左键点击注释标签可以切换注释显示的方式。
寄存器窗口:显示当前所选线程的 CPU 寄存器内容。同样点击标签 寄存器 (FPU) 可以切换显示寄存器的方式。
信息窗口:显示反汇编窗口中选中的第一个命令的参数及一些跳转目标地址、字串等。
数据窗口:显示内存或文件的内容。右键菜单可用于切换显示方式。
堆栈窗口:显示当前线程的堆栈。
F2:设置断点,只要在光标定位的位置(上图中灰色条)按F2键即可,再按一次F2键则会删除断点。
F8:单步步过。每按一次这个键执行一条反汇编窗口中的一条指令,遇到 CALL 等子程序不进入其代码。
F7:单步步入。功能同单步步过(F8)类似,区别是遇到 CALL 等子程序时会进入其中,进入后首先会停留在子程序的第一条指令上。
F4:运行到选定位置。作用就是直接运行到光标所在位置处暂停。
F9:运行。按下这个键如果没有设置相应断点的话,被调试的程序将直接开始运行。
CTR+F9:执行到返回。此命令在执行到一个 ret (返回指令)指令时暂停,常用于从系统领空返回到我们调试的程序领空。
ALT+F9:执行到用户代码。可用于从系统领空快速返回到我们调试的程序领空。
查看文件信息
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4nMoppCc-1619274739170)(https://i.loli.net/2021/04/24/ZkM5zeluxOJsbKv.png)]
发现有Aspack壳
用脱壳软件进行脱壳处理
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H8Ku34u1-1619274739171)(https://i.loli.net/2021/04/24/rqnDgbC98teYK1o.png)]
我们试着运行下这个文件
这个时候我们使用Ollydbg进行断点分析,随意输入后到达登录失败弹出窗附近
通过分析附近的汇编可以发现两个值不相等时始终跳转至004012A1
数了一下有十六个,大致估计可能正确格式是输入16个字符,在004012A4 下断点重新启动程序输入16个字符,开始分析:
Pass[0]==B,该字符直接与0x42比较,0x42转换成ASCII再转换成字符为B
Pass[15]==Y 可以看出将字符存到eax寄存器,然后加上0x42等于0x57,计算和转换后的值为Y
Pass[1]==Z 这次将值存放到ecx中,然后用lea命令,意思是将ecx中的值减3存到eax中,用0x57减3转换后为Z,后面大致相同的计算方式,注意排序方式为从ebp-0x240到ebp-0x231为pass[0]到pass[15]
Pass[14]==A
Pass[2]==9
Pass[13]==b
Pass[3]==d
Pass[12]==7
Pass[4]==m
Pass[5]==q
Pass[6]==4
Pass[9]==g
Pass[7]==c
Pass[8]==8
排序后得出所需字符串为 BZ9dmq4c8g9G7bAY
得到flag{ BZ9dmq4c8g9G7bAY }
Windbg是在windows平台下强大的用户态和内核态调试工具。虽然windbg也提供图形界面操作,但它最强大的地方还是有着强大的调试命令,一般情况会结合GUI和命令行进行操作。它的反汇编能力有限,但在操作系统集成性方面,远远超过OllyDbg。WinDbg有强大的扩展性,可以提供大量有关各种内部系统的数据结构信息。
以上便是REVERSE(逆向)的简单的入门,学习的路很长,虽然兴趣是最好的老师,但难免孤独与迷茫,觉得自己坚持不住的时候,咬咬牙,挺过去,你的这些努力都会成为耀眼的地方。
虽然辛苦,我还是会选择那种滚烫的人生。–北野武