将安全君呀设为"星标⭐️"
第一时间收到文章更新
声明: 安全君呀 公众号文章中的技术只做研究之用,禁止用来从事非法用途,如有使用文章中的技术从事非法活动,一切后果由使用者自负,与本公众号无关。
文章声明:本篇文章内容部分选取网络,如有侵权,请告知删除。
1 逆向的概念
开发与逆向的关系
正常开发的过程:
我以C语言举例,C语言代码属于高级语言代码,不能直接被处理器执行,这时候需要由编译器将C语言代码翻译成处理器可以直接理解的机器代码。
编译流程如下: C语言代码 -> ... -> 汇编语言代码 -> ... -> 机器代码
逆向的过程:
机器代码会按照一定的排列方式存储在可执行文件中,最常见的可执行文件有 Windows 的 exe 文件以及 Linux 的 ELF 文件。
逆向工程操作对象就是这一类可执行文件,逆向即通过机器代码反推程序的原理。机器码毫无可读性,可执行文件编排也十分复杂,所以需要一款强大的辅助软件辅助逆向分析过程,使分析者可以专注于代码本身的逻辑层面。
IDA 生成高级语言代码的流程:机器代码 -> ... -> 汇编代码 -> ... -> 高级语言代码
我对逆向的理解:
1、逆向技术,例如静态分析、动态调试、修改代码等等。如果毕业后想找到一份不错的逆向相关的工作,扎实的逆向技术功底是你的资本。
2、逆向思维,已知算法正向过程求其逆运算的思维。逆运算在数学里非常常见,比如三角函数的逆运算是反三角函数、加法的逆运算是减法、乘法的逆是除法,许多逆向题往往给出正向计算算法以及算法运算结果,求其算法的输入。
逆向技术学习路线:
2 x86 汇编语言基础
学习汇编应该了解的方向
- 寄存器模式及定义
- 指令集
基础汇编之寄存器
基础汇编之基本的指令
CPU内部寄存器之间的数据传送:
MOV AL,DH ;AL←DH (8位)
MOV DS,AX ;DS←AX (16位)
MOV EAX,ESI ;EAX←ESI (32位)
CPU内部寄存器和存储器之间的数据传送。
MOV [BX],AX ;间接寻址 (16位)
MOV EAX,[EBX+ESI] ;基址变址寻址 (32位)
MOV AL,BLOCK ;BLOCK为变量名,直接寻址(8位)
立即数送通用寄存器、存储器
MOV EAX,12345678H ;EAX←12345678H (32位)
MOV [BX],12H ;间接寻址 (8位)
MOV AX,1234H;AX←1234H(16位)
CPU内部寄存器和存储器之间的数据传送。
MOV [BX],AX ;间接寻址 (16位)
MOV EAX,[EBX+ESI] ;基址变址寻址 (32位)
MOV AL,BLOCK ;BLOCK为变量名,直接寻址(8位)
特点:先进后出
操作:入栈(push) 、出栈(pop)
PUSH AX ;通用寄存器操作数入栈(16位)
PUSH EBX ;通用寄存器操作数入栈(32位)
PUSH [SI] ;存储器操作数入栈(16位)
PUSH DWORD PTR [DI] ;存储器操作数入栈(32位)
PUSHW 0A123H ;立即数入栈(16位)
PUSHD20H ;立即数入栈(32位)
ADD / SUB / INC / DEC / MUL / DIV / AND / OR / XOR / NOT
例如 ADD EAX,EBX ; EAX = EAX + EBXCMP 比较指令(重点)
cmp 指令是实现逻辑判断的核心,cmp指令通过对两个操作数进行减法操作,仅记录标志位信息,不保存结果。
①OF(Overflow Flag)溢出标志。溢出时为1,否则置0。
②SF(Sign Flag)符号标志。结果为负时置1,否则置0.
③ZF(Zero Flag)零标志,运算结果为0时ZF位置1,否则置0.
④CF(Carry Flag)进位标志,进位时置1,否则置0.
过程调用
int max(int a,int b);
push b
push a
call max
调用约定规范了函数之间调用的方式、参数如何传递、返回值如何传递、栈由谁来平衡。
比较常见的调用约定:
1、__cdecl
__cdecl调用约定又称为 C 调用约定,是 C/C++ 语言缺省的调用约定。参数按照从右至左的方式入栈,函数本身不清理栈,此工作由调用者负责,返回值在EAX中。由于由调用者清理栈,所以允许可变参数函数存在,如 intsprintf(char* buffer,constchar* format,...);。
2、__stdcall
__stdcall 很多时候被称为 pascal 调用约定。pascal 语言是早期很常见的一种教学用计算机程序设计语言,其语法严谨。参数按照从右至左的方式入栈,函数自身清理堆栈,返回值在 EAX 中。
3、__fastcall
顾名思义,__fastcall 的特点就是快,因为它通过 CPU 寄存器来传递参数。他用 ECX 和 EDX 传送前两个双字(DWORD)或更小的参数,剩下的参数按照从右至左的方式入栈,函数自身清理堆栈,返回值在 EAX 中。
Tips
欢迎大家在下面点赞评论加关注,让我们一起在网安之路越走越远!!!
原文始发于微信公众号(安全君呀):【CTF逆向01】逆向与汇编
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论