CTF 竞赛入门指南(CTF All In One)学习(四)


X86汇编基础

寄存器

       x86 有 8 个 32 位通用寄存器,分别是EAXEBXECXEDXESIEDIESP(stack pointer),EBP(basic pointer)。
       其中EAX(本段中的 A 均可被 B|C|D替换)这 4 个寄存器可以分段使用。以EAX为例,其低 2 字节视为 1 个 16 位寄存器AXAX的高低字节分别被视为 2 个 8 位寄存器AHAL

内存和寻址模式

声明静态数据区

.DATA
       可用.data指令声明数据,通过.byte, .short.long指明其所占的内存大小,分别是 1 个字节, 2 个字节和 4 个字节。例如:

.data
	var :
		.byte 64 ;声明一个字节型变量 var, 其所对应的数据是 64.
        .byte 10 ;声明一个数据 10, 这个数据没有所谓的 " 标签 ", 其内存地址就是 var+1.
    x :
    	.short 42 ;声明一个大小为 2 个字节的数据, 这个数据有个标签 " x ".
    y :
        .long 3000 ;声明一个大小为 4 个字节的数据, 这个数据标签是 " y ",  初始化为 3000.

标号

  • 用于命名内存地址
  • 按顺序声明的标号会按该顺序存储在内存中。

内存寻址

       x86 计算内存地址时,最多可将 2 个 32 位寄存器和 1 个 32 位有符号常量相加,其中的 1 个寄存器可以预先乘 2,4 或者 8。

指令

指令后缀

       用于指明数据所占空间大小,有bwl,分别表示 1, 2 和 4 个字节。例如:

    movb $2, (%ebx) ;将 2 移入到 ebx 中的值所表示的地址单元中.
    movw $2, (%ebx) ;将 16 位整数 2 移动到 从 ebx 中的值所表示的地址单元 开始的 2 个字节中.
    movl $2, (%ebx) ;将 32 位整数 2 移动到 从 ebx 中的值表示的地址单元 开始的 4 个字节中.

立即数

       汇编语言中,立即数总以美元符号$为前缀,其后有0x表示该数为 16 进制,无则默认为 10 进制

Condition

  • g即 greater(本以为 great 的比较级和最高级是 better 和 best,没想到竟然是 greater 和 greatest ORZ)。
  • l即 less。

调用约定

       分为调用者约定(caller rules)和被调用者约定(callee rules),即调用和返回过程中操作相关数据必须遵循的步骤。

猜你喜欢

转载自blog.csdn.net/m_pNext/article/details/107225852
ctf