loading...
浅谈逆向入门有关的知识
Published in:2022-08-25 | category: CTF | reverse

0x00说明

逆向的本质就是将一个程序反编译成一段段代码,可能是伪代码,也可能是汇编代码。总的来说就是把一个完整的程序分成一小块一小块的代码段,从而对程序进行修改,完成所谓的“破解”。也能通过反编译某些恶意软件或者病毒,去分析它们的可疑、危险行为并进行拦截规则的编写。

0x01前言

我们从最开始的认识机器码开始,机器码是由0和1组成的。CPU只能看得懂机器码,随着计算机的发展,越来越多编程语言的崛起,出现了大量的高级语言,而它们的目的是为了程序员更好的编写看得懂的代码。通过编译器,编译成计算机使用的机器码。而汇编语言也是为了更快转成机器码进行特定指令操作,特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植。

0x02认识触发器

触发器是边沿敏感的存储单元,数据存储的动作有某一信号的上升或者下降沿进行同步的。

触发器是在时钟的沿进行数据的锁存的,而锁存器是用电平使能来锁存数据的。所以触发器的Q输出端在每一个时钟沿都会被更新,而锁存器只能在使能电平有效器件才会被更新。在FPGA设计中建议如果不是必须那么应该尽量使用触发器而不是锁存器。

0x03认识寄存器

什么是寄存器?寄存器的功能是存储二进制代码,它是由具有存储功能的触发器组合起来构成的。一个触发器可以存储1位二进制代码,故存放n位二进制代码的寄存器,需用n个触发器来构成。

寄存器可分为通用寄存器、专用寄存器和段寄存器。

通用寄存器

通用寄存器包括了数据寄存器,变址寄存器和指针寄存器。

而数据寄存器分为累加寄存器(EAX),基址寄存器(EBX),计数寄存器(ECX),数据寄存器(EDX),它们为16位寄存器,负责存储16位数据或者地址,可也用做8位寄存器,当为8位寄存器时,它们分别为AH,AL,BH,BL,CH,CL,DH,DL

EAX常存储运行的结果,来进行真假的判断,EBX常存储基地址,ECX常存储存放的次数,EDX常存储整除产生的余数

变址寄存器是用来存储与循环相关的数据,比如计次,循环开始的地址

变址寄存器分为源地址寄存器(ESI),目的地址寄存器(EDI)

ESI常做内存数据指针和源字符串指针,EDI常做内存数据指针和目的字符串指针

指针寄存器分为基址指针寄存器(EBP),堆栈指针寄存器(ESP)

ESP也称为栈顶寄存器,简单理解为一个方法调用运行的位置

进栈时,esp自减,出栈时,esp自增

EBP也称为栈底寄存器,简单理解为一个方法调用结束的地方

通过它减去一定的偏移值,来访问栈中的元素

专用寄存器

专用寄存器有标志寄存器(FLAGS),和指令指针寄存器(IP)

段寄存器

代码段寄存器(ECS),堆栈段寄存器(ESS),数据段寄存器(EDS),附加段寄存器(EES)

AX=AH+AL

BX=BH+BL

CX=CH+CL

DX=DH+DL

标志寄存器

又称程序状态字寄存器PSW,用来存放状态标志和控制标志信息的

状态标志位——用来记录当前运算结果的状态信息

控制标志位——用来存放控制CPU工作方式的标志信息

进位标志CF(相对于无符号数来说)

当运算结果的最高有效位有进位(加法)或借位(减法),进位标志置1,即CF=1,否则CF=0

如3AH(58)+7CH(124)=B6H(182),最高有效位没进位,CF置0

AAH+7CH=(1)26H

注:

运算时,按16进制运算,如3+7等于10,没满16不进位

A是10,10+7=17,满16进1

0x04汇编常见指令

call 调用函数指令,程序会去找对应函数名的标签,建立一个新的栈帧

push 将数据入栈,取出ESP寄存器里的地址

pop 取出stack最近一个写入的值(即最低位置的值),放入运算子指定位置

ret 用于终止当前函数的执行,将运行权交还给上层函数。也就是,当前函数的帧将被回收,该指令没有运算子

add 将某个值相加,如add AX,BX 的意思是将BX寄存器的值加到AX寄存器里

move 将一个值写入某个寄存器

jmp,jnz和je都是跳转,但它们也是有一定区别的。jmp是无条件跳转,不管是啥都跳转。jnz是条件跳转,当ZF为0的时候就跳转,不为0的时候不跳。je也是条件跳转,满足条件时跳转,不满足条件则不跳转,即标志位Z=0时,je跳转未实现,jnz跳转实现;Z=1时,je跳转实现,jnz跳转未实现。

je和jnz是相反的。

0x05认识堆栈

堆(heap)

由用户主动请求而划分出来的内存区域,叫做Heap。

由低地址向高地址增长

不会自动释放,必须手动释放,或由垃圾回收机制回收

C语言里使用malloc函数分配内存,使用free释放内存,java或C++里则使用new关键字创建对象分配内存,自带gc回收机制

栈(stack)

1、帧的概念

系统会在栈中为每个函数建立一个帧,所以调用栈有多少层(递归),就有多少帧。函数运行结束,帧就被回收

2、由高地址向低地址增长

0x06领空

我们常说的领空分为了程序领空和系统领空

那么什么是系统领空,什么是程序领空?

在OD中,当前运行的指令属于系统指令,OD在调用语句时,跳转到系统自带的所执行的函数部分,这个就是系统领空。

而同理,在OD调用语句时,跳转到程序自带的所执行的函数部分,称为程序领空。

它们的区别

1、各自的函数都来自于它们自己的部分。

2、程序领空的内容在OD中是不可以修改的,而程序领空可以由使用者任意修改。

3、程序领空地址一般都是低地址,而系统领空的地址一般是高地址

如0x0040100,该地址是低地址,为程序领空地址,

0x721bc00,该地址为高地址,为系统领空地址。

Prev:
记一次高校资产渗透经历
Next:
向日葵RCE漏洞分析
catalog
catalog