《CTF特训营》学习总结——Reverse:逆向分析概述

2023-11-20

一、逆向分析的主要方法

逆向分析主要是将二进制机器码进行反汇编得到汇编代码,在汇编代码的基础上,进行功能分析。经过反编译生成的汇编代码中缺失了源代码中的符号、数据结构等信息,因此需要尽可能地通过逆向分析还原以上信息,以便分析程序原有逻辑和功能。逆向分析主要包括静态和动态分析。

1.静态分析

是在不执行代码文件地情况下,对代码进行静态分析,通过对代码外部特征进行观察,主要包括静态反汇编、反编译。

文件类型分析主要是用于了解程序是什么语言编写的,或者是用什么编译器编译的,以及程序是否被加密处理过。

在逆向过程中,主要是使用反汇编工具查看内部代码,分析代码结构。

2.动态分析

是在程序文件的执行过程中对代码进行动态分析的一种方法,其通过调试来分析代码,获取内存的状态等。在逆向过程中,通常使用调试器来分析程序内部结构和实现原理。

二、汇编指令体系结构

1.x86指令架构

(1)寄存器组

通用寄存器:包括EAX、EBX、ECX、EDX、ESI、EBP、ESP

指令指针寄存器(EIP):指向当前要执行的指令

状态标识寄存器(EFLAGS):根据状态标识寄存器中状态的值控制程序的分支转跳

段寄存器:CS、DS、SS、ES、FS、GS。在当前的操作系统,CS、DS、SS和ES的段寄存器的基地址通常为0.

特殊寄存器:包括DRO-DR7,用于设置硬件断点

(2)汇编指令集

x86汇编语言有两种语法记法:intel和AT&T,常用的IDA pro、OD、MASM这些逆向分析工具使用intel记法,而UNIX系统上的工具gcc通常遵循AT&T记法,intel记法更常用

intel的汇编语言格式为:

操作项 目的操作数,源操作数

操作项:汇编语言中的一些指令,比如add(加法)、mov(移动)等指令

目的操作数和源操作数:寄存器、内存地址或者立即数

(3)数据传送指令

数据传送指令是使用最频繁的指令,其格式为:

MOV DEST,SRC
功能:将一个字节、字或者双子从原操作数SRC传送至目的操作数DEST

(4)栈操作与函数调用

入栈PUSH,出栈POP,函数调用与返回通过CALL/RET指令实现,CALL指令将当前的EIP保存到堆栈中,RET指令读取堆栈,得到返回地址。

入栈:PUSH SRC          功能:ESP-=4;[ESP]=SRC

出栈:POP DEST          功能:DEST-=[ESP];ESP+=4

调用函数:CALL FUNC 功能:PUSH EIP;EIP=FUNC

函数返回:RET              功能:EIP=[ESP];ESP+=4

5)算数、逻辑运算指令

①算数运算指令

ADD: 加法。

ADC: 带进位加法

INC:   加1

AAA: 加法的ASCII码调整

DAA: 加法的十进制调整

SUB: 减法

SBB: 带借位减法

DEC: 减1

NEG: 取补

CMP: 比较。(两操作数作减法,仅修改标志位,不回送结果)

AAS: 减法的ASCII码调整

DAS: 减法的十进制调整。

MUL: 无符号乘法。结果回送AH和AL(字节运算),或DX和AX(字运算)

IMUL: 整数乘法。结果回送AH和AL(字节运算),或DX和AX(字运算)

AAM: 乘法的ASCII码调整。

DIV: 无符号除法:商回送AL,余数回送AH,(字节运算);或商回送AX,余数回送DX(字运算)

IDIV: 整数除法:商回送AL,余数回送AH,(字节运算);或商回送AX,余数回送DX(字运算)

AAD: 除法的ASCII码调整

CBW: 字节转换为字(把AL中字节的符号扩展到AH中去)

CWD: 字转换为双字(把AX中的字的符号扩展到DX中去)

