Assembleur x86/x64 — Bases du langage machine

Architecture Exploitation

Registres x86_64

Généraux : rax rbx rcx rdx rsi rdi rbp rsp r8-r15

Sous-registres de rax :
rax (64 bits) -> eax (32) -> ax (16) -> al/ah (8)

Spéciaux :
rip = prochaine instruction
rsp = sommet de la pile
rflags = indicateurs (ZF, CF, OF...)

Convention d'appel Linux x64

Arguments : rdi, rsi, rdx, rcx, r8, r9
Retour    : rax

# Exemple : write(1, buffer, 13)
mov rdi, 1          ; fd = stdout
mov rsi, buffer_addr; pointeur buffer
mov rdx, 13         ; taille
call write

# Note Windows : rcx, rdx, r8, r9 (différent !)

Instructions clés

# Mouvement
mov rax, 42         ; rax = 42
lea rax, [rbp-8]    ; rax = ADRESSE rbp-8
push rax            ; empiler rax
pop rbx             ; dépiler dans rbx

# Arithmétique
add rax, rbx ; sub rax, 4 ; imul ; xor rax,rax

# Comparaison et sauts
cmp rax, rbx ; test rax,rax
je .label   ; jne  ; jg  ; jl  ; ja

# Fonctions
call fonction  ; ret

Syscalls Linux x64

# Appels au noyau via l instruction syscall
# rax = numéro, args dans rdi, rsi, rdx, r10, r8, r9

0   read(fd, buf, count)
1   write(fd, buf, count)
2   open(path, flags)
59  execve(path, argv, envp)  <- le plus utile en pwn
60  exit(status)