Ho il seguente scenario: printf viene chiamato con una stringa lunga 20 byte (19 caratteri + 0x00) che controllo. La stringa non può contenere n, s, S e $.
Il mio obiettivo è bypassare uno strcmp con un valore casuale (utilizzando l'exploit per leggere il valore casuale o utilizzarlo per modificare quel valore)
Ecco come appare lo stack prima di printf è chiamato:
0xffffcf90: 0xffffcfb8 - this points to my input string
0xffffcf94: 0xffffd00c - this points to the bytes I have to guess
0xffffcf98: 0x00000001
0xffffcf9c: 0x00f0b6ff
0xffffcfa0: 0xffffcfde
0xffffcfa4: 0x00000001
0xffffcfa8: 0x000000c2
0xffffcfac: 0xffffd00c
0xffffcfb0: 0xffffcfde
0xffffcfb4: 0x00000013
0xffffcfb8: 0x61616161 - this is where my input string is located
0xffffcfbc: 0x61616161
0xffffcfc0: 0x61616161
0xffffcfc4: 0x61616161
0xffffcfc8: 0x00616161 - end of input string
0xffffcfcc: 0x594e1600
0xffffcfd0: 0x00000000
0xffffcfd4: 0xffffd074
0xffffcfd8: 0xffffd028
0xffffcfdc: 0x08048944
0xffffcfe0: 0xffffd00c
0xffffcfe4: 0x0000002f
0xffffcfe8: 0xf7e17dc8
0xffffcfec: 0xf7fbf000
0xffffcff0: 0x00008000
0xffffcff4: 0xf7fbb000
0xffffcff8: 0xf7fb9244
0xffffcffc: 0xffffd0d4
0xffffd000: 0x00000001
0xffffd004: 0x00000000
0xffffd008: 0x00000000
0xffffd00c: 0x5f526b6c - start of the bytes I have to guess
0xffffd010: 0xb5a551b9
0xffffd014: 0x29a9bfd5
0xffffd018: 0x00f8b9d0
0xffffd01c: 0x594e1600 - end of the bytes I have to guess
0xffffd020: 0xf7fbb3dc
0xffffd024: 0xffffd040
0xffffd028: 0x00000000
0xffffd02c: 0xf7e23637
Poiché 0xffffd00c
è nello stack, %s
avrebbe risolto facilmente il mio problema; tuttavia, non posso usare %s
o %S
. Non riesco a utilizzare $
, quindi l'accesso diretto ai parametri è fuori questione. E non posso usare %n
, quindi non posso ignorare la stringa che devo indovinare per renderla più semplice.
Se uso uso %p%p%p%p%p%p%p%p%p
questo mi darà dati tra 0xffffcf94
e 0xffffcfb4
Ho provato %llu
per ottenere 64 bit, ma il mio input contiene solo 19 caratteri.
Da quello che so sui formati di stringa, %s
è l'unico che considera il parametro come un puntatore, dandomi ciò che è all'indirizzo rappresentato dal valore, non il valore. %p
restituisce appena il valore come puntatore, dandomi 0xFFFFFFFF
invece di FFFFFFFF
(come %x
fa)
Questo scenario fa parte di una sfida wargame e l'exploit del formato stringa è uno dei punti deboli riscontrati. Non sono sicuro al 100% che questa sia la strada da percorrere, quindi mi chiedo se mi manca qualcosa quando si tratta di exploit in formato stringa (date le restrizioni che ho), prima di esplorare altri scenari