逆向入门基础

0x01 处理器硬件框架基础

一、8086汇编基础

1、CPU结构
        CPU由寄存器、算术逻辑单元ALU、 控制器和内部总线四部分构成。
        寄存器记录了操作系统关键数据结构信息,是软件漏洞与恶意代码分析的基础信息。

寄存器与内存
寄存器是中央处理器内的组成部份(寄存器是CPU内部的元件),是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和位址。
内存一般分为只读存储器(ROM)、随机存储器(RAM)和高速缓存存储器(cache)

内存的工作流程比寄存器多出许多步。每一步都会产生延迟,累积起来就使得内存比寄存器慢得多。

        CPU按照字长可分为16位、32位和64位。根据字长不同寄存器名称也不一样,如下图。


CPU寄存器
- 通用数据寄存器(GPRs)
------EAX、ECX、EDX、EBX,通常用于存储参与运算的数据及运算结果。
------ECX常被用于存储循环处理指令的循环次数,ECX 常作为C++中的this指针。
------EAX和EDX常作为乘除法指 令的隐含操作数,EAX常作为函数返回值。
- 数据指针寄存器
------ESP记录了当前的栈顶,call、ret、push、pop、pusha、 popa等指令会改变ESP寄存器的值。
------EBP通常记录的是当前函数的栈底,leave指令在函数返回前通过EBP还原ESP。
------ESI和EDI作为变址寄存器。
- 指令指针寄存器
------EIP存储了当前执行指令的地址。系统根据该寄存器进行寻址,从内存中取出指令,然后再译码、执行。
- 标志位寄存器
------ZF零标志等等
- 段寄存器
------实模式下段寄存器通常与指针寄存器如ESP、EDI、 ESI等联合使用,保护模式下需要与􏰁述符表结 合使用。
------CPU中的段寄存器:CS(代码段寄存器)、DS(数据段寄存器)、SS(堆栈段寄存器)、 ES(附加段寄存器)、 FS(附加段寄存器)、GS(附加段寄存器)
- 控制寄存器
------控制寄存器包括CR0、CR1、CR2、CR3、CR4这5个,记录着处理器的运行模式和当前执行任务的属性。
------CR0记录了系统控制标志,控制处理器的运行模式和状态。
------CR1是保留的控制寄存器,用于之后的扩展。
------CR2记录了引起页故障的线性地址。
------CR3是页表寄存器,存储了20位的页目录表的基地址和2个标志位PCD、PWT。
------CR4包含一组标志,用于决定是否启用IA-32架构 上的几个扩展,如虚拟8086模式扩展、调试扩展等。
- 系统地址寄存器
------GDTR是全局􏰁述符表寄存器。
------IDTR是中断􏰁述符表寄存器。

64位的x86 CPU结构上的变化:在x64中,所有通用寄存器都从32位扩充到了64位, 8个通 用寄存器(EAX, EBX, ECX, EDX, EBP, ESP, ESI, EDI)被 重新命名为RAX, RBX, RCX, RDX, RBP, RSP, RSI, RDI 。所有算术逻辑操作、寄存器到内存的数据传输都能以64位 的整形类型进行操作。堆栈的压栈和弹出操作都以8字节的 单位进行,指针类型也是64位。

2、汇编语言
        汇编语言中使用助记符代表机器指令的操作码(mov等), 使用地址符号或标号代替指令或操作数的地址, 不同的硬件架构对应不同的机器语言指令集,通过汇编过程转换成机器指令。
        AT&T汇编格式与Intel汇编格式在寄存器命名规则、源/目的操作数顺序、常数/立即数的格式、操作数长度标识、寻址方式都有差别,具体可查看相关手册。
        常用汇编指令:

  • StackPivot切换堆栈:xchg eax esp == push eax, pop esp
  • 函数调用与返回:编译器的高级优化技术会导致call-ret指令不匹配。
  • slide code(滑板指令):NOP slide(堆喷射)
二、保护模式

1、实模式和保护模式
        IA-32架构的CPU有2种工作方式:实模式和保护模式。实模式不支持多线程、不能实现权限分级;保护模式下引入内存的分页和分段管理机制,实现了内存分页和权限分级,并支持多线程、多任务。
        保护模式内存寻址三种地址:逻辑地址、线性地址、物理地址。分段机制将逻辑地址转换成线性地址。分页机制将线性地址转换成物理地址。

– 逻辑地址(logicaladdress):是机器语言指令中用来指定一个操作
数或者是一条指令的地址。
– 线性地址(linearaddress):是对整个进程内存空间的抽象描􏰁述。
– 物理地址(physicaladdress):用于内存芯片级的单元寻址,与 CPU连接的地址总线相对应。

2、特权级
        CPU权限级别分4个等级Ring0~Ring3,Windows使用Ring0和 Ring3这2个特权级。特权指令只能运行在Ring0特权级,用户态下无法执行这些指令,需在操作系统内核态下运行。

