本文主要是介绍入门逆向-入土为安的第二十五天,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
逆向工程基本概念
-
目标:逆向工程的主要目标是理解程序的逻辑、数据流和执行流程,以便找到隐藏的信息或解决CTF中的挑战。
-
常见文件类型:
-
可执行文件(如 ELF、PE 文件)
-
脚本文件(如 Python, JavaScript, etc.)
-
固件(嵌入式设备中的二进制文件)
-
-
工具:
-
反汇编工具:如 IDA Pro, Ghidra, Radare2,辅助将二进制文件转换为可读的汇编代码。
-
调试工具:如 GDB, x64dbg, WinDbg 等,用于动态分析和程序跟踪。
-
十六进制编辑器:如 HxD, 010 Editor, 用于在字节级别修改文件。
-
静态分析工具:如 Binwalk, Strings, 并查找字符串和其他信息。
-
逆向工程的基本步骤
-
环境配置:
-
安装必要的工具和插件,配置好调试环境。
-
-
初步分析:
-
使用工具查看可执行文件的元数据,例如文件类型、编译器信息、导入表等。这通常可以用
file
命令或其他工具来完成。
-
-
静态分析:
-
开始对二进制文件进行静态分析:
-
识别和查找关键函数(如
main
函数)。 -
查找字符串常量、格式化字符串等。
-
识别程序的控制流和数据流(可以用图形化工具表示)。
-
-
-
动态分析:
-
使用调试器跟踪程序的执行:
-
设置断点观察特定函数或代码块的执行。
-
修改寄存器或内存中的数据以查看程序的响应。
-
分析程序的输入输出,理解其业务逻辑。
-
-
-
漏洞分析:
-
查找潜在的漏洞(如缓冲区溢出、格式化字符串漏洞等)。
-
通过调试定位漏洞代码和触发条件。
-
-
提取信息:
-
如果目标是提取某些秘密标志(flag),可以通过分析存储在程序中的字符串、哈希值或其他内部数据找到它。
-
刷题的知识点
1. 基础知识
-
计算机体系结构:理解基本的计算机架构(如 x86/x86_64 架构),寄存器、堆栈、内存地址等概念。
-
汇编语言:能够阅读和理解汇编代码,熟悉常见的汇编指令和结构。
-
十六进制与二进制:理解数字表示法,能够在十六进制、二进制和十进制之间转换。
2.适合入门
main函数主逻辑分析学习目标: 理解和分析C/C++程序中的main函数,掌握程序的入口点及其主逻辑。学习资源: 阅读逆向工程相关书籍和在线教程,如《逆向工程实战》。实践操作: 选择几个开源或简单的C/C++程序,使用IDA Pro进行静态分析,识别main函数及其功能。
main函数与迷宫结合学习目标: 理解如何在分析过程中处理包含复杂逻辑和数据结构(如迷宫)的程序。学习资源: 查阅相关算法和数据结构的文献,学习迷宫生成和解算法。实践操作: 分析包含迷宫算法的程序,识别和理解处理迷宫数据的代码。
脱壳学习目标: 学习脱壳技术,了解如何去除程序的保护壳。学习资源: 阅读有关脱壳技术的教程,如《恶意软件分析与逆向工程》。实践操作: 使用脱壳工具(如PEiD、OllyDbg)处理各种壳保护的程序,完成脱壳操作并分析去壳后的程序。
XOR加密学习目标: 理解XOR加密的基本原理和应用,掌握如何识别和解密使用XOR加密的数据。学习资源: 查阅加密与解密的基本文献,了解XOR加密的工作原理。实践操作: 编写Python脚本实现XOR加密和解密,对被XOR加密的数据进行处理。
花指令学习目标: 理解花指令(Nop sleds等)的概念及其在逆向工程中的作用。学习资源: 阅读关于逆向工程和漏洞利用的书籍,如《Hacking: The Art of Exploitation》。实践操作: 在逆向工程中识别和处理花指令,了解其对分析和利用的影响。
Python脚本的编写学习目标: 学习使用Python编写逆向工程相关的脚本,如自动化分析和数据处理脚本。学习资源: 查阅Python编程和逆向工程的相关书籍和教程。实践操作: 编写Python脚本处理和分析二进制文件,自动化逆向工程任务。
Base64学习目标: 理解Base64编码的原理及其在数据传输中的应用,学习如何解码Base64数据。学习资源: 查阅Base64编码和解码的基本教程。实践操作: 使用Python编写Base64编码和解码脚本,处理实际的Base64数据。
PYc文件分析学习目标: 学习如何分析Python编译后的.pyc文件,了解Python字节码的结构和反编译技术。学习资源: 阅读《Python逆向工程》相关书籍和文献。实践操作: 使用工具如uncompyle6反编译.pyc文件,分析其字节码并还原为Python源代码。(学完了来找我给你进阶的)
3.解题思路
1.用工具查壳(ExeinfoPe查壳)判断是ELF还是PE,32位还是64位,有壳upx -d [ 文件名 ] 去壳。
2.通过各种工具将文件反汇编+反编译(一般ida)
3.找加密后的密文,加密过程,逆向求解
题目的类型(xor,花指令,upx,base64,pyc,z3,迷宫,tea家族,大小端,安卓,rc4,smc,动调.......)
补充知识点
汇编
数据传送指令
MOV:将数据从一个位置移动到另一个位置。
例如:MOV AX, 1234h (将立即数 1234h 传送到寄存器 AX)
PUSH:将数据压入栈中。
例如:PUSH AX (将寄存器 AX 的值压入栈)
POP:从栈中弹出数据。
例如:POP AX (从栈中弹出数据到寄存器 AX)
算术运算指令
ADD:将两个操作数相加。
例如:ADD AX, BX (将寄存器 BX 的值加到寄存器 AX 中)
SUB:从一个操作数中减去另一个操作数。
例如:SUB AX, 5 (将 5 从寄存器 AX 中减去)
MUL:无符号整数乘法。
例如:MUL BX (将寄存器 BX 的值与 AX 中的值相乘,结果存放在 DX:AX 中)
DIV:无符号整数除法。
例如:DIV BX (将寄存器 AX 的值除以寄存器 BX 中的值,结果存放在 AL 中,余数存放在 AH 中)
INC:将操作数的值增加1。
例如:INC AX (将寄存器 AX 的值加1)
DEC:将操作数的值减少1。
例如:DEC AX (将寄存器 AX 的值减1)
逻辑运算指令
AND:按位与运算。
例如:AND AX, BX (对寄存器 AX 和 BX 中的值进行按位与运算)
OR:按位或运算。
例如:OR AX, 0FFh (将寄存器 AX 的值与 0FFh 进行按位或运算)
XOR:按位异或运算。
例如:XOR AX, AX (将寄存器 AX 的值与自身进行异或运算,结果为0)
NOT:按位取反运算。
例如:NOT AX (将寄存器 AX 中的每一位取反)
比较与跳转指令
CMP:比较两个操作数。
例如:CMP AX, BX (将寄存器 AX 的值与 BX 中的值进行比较)
JMP:无条件跳转。
例如:JMP Label (跳转到指定标签 Label)
JE / JZ:若相等则跳转(或若零则跳转)。
例如:JE Label (如果上一次比较结果为相等,则跳转到 Label)
JNE / JNZ:若不等则跳转(或若非零则跳转)。
例如:JNE Label (如果上一次比较结果为不等,则跳转到 Label)
JG / JNLE:若大于则跳转。
例如:JG Label (如果上一次比较结果为大于,则跳转到 Label)
JL / JNGE:若小于则跳转。
例如:JL Label (如果上一次比较结果为小于,则跳转到 Label)
控制指令
CALL:调用子程序。
例如:CALL Subroutine (跳转到子程序 Subroutine,并在返回后继续执行)
RET:从子程序返回。
例如:RET (从子程序返回到调用点)
NOP:无操作指令,什么也不做。
例如:NOP (占用一个周期,但不进行任何操作)
这些指令构成了汇编语言的基础,通过它们可以实现各种复杂的计算和控制操作。
进制
基础
-
二进制(基数为2):只使用0和1,例如,二进制的“101”表示十进制的5
-
八进制(基数为8):使用0到7的数字,例如,八进制的“12”表示十进制的10。
-
十进制(基数为10):使用0到9的数字,这是我们日常生活中最常用的进制系统。
-
十六进制(基数为16):使用0到9和A到F(其中A到F表示10到15),例如,十六进制的“1A”表示十进制的26。
-
二进制的重要性基础数据表示计算机内部表示:计算机内部所有的数据和指令都是以二进制形式存储和处理的。二进制的0和1对应计算机的电气状态(如开关),使得计算机能够进行各种操作。逻辑运算:计算机执行的所有逻辑运算和算术运算(如加法、减法、乘法)都是基于二进制的。逻辑门(如与门、或门、非门)在计算机硬件中以二进制为基础进行操作。数据存储内存和存储:计算机的内存(RAM)和存储设备(如硬盘、SSD)都以二进制数据进行读写和存储。这是因为二进制表示方式简单,适合用电子电路进行存储和传输。程序执行机器码:程序的源代码在编译后会转换为机器码,机器码是二进制形式的指令,计算机通过解析这些二进制指令来执行程序。
-
机器语言:
-
定义:机器语言是计算机能够直接理解和执行的最低级语言,由二进制指令组成,通常由0和1表示。
-
特征:每条指令由操作码(Opcode)和操作数(Operand)组成,直接与计算机硬件交互,处理器可以直接读取和执行这些指令。
-
-
汇编语言:
-
定义:汇编语言是一种低级语言,是机器语言的符号化表示,使用助记符(如
MOV
、ADD
)来表示操作。 -
特征:相对于机器语言,汇编语言更易于阅读和编写,但仍然需要对计算机硬件有一定的了解。汇编语言通过汇编器(Assembler)转换为机器语言。
-
-
高级语言:
-
定义:高级语言是一种抽象程度较高的编程语言,如C语言、C++、Java等。它们通常使用更接近自然语言的语法,使得程序更易于理解和维护。
-
特征:高级语言通常不直接与硬件交互,通过编译器或解释器转换为机器语言。高级语言支持面向对象、结构化编程等高级特性。
-
-
-
机器语言:由于直接与硬件交互,执行速度最快。
-
汇编语言:虽然比机器语言稍慢,但仍然高效,因其与底层硬件直接相关。
-
高级语言:通常比汇编和机器语言慢,因为需要经过编译和解释步骤,但开发效率高,易于维护。
-
1. C语言
这是最高级的语言,代码简洁易读:
#include <stdio.h> int main() {int a = 5; // 定义整数变量a并初始化为5a = a + 1; // 将a的值加1printf("%d\n", a); // 输出a的值return 0; // 程序正常退出 }
2. 汇编语言
在x86架构下,以下是实现相同功能的汇编语言代码:
section .datamsg db "%d", 0 ; 定义格式化字符串 section .bssnum resd 1 ; 为整数变量分配空间 section .textglobal _start _start:; 初始化变量mov dword [num], 5 ; 将值5存入变量num ; 加1操作mov eax, [num] ; 将num的值加载到寄存器eaxadd eax, 1 ; 将eax中的值加1mov [num], eax ; 将结果存回num ; 输出结果mov eax, 4 ; 系统调用号 (sys_write)mov ebx, 1 ; 文件描述符 (stdout)mov ecx, num ; 结果的地址mov edx, 4 ; 输出的字节数int 0x80 ; 调用内核 ; 程序退出mov eax, 1 ; 系统调用号 (sys_exit)xor ebx, ebx ; 退出码 (0)int 0x80 ; 调用内核
3. 机器语言
对于x86架构,汇编语言指令会被转换为机器语言。以下是上述汇编语言代码对应的机器码(仅部分示例,实际机器码较长且复杂):
-
mov dword [num], 5
:C7 05 00 00 00 05 00 00 00
-
mov eax, [num]
:8B 05 00 00 00 00
-
add eax, 1
:83 C0 01
-
mov [num], eax
:89 05 00 00 00 00
-
mov eax, 4
:B8 04 00 00 00
-
mov ebx, 1
:BB 01 00 00 00
-
mov ecx, num
:B9 00 00 00 00
-
mov edx, 4
:BA 04 00 00 00
-
int 0x80
:CD 80
-
mov eax, 1
:B8 01 00 00 00
-
xor ebx, ebx
:31 DB
-
int 0x80
:CD 80
2.十六进制的重要性简化表示数据可读性:十六进制是一种更简洁的方式来表示和查看二进制数据。由于每个十六进制位表示四个二进制位,十六进制数比二进制数更紧凑,易于人类阅读和理解。例如,0x1F比00011111更易读。调试和分析:在调试程序或逆向工程时,十六进制用于表示内存地址、数据块和其他信息,使得数据的分析和解释更加直观。内存和地址表示内存地址:计算机系统中的内存地址通常用十六进制表示。例如,内存地址0x7FF9D2B4比十进制的2147483652更简洁,便于理解和操作。文件格式:很多文件格式和网络协议使用十六进制来表示数据,以便于在各种平台之间进行传输和解析。
(还有好多基址地址内存储存有兴趣自己搜搜,怕劝退)
这篇关于入门逆向-入土为安的第二十五天的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!