入门逆向-入土为安的第二十五天

逆向工程基本概念

  1. 目标:逆向工程的主要目标是理解程序的逻辑、数据流和执行流程,以便找到隐藏的信息或解决CTF中的挑战。

  2. 常见文件类型

    • 可执行文件(如 ELF、PE 文件)

    • 脚本文件(如 Python, JavaScript, etc.)

    • 固件(嵌入式设备中的二进制文件)

  3. 工具

    • 反汇编工具:如 IDA Pro, Ghidra, Radare2,辅助将二进制文件转换为可读的汇编代码。

    • 调试工具:如 GDB, x64dbg, WinDbg 等,用于动态分析和程序跟踪。

    • 十六进制编辑器:如 HxD, 010 Editor, 用于在字节级别修改文件。

    • 静态分析工具:如 Binwalk, Strings, 并查找字符串和其他信息。

逆向工程的基本步骤

  1. 环境配置

    • 安装必要的工具和插件,配置好调试环境。

  2. 初步分析

    • 使用工具查看可执行文件的元数据,例如文件类型、编译器信息、导入表等。这通常可以用 file 命令或其他工具来完成。

  3. 静态分析

    • 开始对二进制文件进行静态分析:

      • 识别和查找关键函数(如 main 函数)。

      • 查找字符串常量、格式化字符串等。

      • 识别程序的控制流和数据流(可以用图形化工具表示)。

  4. 动态分析

    • 使用调试器跟踪程序的执行:

      • 设置断点观察特定函数或代码块的执行。

      • 修改寄存器或内存中的数据以查看程序的响应。

      • 分析程序的输入输出,理解其业务逻辑。

  5. 漏洞分析

    • 查找潜在的漏洞(如缓冲区溢出、格式化字符串漏洞等)。

    • 通过调试定位漏洞代码和触发条件。

  6. 提取信息

    • 如果目标是提取某些秘密标志(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 (占用一个周期,但不进行任何操作)

这些指令构成了汇编语言的基础,通过它们可以实现各种复杂的计算和控制操作。

进制

基础
  1. 二进制(基数为2):只使用0和1,例如,二进制的“101”表示十进制的5

  2. 八进制(基数为8):使用0到7的数字,例如,八进制的“12”表示十进制的10。

  3. 十进制(基数为10):使用0到9的数字,这是我们日常生活中最常用的进制系统。

  4. 十六进制(基数为16):使用0到9和A到F(其中A到F表示10到15),例如,十六进制的“1A”表示十进制的26。

  1. 二进制的重要性基础数据表示计算机内部表示:计算机内部所有的数据和指令都是以二进制形式存储和处理的。二进制的0和1对应计算机的电气状态(如开关),使得计算机能够进行各种操作。逻辑运算:计算机执行的所有逻辑运算和算术运算(如加法、减法、乘法)都是基于二进制的。逻辑门(如与门、或门、非门)在计算机硬件中以二进制为基础进行操作。数据存储内存和存储:计算机的内存(RAM)和存储设备(如硬盘、SSD)都以二进制数据进行读写和存储。这是因为二进制表示方式简单,适合用电子电路进行存储和传输。程序执行机器码:程序的源代码在编译后会转换为机器码,机器码是二进制形式的指令,计算机通过解析这些二进制指令来执行程序。

    • 机器语言

      • 定义:机器语言是计算机能够直接理解和执行的最低级语言,由二进制指令组成,通常由0和1表示。

      • 特征:每条指令由操作码(Opcode)和操作数(Operand)组成,直接与计算机硬件交互,处理器可以直接读取和执行这些指令。

    • 汇编语言

      • 定义:汇编语言是一种低级语言,是机器语言的符号化表示,使用助记符(如 MOVADD)来表示操作。

      • 特征:相对于机器语言,汇编语言更易于阅读和编写,但仍然需要对计算机硬件有一定的了解。汇编语言通过汇编器(Assembler)转换为机器语言。

    • 高级语言

      • 定义:高级语言是一种抽象程度较高的编程语言,如C语言、C++、Java等。它们通常使用更接近自然语言的语法,使得程序更易于理解和维护。

      • 特征:高级语言通常不直接与硬件交互,通过编译器或解释器转换为机器语言。高级语言支持面向对象、结构化编程等高级特性。

  • 机器语言:由于直接与硬件交互,执行速度最快。

  • 汇编语言:虽然比机器语言稍慢,但仍然高效,因其与底层硬件直接相关。

  • 高级语言:通常比汇编和机器语言慢,因为需要经过编译和解释步骤,但开发效率高,易于维护。

  • 1. C语言

这是最高级的语言,代码简洁易读:

#include <stdio.h>
​
int main() {
    int a = 5;      // 定义整数变量a并初始化为5
    a = a + 1;      // 将a的值加1
    printf("%d\n", a);  // 输出a的值
    return 0;       // 程序正常退出
}
​
2. 汇编语言

在x86架构下,以下是实现相同功能的汇编语言代码:

section .data
    msg db "%d", 0    ; 定义格式化字符串
​
section .bss
    num resd 1        ; 为整数变量分配空间
​
section .text
    global _start
​
_start:
    ; 初始化变量
    mov dword [num], 5    ; 将值5存入变量num
​
    ; 加1操作
    mov eax, [num]        ; 将num的值加载到寄存器eax
    add eax, 1            ; 将eax中的值加1
    mov [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], 5C7 05 00 00 00 05 00 00 00

  • mov eax, [num]8B 05 00 00 00 00

  • add eax, 183 C0 01

  • mov [num], eax89 05 00 00 00 00

  • mov eax, 4B8 04 00 00 00

  • mov ebx, 1BB 01 00 00 00

  • mov ecx, numB9 00 00 00 00

  • mov edx, 4BA 04 00 00 00

  • int 0x80CD 80

  • mov eax, 1B8 01 00 00 00

  • xor ebx, ebx31 DB

  • int 0x80CD 80

2.十六进制的重要性简化表示数据可读性:十六进制是一种更简洁的方式来表示和查看二进制数据。由于每个十六进制位表示四个二进制位,十六进制数比二进制数更紧凑,易于人类阅读和理解。例如,0x1F比00011111更易读。调试和分析:在调试程序或逆向工程时,十六进制用于表示内存地址、数据块和其他信息,使得数据的分析和解释更加直观。内存和地址表示内存地址:计算机系统中的内存地址通常用十六进制表示。例如,内存地址0x7FF9D2B4比十进制的2147483652更简洁,便于理解和操作。文件格式:很多文件格式和网络协议使用十六进制来表示数据,以便于在各种平台之间进行传输和解析。

(还有好多基址地址内存储存有兴趣自己搜搜,怕劝退)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值