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

2024-08-27 04:36

本文主要是介绍入门逆向-入土为安的第二十五天,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

逆向工程基本概念

  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并初始化为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], 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更简洁,便于理解和操作。文件格式:很多文件格式和网络协议使用十六进制来表示数据,以便于在各种平台之间进行传输和解析。

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

这篇关于入门逆向-入土为安的第二十五天的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1110648

相关文章

从入门到精通详解Python虚拟环境完全指南

《从入门到精通详解Python虚拟环境完全指南》Python虚拟环境是一个独立的Python运行环境,它允许你为不同的项目创建隔离的Python环境,下面小编就来和大家详细介绍一下吧... 目录什么是python虚拟环境一、使用venv创建和管理虚拟环境1.1 创建虚拟环境1.2 激活虚拟环境1.3 验证虚

Java List 使用举例(从入门到精通)

《JavaList使用举例(从入门到精通)》本文系统讲解JavaList,涵盖基础概念、核心特性、常用实现(如ArrayList、LinkedList)及性能对比,介绍创建、操作、遍历方法,结合实... 目录一、List 基础概念1.1 什么是 List?1.2 List 的核心特性1.3 List 家族成

c++日志库log4cplus快速入门小结

《c++日志库log4cplus快速入门小结》文章浏览阅读1.1w次,点赞9次,收藏44次。本文介绍Log4cplus,一种适用于C++的线程安全日志记录API,提供灵活的日志管理和配置控制。文章涵盖... 目录简介日志等级配置文件使用关于初始化使用示例总结参考资料简介log4j 用于Java,log4c

史上最全MybatisPlus从入门到精通

《史上最全MybatisPlus从入门到精通》MyBatis-Plus是MyBatis增强工具,简化开发并提升效率,支持自动映射表名/字段与实体类,提供条件构造器、多种查询方式(等值/范围/模糊/分页... 目录1.简介2.基础篇2.1.通用mapper接口操作2.2.通用service接口操作3.进阶篇3

Python自定义异常的全面指南(入门到实践)

《Python自定义异常的全面指南(入门到实践)》想象你正在开发一个银行系统,用户转账时余额不足,如果直接抛出ValueError,调用方很难区分是金额格式错误还是余额不足,这正是Python自定义异... 目录引言:为什么需要自定义异常一、异常基础:先搞懂python的异常体系1.1 异常是什么?1.2

Python实现Word转PDF全攻略(从入门到实战)

《Python实现Word转PDF全攻略(从入门到实战)》在数字化办公场景中,Word文档的跨平台兼容性始终是个难题,而PDF格式凭借所见即所得的特性,已成为文档分发和归档的标准格式,下面小编就来和大... 目录一、为什么需要python处理Word转PDF?二、主流转换方案对比三、五套实战方案详解方案1:

Spring WebClient从入门到精通

《SpringWebClient从入门到精通》本文详解SpringWebClient非阻塞响应式特性及优势,涵盖核心API、实战应用与性能优化,对比RestTemplate,为微服务通信提供高效解决... 目录一、WebClient 概述1.1 为什么选择 WebClient?1.2 WebClient 与

Spring Boot 与微服务入门实战详细总结

《SpringBoot与微服务入门实战详细总结》本文讲解SpringBoot框架的核心特性如快速构建、自动配置、零XML与微服务架构的定义、演进及优缺点,涵盖开发环境准备和HelloWorld实战... 目录一、Spring Boot 核心概述二、微服务架构详解1. 微服务的定义与演进2. 微服务的优缺点三

从入门到精通详解LangChain加载HTML内容的全攻略

《从入门到精通详解LangChain加载HTML内容的全攻略》这篇文章主要为大家详细介绍了如何用LangChain优雅地处理HTML内容,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录引言:当大语言模型遇见html一、HTML加载器为什么需要专门的HTML加载器核心加载器对比表二

从入门到进阶讲解Python自动化Playwright实战指南

《从入门到进阶讲解Python自动化Playwright实战指南》Playwright是针对Python语言的纯自动化工具,它可以通过单个API自动执行Chromium,Firefox和WebKit... 目录Playwright 简介核心优势安装步骤观点与案例结合Playwright 核心功能从零开始学习