ROP all the things
ROP
- Pourquoi?
- Structure de la Stack
- ROP 101
- ROPGadget.py
Pourquoi?
- NX Bytes
- Segment exécutable seulement en lecture
- Réutilisation des segments présents
- Exemple readelf -l:
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
PHDR 0x000034 0x08048034 0x08048034 0x00100 0x00100 R E 0x4
INTERP 0x000134 0x08048134 0x08048134 0x00013 0x00013 R 0x1
[Requesting program interpreter: /lib/ld-linux.so.2]
LOAD 0x000000 0x08048000 0x08048000 0x005bc 0x005bc R E 0x1000
LOAD 0x0005bc 0x080495bc 0x080495bc 0x00114 0x00118 RW 0x1000
DYNAMIC 0x0005c8 0x080495c8 0x080495c8 0x000e8 0x000e8 RW 0x4
NOTE 0x000148 0x08048148 0x08048148 0x00044 0x00044 R 0x4
GNU_EH_FRAME 0x000480 0x08048480 0x08048480 0x0003c 0x0003c R 0x4
GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x10
Structure de la Stack
void g(int x) { f(x); }; g(123456);
080483d9 <g>: 80483d9: 55 push ebp 80483da: 89 e5 mov ebp,esp 80483dc: ff 75 08 push [ebp+0x8] 80483df: e8 e7 ff ff ff call 80483cb <f> 80483e4: 83 c4 04 add esp,0x4 80483e7: c9 leave 80483e8: c3 ret
Structure de la Stack
ROP 101
Retourner dans une autre fonction
Text
int check_password(char* user, char* file) {
char user_password[32];
scanf("%s", user_password);
// Do more stuff
}
void print_file(char* file) {
int f = open(file);
char buf[32];
read(file, buf, 32);
printf("%s", buf);
}
ROP Gadgets
- Fragment d'instructions finissant par un saut ou une instruction de retour dont la destination est contrôlé par l'attaquant.
- Exécution en chaîne de plusieurs fragments pour créer un "programme"
Pop; pop; ret
- Gadgets courant et pratiques
- Séries d'instructions qui permet de « dérouler » la Stack
- Permet de chaîner plusieurs appels de fonction avec des arguments valide
Chaîne de fonction
void a(int a1, int a2, int a3) {}
void b() {}
void c(int c1, int c2) {}
8048455: 83 c4 0c add esp,0xc
8048458: 5b pop ebx
8048459: 5e pop esi
804845a: 5f pop edi
804845b: 5d pop ebp
804845c: c3 ret
Objectif: Exécuter les fonctions dans l'ordre suivant:
- a(1,2,3);
- b();
- c(4,5);
ROPGadget.py
- https://github.com/JonathanSalwan/ROPgadget
- Logiciel de recherche de Gadget ROP
- ./ROPGadget --binary your_bin
- Permet même de générer un ROP pour
execve('/bin/sh', 0, 0); - ./ROPGadget --binary your_bin --ropchain
Limitation
- Executable ASLR (fPIE)
- Leak une adresse ou .PLT table
- Peu de gadget disponible
- Linked library! Libc is big...
Question?
Action!
Bonus: pop a shell
ROP all the things
By Olivier Arteau
ROP all the things
- 1,252