CWDE: 字转换为双字(把AX中的字符号扩展到EAX中去)

CDQ: 双字扩展(把EAX中的字的符号扩展到EDX中去)

②逻辑运算指令

AND: 与运算

or: 或运算

XOR: 异或运算

NOT: 取反

TEST: 测试(两操作数作与运算,仅修改标志位,不回送结果)、

(6)转移控制指令

①无条件转移指令(长转移)

JMP: 无条件转移指令

CALL: 过程调用

RET/RETF: 过程返回

②条件转移指令(短转移:短转移,-128到+127的距离内;当且仅当(SF、XOR、OF)=1时,OP1<OP2 )

A/JNBE: 大于转移

JAE/JNB: 大于或等于转移

JB/JNAE: 小于转移

JBE/JNA: 小于或等于转移

以上四条,测试无符号整数运算的结果(标志C和Z)

JG/JNLE: 大于转移

JGE/JNL: 大于或等于转移

JL/JNGE: 小于转移

JLE/JNG: 小于或等于转移

以上四条,测试带符号整数运算的结果(标志S,O和Z)

JE/JZ: 等于转移

JNE/JNZ: 不等于时转移

JC: 有进位时转移

JNC: 无进位时转移

JNO: 不溢出时转移

JNP/JPO: 奇偶性为奇数时转移

JNS: 符号位为 "0" 时转移

JO: 溢出转移

JP/JPE: 奇偶性为偶数时转移

JS: 符号位为 "1" 时转移

③循环控制指令(短转移)

LOOP: CX不为零时循环

LOOPE/LOOPZ: CX不为零且标志Z=1时循环

LOOPNE/LOOPNZ: CX不为零且标志Z=0时循环

JCXZ: CX为零时转移

JECXZ: ECX为零时转移

④中断指令

INT:    中断指令

INTO: 溢出中断

IRET: 中断返回

(7)数据传输指令

①数据传送指令

MOV:传送字或字节。

MOVSX:先符号扩展,再传送。

MOVZX:先零扩展,再传送。

PUSH:把字压入堆栈

POP: 把字弹出堆栈

PUSHA: 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈

POPA: 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈

PUSHAD: 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈

POPAD: 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈

BSWAP: 交换32位寄存器里字节的顺序。

XCHG: 交换字或字节。( 至少有一个操作数为寄存器,段寄存器不可作为操作数)

CMPXCHG: 比较并交换操作数。(第二个操作数必须为累加器AL/AX/EAX)

XADD: 先交换再累加。( 结果在第一个操作数里 )

XLAT: 字节查表转换── BX 指向一张 256 字节的表的起点,AL 为表的索引值(0-255,即0-FFH); 返回 AL 为查表结果 ( [BX+AL]->AL) [6] 

②输入输出端口传送指令

IN: I/O端口输入。( 语法:IN 累加器,{端口号│DX} )

OUT: I/O端口输出. (语法:OUT {端口号│DX},)输入输出端口由立即方式指定时,其范围是 0-255;由寄存器DX 指定时,其范围是 0-65535。

③目的地址传送指令

LEA: 装入有效地址例:LEA DX,string;把偏移地址存到DX。

LDS: 传送目标指针,把指针内容装入DS。例: LDS SI,string;把段地址:偏移地址存到DS:SI。

LES: 传送目标指针,把指针内容装入ES。例: LES DI,string;把段地址:偏移地址存到ES:DI。

LFS: 传送目标指针,把指针内容装入FS。例: LFS DI,string;把 段地址:偏移地址存到FS:DI。

LGS: 传送目标指针,把指针内容装入GS。例: LGS DI,string;把 段地址:偏移地址存到GS:DI。

LSS: 传送目标指针,把指针内容装入SS。例: LSS DI,string;把 段地址:偏移地址存到SS:DI。

④标志传送指令

LAHF:标志寄存器传送,把标志装入AH。

