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

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

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题:

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

poj 2104 and hdu 2665 划分树模板入门题

题意: 给一个数组n(1e5)个数,给一个范围(fr, to, k),求这个范围中第k大的数。 解析: 划分树入门。 bing神的模板。 坑爹的地方是把-l 看成了-1........ 一直re。 代码: poj 2104: #include <iostream>#include <cstdio>#include <cstdlib>#include <al

MySQL-CRUD入门1

文章目录 认识配置文件client节点mysql节点mysqld节点 数据的添加(Create)添加一行数据添加多行数据两种添加数据的效率对比 数据的查询(Retrieve)全列查询指定列查询查询中带有表达式关于字面量关于as重命名 临时表引入distinct去重order by 排序关于NULL 认识配置文件 在我们的MySQL服务安装好了之后, 会有一个配置文件, 也就

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

C语言指针入门 《C语言非常道》

C语言指针入门 《C语言非常道》 作为一个程序员,我接触 C 语言有十年了。有的朋友让我推荐 C 语言的参考书,我不敢乱推荐,尤其是国内作者写的书,往往七拼八凑,漏洞百出。 但是,李忠老师的《C语言非常道》值得一读。对了,李老师有个官网,网址是: 李忠老师官网 最棒的是,有配套的教学视频,可以试看。 试看点这里 接下来言归正传,讲解指针。以下内容很多都参考了李忠老师的《C语言非

MySQL入门到精通

一、创建数据库 CREATE DATABASE 数据库名称; 如果数据库存在,则会提示报错。 二、选择数据库 USE 数据库名称; 三、创建数据表 CREATE TABLE 数据表名称; 四、MySQL数据类型 MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串类型 4.1 数值类型 数值类型 类型大小用途INT4Bytes整数值FLOAT4By

【QT】基础入门学习

文章目录 浅析Qt应用程序的主函数使用qDebug()函数常用快捷键Qt 编码风格信号槽连接模型实现方案 信号和槽的工作机制Qt对象树机制 浅析Qt应用程序的主函数 #include "mywindow.h"#include <QApplication>// 程序的入口int main(int argc, char *argv[]){// argc是命令行参数个数,argv是