三、中断和异常处理

        中断和异常是程序执行过程中的插曲,需要处理器强 制暂停当前任务,转移到一个称为中断处理程序或者异常处理程序的特殊任务中。处理器响应中断或者异常所采取的行动称为中断服务或者异常处理。
        中断是在程序执行期间随机发生,可以是对硬件信号的响应,如鼠标键盘;也可以是软件中断,如INT n指令。
        异常是在处理器执行指令过程中发现错误情况产生的, 比如除0错误、保护违例、页故障、内部机器故障。


中断和异常处理
四、调试支持

        标志寄存器EFLAGS中的IF、TF标志。8个调试寄存器DR0-DR7。


调试特殊情况
五、虚拟化支持

        Intel的VT虚拟化技术。

0x02 反汇编与反编译基础

一、反汇编

        反汇编:机器码转换为汇编指令。

反汇编流程步骤:
– 根据可执行文件的格式规范(PE或ELF)确定反汇编的代码区域和代码入口的位置;
– 读取二进制机器指令,执行表查找,将机器码的值与对应的汇编语言助记符􏰀取出来,根据指令
状态机􏰀取操作数;
– 对汇编语言等价形式进行格式化,输出反汇编代码,可用Intel格式或AT&T格式;
– 重复上述过程,继续反汇编下一条指令,直到反汇编完程序文件中的指令。

        反汇编算法主要分为以下两类:

  • 线性扫描反汇编算法:优点是能够完全覆盖程序所有代码。缺点是没有考虑到代码中混有数据的情况,将数据当成指令解析可能导致无法预估的错误。采用线性扫􏰁反汇编算法的工具有GNU调试器gdb, 微软的WinDbg调试器和GNU Binutils中的objdump。
  • 递归下降扫描反汇编算法:递归下降扫􏰁反汇编算法加入了对控制流指令的解析,根据指令是否被另一条指令引用来决定是否对其进行反汇编。优点是能够区分代码与数据。缺点是无法处理间接代码路径如jmp eax,call eax等;另外需要对循环进行识别和处理,否则将导致无止境的重复分析。采用递归下降扫􏰁反汇编算法的工具有IDA Pro 反汇编工具。
二、编译

        编译是将高级语言 (如C/C++)转换成计
算机可以识别的机 器指令的过程。
编译可分为六个阶段:词法分析、语法分析、语义分析、 中间代码生成、代码优化、目标代码 生成。
        反编译是编译的逆过程,指将可执行文件的机器指令序列转换成人类熟悉的高级语言源程序的过程,其依赖于编译技术。

三、代码混淆

        一种将计算机程序代码转换成功能上等价,但是难以阅读和理解的变形技术。可分为源代码混淆,二进制代码混淆。代码混淆常应用于对抗逆向的版权保护和恶意代码的反检测。
        代码混淆技术有花指令、加密与加壳保护、控制流混淆等。

0x03 windows操作系统基础

        PC平台流行的可执行文件格式主要有Windows下的PE(Portable Executable)和Linux下的ELF(Executable and Linkable Format),它们都COFF(Common File Format)格式的变种。
        Windows进程采用EPROCESS结构进行管理。线程是程序执行流的最小单元,是进程中的一个实体,是被操作系统独立调度和分派的基本单位。线程本身不独占系统资源,与同属一个进程的其它线程共享进程所拥有的全部资源。

笔记来源:
1、国科大《软件安全漏洞分析与发现》课程
2、寄存器、内存

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,302评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,232评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,337评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,977评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,920评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,194评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,638评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,319评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,455评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,379评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,426评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,106评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,696评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,786评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,996评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,467评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,043评论 2 341

推荐阅读更多精彩内容

  • 1.地址总线,数据总线,控制总线在哪里,它们有什么作用?答:它们都是cpu连接外部组件的线路。地址总线:地址总线A...
    MagicalGuy阅读 1,415评论 0 1
  • 初识汇编 我们是逆向iOS系统上面的APP.那么我们知道,一个APP安装在手机上面的可执行文件本质上是二进制文件....
    looha阅读 587评论 0 2
  • 汇编基础 一、程序的本质 1. 程序的执行过程 如下图所示,执行软件的时候,会将软件从硬盘装载到内存中,然后由C...
    冰风v落叶阅读 1,938评论 0 6
  • 汇编基础教程 16位和32位的80x86汇编语言的区别 需要注意的是汇编不是一种语言,不同平台有不同的汇编语言对应...
    inwunwe阅读 9,470评论 2 19
  • 我们在学习逆向开发之前,我们要了解一个基本的逆向原理.首先我们是逆向iOS系统上面的APP.那么我们知道,一个AP...
    Colin_狂奔的蚂蚁阅读 1,836评论 4 20