2021-07-10 · 4

CPU レジスタ

securityreversing

この記事は公開から2年以上経過しています。

レジスタ: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

stack frame の終点アドレスが入ったポインタ

- EBP:base pointer

stack frame の最初の開始アドレスが入ったポインタ

- EIP:instruction pointer

次に実行すべき命令のアドレスポインタ

endian(エンディアン)

endian(エンディアン)は、コンピュータのメモリのような 1 次元の空間に複数の連続した対象を配列する方法を意味し、バイトを配列する方法をバイト順序といいます。

エンディアンは通常、大きい単位が前に来る ビッグエンディアン(Big-endian)と、小さい単位が前に来る リトルエンディアン(Little-endian)に分けられ、どちらにも属さないか両方を支持するものを ミドルエンディアン(Middle-endian)と呼ぶこともあります。

operand type

offset:特定のメモリアドレスを参照するときは大括弧を使います。

eax から +4 だけ離れたメモリアドレスの表記:[eax+4]

mov a, b:a に b を入れよ。(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] : a に [b] を入れよ。(a = [b]) mov との違い — mov は値を代入、lea はアドレスを代入

push a: stack に a を push(esp -= 4)

pop x: stack にある値を a に pop する(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:location へ eip を移す 

関数エピローグ(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 レジスタ · 나봄하랑