Assembleur x86/x64 — Bases du langage machine
★★★★★
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)