SAHF:标志寄存器传送,把AH内容装入标志寄存器。

PUSHF: 标志入栈

POPF: 标志出栈

PUSHD: 32位标志入栈

POPD: 32位标志出栈

(8)伪指令

DB: 定义字节(1字节)

DW: 定义字(2字节)

DD: 定义双字(4字节)

PROC: 定义过程

ENDP: 过程结束

SEGMENT: 定义段

ASSUME: 建立段寄存器寻址

ENDS: 段结束

END: 程序结束

(9)处理机控制指令

即标志处理指令,处理机控制指令完成简单的控制功能。

CLC:进位位置0指令

CMC:进位位求反指令

CLC: 进位位置为0指令

STC: 进位位置为1指令

CLD: 方向标志位置0指令

STD: 方向标志位置1指令

CLI: 中断标志置0指令

STI: 中断标志置1指令

NOP: 无操作

HLT: 停机

WAIT: 等待

ESC: 换码

LOCK: 封锁

(10)特殊指令

int3指令:对应字节码0xcc,主要用于设置软断点

int 0x80:linux系统中32位的系统调用指令

三、x86应用程序二进制接口

调用惯例是指一些规则,其规定了在机器层面如何进行函数调用,对于特定的系统来说,它是由应用程序二进制接口(ABI)定义的。x86指令体系中的函数调用图如下,当发生函数调用时,首先将参数从右向左加入堆栈中,然后通过call指令将函数的返回地址压入堆栈中,最后,在新的函数中将之前的ebp保存到堆栈中,同时esp会减去一定的值,留下一部分分栈空间给局部变量使用。

四、x64指令体系架构

1.寄存器

通用寄存器加到16个,分别为RAX,RBX,RDX,RCX,RBP,RDI,RSI,RSP,R8~R15

2.系统调用指令

syscall/sysret是linux64位操作系统的调用方式

3.x64应用程序二进制接口

有两种广泛使用的x64 ABI,列举如下:

microsoft's x64 ABI:主要用于windows操作系统中的64位程序

sysV x64 ABI:主要用于linux,BSD,MAC等操作系统的64位程序

microsoft's x64 ABI的前4个参数通过寄存器RCX,RDX,R8,R9传递,其余则是通过栈传递,但是在栈上会预留下0x20字节的空间用于临时保存前4个参数,返回值位RAX,对应的函数调用形式如下:

