GithubHelp home page GithubHelp logo

assembly-sandbox's Introduction

assembly-sandbox

nasmというアセンブラを使い、アセンブルする。 nasm -f macho64 <file>

systemcall

syscalls.master

番号

リンク.
unixのシステムコール番号に0×2000000を足すみたい。 恐らくカーネルコマンドのoffsetが0×2000000ってこと? 0x2000001 ; exitを呼べる。

Linux systemcall リファレンス

めっちゃ見やすいのあった。 yamnikov-oleg/calling_conventions.md

アセンブリ基礎

x86_64の。

記法

レジスタ

64bit    32bit    16bit    下位2byte    最下位byte
---------------------------------------------------
rax      eax      ax        ah          al
rdx      edx      dx        dh          dl
rsi      esi      si        -           sil
rdi      edi      di        -           dil
rsp      esp      sp        -           spl
rbp      ebp      bp        -           bpl
r8       r8d      r8w       -           r8b
r12      r12d     r12w      -           r12b

オペコードとオペランド

命令には1つのオペコードと,0個以上のオペランドがある。
この場合はaddがオペコード。
rax, 10がオペランド。(第一オペランドはしばしばdestinationとなる。) add rax, 10

アドレスは[]で囲む必要がある. []の中で算術演算も可能。 add rax, [0x123456]

addqなどオペコードのサフィックスに文字があるが以下の様な意味。

b : byte (8bit)
w : word (16bit)
l : long word (32bit)
q : quad word (64bit)

コメントアウト

;をつける。 add rax, 10 ; add 10 to rax

算術計算

加減算

add A, B 
sub A, B 

インクリメント、デクリメント

inc rax
dec rax

乗算

mov rax, 2   ; raxに2を代入
mov rcx, 3   ; rcxに3を代入
mul rcx      ; オペランドは1つのみ。 raxレジスタの値と乗算する。

計算結果は上半分がrdxレジスタに、下半分がraxレジスタに入る。(64bit同士の乗算は整数オーバーフローの可能性がある)

第一オペランドが32bitであれば,edx, eaxに入る。

mov rax, 0xabcdabcd
mov rdx, 0x12341234
mul edx              ; 32bitのためrdxではない

除算

基本乗算と同じ、被除数はraxレジスタ。
計算結果はraxに商、rdxに剰余が入る。

mov rax, 21
mov rdx, 5
div rdx

論理演算

and rax, rdx  ; raxとrdxのANDをraxに格納
or  rax, rdx  ; rax, rdxの論理和(OR)をraxに格納
xor rax, rdx  ; rax, rdxのXOR.  xor eax, eaxの様にするとレジスタを0にできる。仕様上raxレジスタ全体が0になる。
not rax       ; raxのNOT

シフト演算

shr, shlで右左のシフト。オペランドが一つなら1bitシフトする。

shl rax  ; rax <<= 1
shr rax  ; rax >>= 1

オペランドが二つの場合。第二オペランドには即値もしくはclレジスタのみ指定可能。

mov cl, 3
shl rax, cl  ; rax <<= 3
shr rax, 10  ; rax >>= 10

比較

cmp

比較結果をフラグレジスタに保存する。 第一オペランドと第二オペランドのでチェックしている。 フラグレジスタ一例

フラグ     意味            1になる条件
ZF         Zero flag       演算結果が0
SF         Signed flag     演算結果が負数
CF         Carry flag      演算で桁あふれ
OF         Overflow flag   符号付演算で桁あふれ

ZF=1, SF=0, CF=0, OF=0になる例。

mov rax, 10
mov rdx, 10
cmp rax, rdx

test

2つのオペランドのANDでフラグを設定する。
ZF=0(ゼロか判断)の例

test rax, rax

分岐

jmp

gotoみたいな。ラベルに飛ぶ。

jmp func  ; funcに飛ぶ
...
func:     ; funcラベル
...

jz, je

jz = jump if zero, je = jump if equalの略。

cmp rax, 10
jz a        ; ZF=1ならaにjmp
  ...
a:
  ...

jnz, jne

jz, jeのnot条件。

cmp rax, 10
jne a       ; ZF=0でaにjmp
  ...
a:
  ...

ja, jae

jump if avobeのこと>, >=にあたる。
jaはZF=0かつCF=0の時。jaeはCF=0の時。

cmp rax, 10
ja a        ; rax > 10 でaにjmp
  ...
a:
  ...

jb, jbe

jump if below.
jbはCF=1, jbeはCF=1 or ZF=1.

cmp rax, 10
jbe a       ; rax <= 10 でaにjmp
  ...
a:
  ...

jg, jge, jl, jle

ja, jae, jb, jbeを符号付で比較。
jgはZF=0 and SF=OF, jgeはSF=OF.
jlはSF!=OF, jleはSF!=OF or ZF=1.

スタック操作

pushはrspを減算し、popはrspを加算する。
pop処理で対象アドレスの値は削除されないが、pushで上書きされることで消える。

push A
pop  A

関数呼び出し

callretがある。jmpの様にラベルに飛べるが、retで戻れる。
なぜ戻れるのか? -> callで次の命令をスタックにpushし、retでpopしてripレジスタに設定します。

func:
  ...
  ret
main:
  ...
  call func  ; func にjmp
  ...        ; ret で戻ってくる

呼び出し

call, retで行う。 引数にはrdi, rsi, rdx, r10, r8, r9レジスタを順番に使う。
これはABI(Application Binary Interface)の作法で、第一引数はrdi,.... ということ。

関数の戻り値はraxに入る。

leave

retの直前にleaveが使われることがある。
mov rsp, rbp; pop rbp;と等価。

システムコール

syscallが用意されています。

変数の保存

ローカル変数

次のように確保される。

  • callで呼び出す関数の先頭にjmpし戻り先のアドレスをスタックに積む
  • rbpの値をスタックに積む
  • rbprspを代入する
  • 使いたい領域分をsub rsp, [0x000]の様にひく <- ここで領域確保 実行終了時、
  • leaveを読んでrbp, rspを元に戻す
  • retで戻り先アドレスをpopしてjmp

グローバル変数

固定アドレスで保存される。 mov eax, DWORD PTR [0x102030] ; 0x102030 から4バイト取得

配列

この様な配列を参照する。 int array[] = {1, 2, 3, 4};

leaでint型なので4バイトをかけている.

mov rax, [rbp - 0x8]  ; i の定義
lea rdx, [rax * 4]      
lea rax, [0x102030]   ; arrayのアドレスを仮に 0x102030 とする
mov eax, [rax + rdx]    ; eax = array[i]

逆アセンブル

バイナリからアセンブリへの変換。
objdump -S <file>とか使う。

variable

Allocating Storage Space for Initialized Data

data section内。

Directive	  Purpose	           Storage Space
DB	        Define Byte	       allocates 1 byte
DW	        Define Word	       allocates 2 bytes
DD	        Define Doubleword	 allocates 4 bytes
DQ	        Define Quadword  	 allocates 8 bytes
DT	        Define Ten Bytes	 allocates 10 bytes

Allocating Storage Space for Uninitialized Data

bss section内。

Directive	  Purpose
RESB	      Reserve a Byte
RESW	      Reserve a Word
RESD	      Reserve a Doubleword
RESQ	      Reserve a Quadword
REST	      Reserve a Ten Bytes

Multiple Initializations

allocate 000000000. marks TIMES 9 DW 0

assembly-sandbox's People

Contributors

naruse666 avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.