2021-07-10 · 4

CPU 寄存器

securityreversing

这篇文章发布已超过两年,内容可能已过时。

寄存器:CPU 的变量

通用寄存器

  • 8 bit Register:AH, AL
  • 16bit Register:AX
  • 32bit Register:EAX
  • 64bit Register:RAX

- 通用寄存器:CPU 使用的一种变量

- EAX

进行算术计算并传递返回值。

是最常用的变量。

- EDX

大数的乘法或除法运算

- ECX

C:即 Counter。

充当循环中的计数器、for 循环里 i++ 的角色,但它只以"先存入循环所需的次数值再 递减"的形式工作。

- EBX

和 EAX、EDX、ECX 一样的一种变量

- ESI

用于处理字符串或各种重复数据,或搬移内存。

- EDI

一种变量

ESI 是源索引,EDI 是目的索引

必须知道的东西

[算法/数据结构] - 栈(Stack)

栈(Stack) BOJ #10828 栈问题:https://www.acmicpc.net/problem/10828 什么是栈?栈(Stack)是一种可受限访问的排列结构。是只能在一端存取数据的 LIFO(Last In First Out)形式的.. — nabomhalang.tistory.com

你需要了解栈。

- ESP:stack pointer

存放栈帧终点地址的指针

- EBP:base pointer

存放栈帧起始地址的指针

- EIP:instruction pointer

指向下一条应执行指令地址的指针

endian(字节序)

endian(字节序)指在计算机内存这样的一维空间中排列多个连续对象的方法,排列字节的方法称为字节顺序。

字节序通常可分为大单位在前的 大端(Big-endian)和小单位在前的 小端(Little-endian);不属于两者或同时支持两者的有时称为 中端(Middle-endian)。

operand type

offset:引用特定内存地址时使用方括号。

距 eax +4 的内存地址的表示:[eax+4]

mov a, b:把 b 放进 a。(a = b)

mov [ecx], eax : *ecx = eax

add a, b: 把 a 增加 b(a += b)

sub a, b: 把 a 减少 b(a -= b)

mul a : eax(ax, ah, al) *= a

div a: eax(ax, ah, al) /= a

imul a, b : a *= b

idiv a, b : a /= b

lea a, [b] : 把 [b] 放进 a。(a = [b]) 与 mov 的区别 — mov 赋的是值,lea 赋的是地址

push a: 把 a push 到 stack(esp -= 4)

pop x: 把 stack 上的值 pop 到 a(esp += 4)

Inc a : a++

Dec a : a-- neg a : -a not a : ~a nop : 什么都不做的指令(只有 eip 递增到下一条)

and a, b : a &= b

or a, b : a |= b

xor a, b : a ^= b

对于 xor,执行 xor eax, eax 会把 eax 初始化为 0。

shl a, b : a << b

shr a, b : a >> b

Flags

寄存器中存在作为状态寄存器的 flags。

ZF:当此类指令的运算结果为 0 时,zf 标志变为 1

运算结果 == 0 -> '假' -> ZF:1

运算结果 != 0 -> '真' -> ZF:0

CF:在无符号运算中发生进位或借位时,CF 变为 1

SF:在有符号运算中,结果为正时,即最高位为 0 时 SF=0,反之为 1

OF:有符号运算中 CF 的角色(overflow flag)

Call

call location:调用函数的指令,func 是函数的地址

call:push eip; jmp func

   push eip:push 函数调用后要返回的地址,此时的 eip 称为(RET)Return address。

   jmp location:把 eip 移到 location 

函数尾声(leave-ret)

释放栈帧的工作

函数结束时,为返回到最初调用该函数的位置而做的工作

- leave

mov esp, ebp:把 esp 对齐为与 ebp 相同(恢复为函数开始时的初始值)

pop ebp:改回原来的 ebp 值

- ret

pop eip:取回 call 时 push eip 的那个 eip

jmp eip:移动到 call 之前的 eip 位置

!> ****](https://nabomhalang.tistory.com/entry/%EB%A6%AC%EB%B2%84%EC%8B%B1-%EC%8A%A4%ED%83%9D%ED%94%84%EB%A0%88%EC%9E%84%EC%9D%B4%EB%9E%80)

补充:[黑客/逆向] - [逆向] 什么是栈帧..? [[逆向] 什么是栈帧..? What's the stack frame? 栈帧(Stack Frame)是指函数被调用时,为区分该函数自己的栈区域而产生的区域。这个空间保存与函数相关的局部变量 — nabomhalang.tistory.com

来源

https://ko.wikipedia.org/wiki/%EC%97%94%EB%94%94%EC%96%B8


原文(韩语): tistory — 发布于 2021-07-10,已迁移至本博客。本翻译由 AI 协助完成。

评论

删除这条评论?

相关文章

CPU 寄存器 · 나봄하랑