RAX func (RCX,RDX,R8,R9,[rsp+0x20],[rsp+0x28],.....}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《CTF特训营》学习总结——Reverse:逆向分析概述 的相关文章

  • 又到年底了,你的年终总结写好了吗?

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读2 2k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • 【网络安全】00后程序员,找 Bug 赚了 6,700,000元!他是怎么挖洞致富的?

    19岁 很多人正是上大学 仍伸手向父母要生活费的年纪 可有一位 00 后阿根廷少年 Santiago Lopez 靠自学成才 赚取了 100 万美元 折合人民币约 670 万元 的 Bug 赏金 成为世界上第一个白帽黑客的百万富翁 美元 少
  • IT圈大实话!卷运维不如卷网络安全

    前言 在刚刚过去的金九银十 我进行了多场网络安全的技术面试 我发现最近很多从事运维的选择了辞职 转行到了网络安全这个发展路线 说实话 运维工程师这个岗位在IT行业里面确实是处于最底层的 不管什么环节出现问题 基本都是运维背锅 薪资水平也比不
  • 【银行测试】金融项目-APP测试要点详细汇总(详全)

    目录 导读 前言 一 Python编程入门到精通 二 接口自动化项目实战 三 Web自动化项目实战 四 App自动化项目实战 五 一线大厂简历 六 测试开发DevOps体系
  • 软件测试|Python Selenium 库安装使用指南

    简介 Selenium 是一个用于自动化浏览器操作的强大工具 它可以模拟用户在浏览器中的行为 例如点击 填写表单 导航等 在本指南中 我们将详细介绍如何安装和使用 Python 的 Selenium 库 安装 Selenium 库 使用以下
  • 掌握内网渗透之道,成为实战高手,看《内网渗透实战攻略》就够了

    文末送书 文末送书 今天推荐一本网络安全领域优质书籍 内网渗透实战攻略 文章目录 前言 如何阅读本书 目录 文末送书 前言 当今 网络系统面临着越来越严峻的安全挑战 在众多的安全挑战中 一种有组织 有特定目标 长时间持续的新型网络攻击日益猖
  • 软件测试|Python openpyxl库使用指南

    简介 我们之前介绍过 python在自动化办公方面可以大放异彩 因为Python有许多的第三方库 其中有很多库就支持我们对office软件进行操作 熟练的使用Python对office进行操作 可以实现自动化办公 极大提升我们的工作效率 本
  • J2EE常见面试题(一)

    StringBuilder和StringBuffer的区别 String 字符串常量 不可变 使用字符串拼接时是不同的2个空间 StringBuffer 字符串变量 可变 线程安全 字符串拼接直接在字符串后追加 StringBuilder
  • 用户数据中的幸存者偏差

    幸存者偏差 Survivorship bias 是一种常见的逻辑谬误 意思是没有考虑到筛选的过程 忽略了被筛选掉的关键信息 只看到经过筛选后而产生的结果 先讲个故事 二战时 无奈德国空防强大 盟军战机损毁严重 于是军方便找来科学家统计飞机受
  • 2024年网络安全十10大发展趋势发布

    2023年网络安全十10大发展趋势发布 近日 中国计算机学会 CCF 计算机安全专委会中 来自国家网络安全主管部门 高校 科研院所 大型央企 民营企业的委员投票评选出2023年网络安全十大发展趋势 福利 趋势一 数据安全治理成为数字经济的基
  • 2024年金三银四网络安全考试试题

    2023年金三银四网络安全考试试题 1 关于数据使用说法错误的是 A 在知识分享 案例中如涉及客户网络数据 应取敏感化 不得直接使用 B 在公开场合 公共媒体等谈论 传播或发布客户网络中的数据 需获得客户书面授权或取敏感化 公开渠道获得的除
  • Android SDK开发艺术探索(五)安全与校验

    一 前言 本篇是Android SDK开发艺术探索系列的第五篇文章 介绍了一些SDK开发中安全方面的知识 包括资源完整性 存储安全 权限校验 传输安全 代码混淆等知识 通过基础的安全配置为SDK保驾护航 探索SDK开发在安全方面的最佳实践
  • 「网络安全渗透」如果你还不懂CSRF?这一篇让你彻底掌握

    1 什么是 CSRF 面试的时候的著名问题 谈一谈你对 CSRF 与 SSRF 区别的看法 这个问题 如果我们用非常通俗的语言讲的话 CSRF 更像是钓鱼的举动 是用户攻击用户的 而对于 SSRF 来说 是由服务器发出请求 用户 日 服务器
  • 200道网络安全常见面试题合集(附答案解析+配套资料)

    有不少小伙伴面临跳槽或者找工作 本文总结了常见的安全岗位面试题 方便各位复习 祝各位事业顺利 财运亨通 在网络安全的道路上越走越远 所有的资料都整理成了PDF 面试题和答案将会持续更新 因为无论如何也不可能覆盖所有的面试题 php爆绝对路径
  • 【网络安全】Facebook代码执行实现命令执行、敏感信息泄露

    部分网站开设编码练习 若安全配置不当 则代码执行将升级为操作系统命令注入 导致敏感信息泄露 本文仅分享命令执行相关知识 不承担任何由于传播 利用本文所发布内容而造成的任何后果及法律责任 未经许可 不可转载 文章目录 信息泄露 扩大危害 信息
  • 软件测试|web自动化测试神器playwright教程(三十八)

    简介 在我们使用selenium时 我们可以获取元素的属性 元素的文本值 以及输入框的内容等 作为比selenium更为强大的web自动化测试神器 playwright也可以实现对元素属性 文本值和输入框内容的抓取 并且实现比seleniu
  • 跨平台UI自动化框架:Airtest,游戏开发和应用测试的利器

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读2 3k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • 渗透测试常用工具汇总_渗透测试实战

    1 Wireshark Wireshark 前称Ethereal 是一个网络分包分析软件 是世界上使用最多的网络协议分析器 Wireshark 兼容所有主要的操作系统 如 Windows Linux macOS 和 Solaris kali
  • UI自动化测试之Jenkins配置

    背景 团队下半年的目标之一是实现自动化测试 这里要吐槽一下 之前开发的测试平台了 最初的目的是用来做接口自动化测试和性能测试 但由于各种原因 接口自动化测试那部分功能整个废弃掉了 其中和易用性有很大关系 另外 也和我们公司的接口业务也有关
  • 【安全】网络安全态势感知

    文章目录 一 态势感知简介 1 概念 2 形象举例 3 应具备的能力 二 为什么要态势感知 为什么网络安全态势感知很重要 三 态势感知系统的功能 四 如何评估态势感知的建设结果 五 什么是态势感知的三个层级 四 业界的态势感知产品 1 安全

