Add TD5 q3 (first part)

This commit is contained in:
Yorick Barbanneau 2023-03-24 00:35:51 +01:00
parent 72564e2e2d
commit 4f61441bb9
7 changed files with 229 additions and 0 deletions

View file

@ -2,6 +2,9 @@
title: "Sécurité logicielle : TD5 stack overflow et shellcode"
date: 2023-02-17
tags: ["Assembleur", "x86"]
author:
- Yorick Barbanneau
- Gwendal Aupee
categories: ["Sécurité logicielle", "TD"]
---
@ -142,3 +145,51 @@ diférentes parties sont délimitées par des crochets:
Lors de l'instruction pas à pas du code assembleur, nous pouvons observer la
mise en place des arguments de notre appel système dans les différents
registres, notamment *0x3b* dans `rax`.
## question 3
Lors de l'exécution du `strace` sur notre exécutable `shellcode` nous voyons
bien apparaitre les deux appels systèmes `creat` et `exit`:
```
execve("./shellcode", ["./shellcode"], 0x7ffd7e08f160 /* 44 vars */) = 0
creat("/tmp/pwn", 0666) = 3
exit(42) = ?
+++ exited with 42 +++
```
L'exécution d'`objdumb -d -x` afin d'afficher les adresses des constantes nous
permet de vois que c'est bien l'adresse de `filename` qui est placée dans `%rdi`
avant d'appeler `creat` (appel système `0x55`).
```
[...]
SYMBOL TABLE:
0000000000402000 g .data 0000000000000000 filename
0000000000401000 g .text 0000000000000000 _start
0000000000402009 g .data 0000000000000000 __bss_start
0000000000402009 g .data 0000000000000000 _edata
0000000000402010 g .data 0000000000000000 _end
Déassemblage de la section .text :
0000000000401000 <_start>:
401000: 48 c7 c6 b6 01 00 00 mov $0x1b6,%rsi
401007: 48 c7 c7 00 20 40 00 mov $0x402000,%rdi
40100e: 48 c7 c0 55 00 00 00 mov $0x55,%rax
401015: 0f 05 syscall
401017: 48 c7 c7 2a 00 00 00 mov $0x2a,%rdi
40101e: 48 c7 c0 3c 00 00 00 mov $0x3c,%rax
401025: 0f 05 syscall
```
Une fois `shellcode.S` modifié et compilé, nous avons extrait les **opcodes**
avec une cible de notre `Makefile`. Cette cible créée un fichier `opcode.txt`
prêt à importer dans notre code `C`.
Avec cette méthode, nous n'avons pas à nous soucier de *l'abréviation* des 0
par `objdump`. Et en plus on évite les erreurs de saisie.
Après l'incorporation de notre *shellcode* dans le fichier `exploit-test.c`, sa
compilation et son execution, le fichier `/tmp/pwn` est bien créé.