【CTF逆向01】逆向与汇编

admin 2024年12月12日09:54:38评论17 views字数 2174阅读7分14秒阅读模式

安全君呀设为"星标️"

第一时间收到文章更新

声明: 安全君呀 公众号文章中的技术只做研究之用,禁止用来从事非法用途,如有使用文章中的技术从事非法活动,一切后果由使用者自负,与本公众号无关。

文章声明:本篇文章内容部分选取网络,如有侵权,请告知删除。

1 逆向的概念

开发与逆向的关系

正常开发的过程

我以C语言举例,C语言代码属于高级语言代码,不能直接被处理器执行,这时候需要由编译器将C语言代码翻译成处理器可以直接理解的机器代码。

编译流程如下: C语言代码 -> ... -> 汇编语言代码 -> ... -> 机器代码

逆向的过程

机器代码会按照一定的排列方式存储在可执行文件中,最常见的可执行文件有 Windows 的 exe 文件以及 Linux 的 ELF 文件。

逆向工程操作对象就是这一类可执行文件,逆向即通过机器代码反推程序的原理。机器码毫无可读性,可执行文件编排也十分复杂,所以需要一款强大的辅助软件辅助逆向分析过程,使分析者可以专注于代码本身的逻辑层面。

IDA 生成高级语言代码的流程:机器代码 -> ... -> 汇编代码 -> ... -> 高级语言代码

我对逆向的理解

1、逆向技术,例如静态分析、动态调试、修改代码等等。如果毕业后想找到一份不错的逆向相关的工作,扎实的逆向技术功底是你的资本。

2、逆向思维,已知算法正向过程求其逆运算的思维。逆运算在数学里非常常见,比如三角函数的逆运算是反三角函数、加法的逆运算是减法、乘法的逆是除法,许多逆向题往往给出正向计算算法以及算法运算结果,求其算法的输入。

逆向技术学习路线

【CTF逆向01】逆向与汇编

2 x86 汇编语言基础

学习汇编应该了解的方向

- 寄存器模式及定义

- 指令集

基础汇编之寄存器

【CTF逆向01】逆向与汇编

基础汇编之基本的指令

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指令通过对两个操作数进行减法操作,仅记录标志位信息,不保存结果

【CTF逆向01】逆向与汇编

①OF(Overflow Flag)溢出标志。溢出时为1,否则置0。

②SF(Sign Flag)符号标志。结果为负时置1,否则置0.

③ZF(Zero Flag)零标志,运算结果为0时ZF位置1,否则置0.

④CF(Carry Flag)进位标志,进位时置1,否则置0.

【CTF逆向01】逆向与汇编
【CTF逆向01】逆向与汇编
过程调用int max(int a,int b);push bpush acall max
【CTF逆向01】逆向与汇编
调用约定规范了函数之间调用的方式、参数如何传递、返回值如何传递、栈由谁来平衡。
比较常见的调用约定:
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】逆向与汇编

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年12月12日09:54:38
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【CTF逆向01】逆向与汇编https://cn-sec.com/archives/3498553.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息