随机推荐

  • VC从系统进程中查找并杀掉指定进程

    写程序的时候 有时候会调用别 别人写的 的程序的EXE 有的时候还会隐藏这个EXE 但是由于你的程序退出时并没有关闭这个EXE 只是隐藏了 所以在系统的进程查看窗口里面还是会看到的 这样当你下次再执行你自己的程序 还要调用这个程序的时候就会
  • [转载]解决PPPOE宽带拨号经常掉线的一种方法(适合刷了第三方固件的无线路由)

    文章作者 姜南 Slyar 文章来源 Slyar Home www slyar com 转载请注明 谢谢合作 最近在进行下载或看视频等大量占用网络带宽的行为时 宽带PPPOE连接非常不稳定 经常自动掉线 严重影响我的下载进程和看视频的乐趣
  • MariaDB数据库的主从配置

    1 前置工作 首先准备两台可以互相ping通的机器 两台机器可以互为主从 示例 10 210 23 77主服务器 10 20 84 183从服务器 2 安装 在两台机器上各自安装数据 解压MariaDB安装包 tar zxvf MariaD
  • 基于深度学习的无人机在室内走廊环境中的视觉导航

    与激光雷达和雷达不同 使用单目摄像头作为无人机传感器的优势之一是它能够检测各种视觉特征 例如颜色 纹理和形状 这种适应性使其能够在各种室内和室外环境中表现良好 将单目摄像头用于无人机的另一个好处是 它允许更轻巧和灵活的设计 该摄像机不需要额
  • 5 个免费的受欢迎的 SQLite 管理工具

    SQLite Expert Personal Edition SQLite Expert 提供两个版本 分别是个人版和专业版 其中个人版是免费的 提供了大多数基本的管理功能 SQLite Expert 可以让用户管理 SQLite3 数据库
  • 区块链中的哈希算法

    区块链中的密码学 密码学在区块链中的应用主要有两个 哈希算法与非对称加密算法 这次主要对哈希算法进行详细的说明 哈希算法 哈希算法的特点有 1 输入可以为任意大小的字符串 2 产生固定大小的输出 3 可以在合理的时间内算出输出值 若要满足密
  • input框限制输入40个字符_input标签的 maxlength 属性(HTML限制最大输入字数)

    实例 下面这个 HTML 表单带有最大长度分别是 85 和 55 个字符的两个输入字段 Name Email 亲自试一试 定义和用法 maxlength 属性规定输入字段的最大长度 以字符个数计 maxlength 属性与 或 配合使用 语
  • centos 修改时间

    文章目录 centos 修改时间 1 查询时间常用命令 2 修改时区 3 修改时间 3 1 手动修改时间 3 2 联网修改时间 centos 修改时间 Centos系统时间分为系统时间和硬件时间 二者必须都修改 重启系统才会永久生效 背景
  • 深入分析linux内核的内存分配函数devm_kzalloc

    在分析驱动代码的时候 经常会遇到使用devm kzalloc 为一个设备分配一片内存的情况 devm kzalloc 是内核用来分配内存的函数 同样可以分配内存的内核函数还有devm kmalloc kzalloc kmalloc 它们之间
  • Android简单的反编译嵌入例子

    简单的反编译嵌入例子 1 创建一个源工程 2 创建一个转接类 如Ed Sdk java 3 在转接类里面建立一个空方法A 方法A需要被调用 4 创建一个库工程 2 创建一个库转接类 如Ed Sdk java 类名方法名变量名完全相同 6 在
  • Java和Scala中泛型类的继承

    Java和Scala中泛型类的继承 1 泛型的学习 2 泛型类的继承 1 泛型的学习 参考 Java编程的逻辑一书 马骏昌编写的 对泛型的讲解很详细 这里着重补充一下关于泛型类的继承 2 泛型类的继承 这里主要有三种情况 存在父类 clas
  • 利用TBDBitmapData对象查找两张图片上的不同

    利用TBDBitmapData对象查找两张图片上的不同 从右上角开始利用双层循环遍历两图上的所有象素点 并相互比较 不完整代码如下 procedure TForm1 Button5Click Sender TObject var Bmp1
  • [人工智能-深度学习-53]:循环神经网络 - LSTM长短记忆时序模型的简化:门控循环网络GRU模型

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 121599096 目录 第1章 前序知
  • HTML开始历程Day01

    1 HTML 其实就是网页基本结构 CSS 功能 美化网页 不让网页太单调 JS 功能 能让网页动起来 产生很多的交互行为 HTML是什么 Hyper Text Markup Language 超文本标记语言 服务器端口号 路径位置 HTM
  • Linux下用命令行编译运行Java总结

    最近使用腾讯云的Cloud Studio写Java 只能使用命令行进行编译运行 趁此机会 学习一下Linux的一些常用命令 平时windows下IDE用习惯了 现在用命令行进行编译运行 发现其实问题还是挺多的 所以写下这篇文章 1 java
  • WordPress主题开发 — 模版循环(条件判断、多个循环、新建查询和文章循环)

    循环是 WordPress 通过主题模板文件输出文章的默认机制 在循环中 WordPress 遍历当前页面获取到的所有文章 然后使用主题中的模版标签将其格式化并输出 我们可以用 WordPress 循环来做很多事情 例如 在网站首页显示多个
  • java IO、NIO、AIO详解

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 一 IO流 同步 阻塞 二 NIO 同步 非阻塞 三 NIO2 异步 非阻塞 正文 回到顶部 概述 在我们学习Java的IO流之前 我们都要了解几个关键词 同步与异步 sy
  • hyperledger fabric介绍

    一 Hyperledger Fabric介绍 2015年 Linux基金会启动了Hyperledger项目 目标是发展跨行业的区块链技术 Hyperledger Fabric是Hyperledger中的一个区块链项目 包含一个账本 使用智能
  • 使用php生成6位密码大全,php生成随机产生六位数密码的代码

    php生成随机产生六位数密码的代码 供大家学习参考 复制代码代码示例 随机产生六位数密码Begin function randStr len 6 format ALL switch format case ALL chars ABCDEFG
  • 《CTF特训营》学习总结——Reverse:逆向分析概述

    一 逆向分析的主要方法 逆向分析主要是将二进制机器码进行反汇编得到汇编代码 在汇编代码的基础上 进行功能分析 经过反编译生成的汇编代码中缺失了源代码中的符号 数据结构等信息 因此需要尽可能地通过逆向分析还原以上信息 以便分析程序原有逻辑和功