Logo Logo

0x00 - fd

Logo

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

Code

flag est lisible par fd_pown

fd est SUID

Code source fd.c

Code

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

Code

0x01 - Colision

Logo

Daddy told me about cool MD5 hash collision today.
I wanna do something like that too!

Logo

flag lisible par col_pwn

col est SUID

Code source code.c

Logo

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

Logo

On modifie col.c pour mieux comprendre son fonctionnement

Logo

Compiler: gcc col.c -o col

Logo

Test 1:

Logo

Test 2:

Logo

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.

Logo

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:

Logo

Resultat:

Logo

0x03 Bof

Logo

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

Code

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

Tests

gdb

Plaçons un point d’arret à la fonction main break main et lancer le programme r

Gdb

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()

Gdb

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.

Gdb

Examinons maintenant la stack x/50wx $esp

Gdb

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 

Payload

0x03 Flag

Logo

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

Img

flag est un executable ELF 64 bit

Img

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é

Img

GDB

Essayons de mettre un point d’arret a strcpy

Img

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:

Img

adresse 0x44A4F0. ni = step over

Img

Normalement le programme ne plante pas donc l’introduction du débugger altère le fonctionnement de flag

System call trace

strace -i ./flag

Img

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

Img

PID du programme flag et carte de sa mémoire

Img

Dump:

Img

On utilise stringset dans dump1 on trouve le flag

Img

A compléter

Source:

Checkpoint

Poursuivez avec :

- CSAW CTF Quals 2020

- HTB - Magic Machine

CC-BY

This work is licensed under a Creative Commons Attribution 4.0 International License.