0x00 - fd
Mommy! what is a file descriptor in Linux?
3 types of file descriptors:
0: standard input
1: standard output
2: standard error
Ref: File descriptors
flag est lisible par fd_pown
fd est SUID
Code source fd.c
Le programme prend le premier argument, lui soustrait 0x1234, et lit 32 bytes du descripteur de fichier (fd) avec ce numéro. Si le résultat est “LETMEWIN”, le programme retourne le flag
argv[1] = 0x1234 +0 : stdin
argv[1] = 0x1234 +1 : stdout
argv[1] = 0x1234 +2 : stderr
Si nous demandons au programme de lire 32 bytes de stdin alors le programme se mettra en pause et attendra qu’on entre des données (stdin). On pourra alors entrer “LETMEWIN”
0x1234 = 4660 en décimal
Solution:
./fd 4660
0x01 - Colision
Daddy told me about cool MD5 hash collision today.
I wanna do something like that too!
flag lisible par col_pwn
col est SUID
Code source code.c
Le programme prend 20 bytes en entrée. Si check_password() retourne 0x21DD09EC le programme retourne flag.
check_passwd:
ip[0] + ip[1] + ip[2] + ip[3] + ip [4] = 0x21DD09EC = 568134124 en décimal
On modifie col.c pour mieux comprendre son fonctionnement
Compiler: gcc col.c -o col
Test 1:
Test 2:
Check_passwd prend les 20 bytes d’entrées, forme 5 groupes (groupe de 4 bytes) et retourne leur somme
La somme doit être égale à 568134124.
Little Endian
Payload
“\xc8\xce\xc5\x06” * 4 + “\xcc\xce\xc5\06”
./col `python -c 'print "\xc8\xce\xc5\06" * 4 + "\xcc\xce\xc5\x06"'`
Test:
Resultat:
0x03 Bof
Nana told me that buffer overflow is one of the most common software vulnerability.
Is that true?
Download : http://pwnable.kr/bin/bof
Download : http://pwnable.kr/bin/bof.c
Code source bof.c
func() breakdown
La fonction prend une clé et crée une variable overflowme de 32 bytes char overflowme[32]
La valeur de l’entrée est stockée dans overflowme puis le programme vérifie si la clé est égale à 0xcafebabe
Tests
gdb
Plaçons un point d’arret à la fonction main break main
et lancer le programme r
Le programme s’arrête au point d’arrêt.
Nous avons besoin de connaitre l’adresse ou la comparaison de la valeur de la clé est effectuée (0xcafebabe) pour y placer un autre point d’arrêt. Pour cela désassemblons la fonction func()
L’instruction cmpl
est à l’adresse 0x56555654. Plançons notre deuxieme point d’arret juste avant cette instruction et continuons le programme c
.
Entrons un input facilement identifiable par exemple ‘AAAAAAAA’ et attendons d’être au deuxième point d’arret.
Examinons maintenant la stack x/50wx $esp
Nous voyons que 0xdeadbeef commence à l’offset 0xffffd1d0 et que notre input (AAAA == 0x41414141) débute à l’offset 0xffffd19c
0xffffd19c - 0xffffd1d0 = 52
Il y a donc 52 caractères entre le début de notre input et la clé. Nous pouvons donc réécrire la clé :)
Payload
(python -c 'print "A"*52 + "\xbe\xba\xfe\xca"'; cat) | nc pwnable.kr 9000
0x03 Flag
Papa brought me a packed present! let's open it.
Download : http://pwnable.kr/bin/flag
This is reversing task. all you need is binary
flag est un executable ELF 64 bit
IDA
Ref: https://github.com/AngelKitty/IDA7.0
En analysant le programme avec IDA on trouve une suite d’instructions xor
, shl
, or
et inc
à proximité les unes des autres ce qui traduit le fait que le code a été offusqué
GDB
Essayons de mettre un point d’arret a strcpy
Nous ne pouvons pas utiliser de symbole…
Essayons de mettre un point d’arret avant la fonction start. Pour cela récupérons son offset avec IDA avant d’utiliser gdb:
adresse 0x44A4F0. ni
= step over
Normalement le programme ne plante pas donc l’introduction du débugger altère le fonctionnement de flag
System call trace
strace -i ./flag
Nous voyons que la sortie “I will malloc() etc” est à l’adresse 0x419060. Cette sortie est possible une fois que le programme est dépaqueté.
Nous pouvons donc attendre que le programme atteigne ce point et dumper sa mémoire
PID du programme flag et carte de sa mémoire
Dump:
On utilise strings
et dans dump1
on trouve le flag
A compléter
Source:
Poursuivez avec :
This work is licensed under a Creative Commons Attribution 4.0 International License.