PDA

Visualizza la versione completa : [Ubuntu\C]Pratica con Buffer Overflow


PaTeR non PeTeR
11-12-2008, 12:48
Ciao a tutti... volevo esercitarmi un pò con l'overflow del buffer, ma proprio non ci riesco... Nel mio ubuntu avevo la stack smashing protection ( gcc 4.1 ) così sono passato a gcc 3.4... ma ancora non riesco a cavarne fuori niente...

in questo file prendo l'indirizzo di una funzione per cercare di sovrascrivere l'eip, accedendo alla suddetta funzione che mostra un messaggio di conferma... però non riesco a sovrascrivere l'eip...

questo è il mio codice... in alto c'ho una funzione per il passaggio da big-endian a little-endian... pensavo che mi servisse, invece il compilatore lo scambia in auto.



#include <stdio.h>

int btol(int i)
{
return((i&0xff)<<24)+((i&0xff00)<<8)+((i&0xff0000)>>8)+((i>>24)&0xff);
}

int ciao (int b) {
printf("smashing...\n");
char sou[4] = "AAAA";

memcpy((int *) (&sou+1), &b,16);
}

int a() {
printf("secret");
}

int main ( int argc, char *argv[] ) {
char sara[4];
int b = &a;
printf("function 'a' is @ 0x%x\n", b);

ciao(b);
}



g0d@g0d-desktop:~/Projects/6.Note$ gcc-3.4 -o x xploitable.c -g
xploitable.c: In function `main':
xploitable.c:21: warning: initialization makes integer from pointer without a cast
g0d@g0d-desktop:~/Projects/6.Note$ gdb ./x -q
(gdb) break 12
Breakpoint 1 at 0x80483cc: file xploitable.c, line 12.
(gdb) break 13
Breakpoint 2 at 0x80483e9: file xploitable.c, line 13.
(gdb) run
Starting program: /home/g0d/Projects/6.Note/x
function 'a' is @ 0x80483eb
smashing...

Breakpoint 1, ciao (b=134513643) at xploitable.c:12
12 memcpy((int *) (&sou+1), &b,40);
(gdb) disass main
Dump of assembler code for function main:
0x080483ff <main+0>: push ebp
0x08048400 <main+1>: mov ebp,esp
0x08048402 <main+3>: sub esp,0x18
0x08048405 <main+6>: and esp,0xfffffff0
0x08048408 <main+9>: mov eax,0x0
0x0804840d <main+14>: add eax,0xf
0x08048410 <main+17>: add eax,0xf
0x08048413 <main+20>: shr eax,0x4
0x08048416 <main+23>: shl eax,0x4
0x08048419 <main+26>: sub esp,eax
0x0804841b <main+28>: mov DWORD PTR [ebp-0x8],0x80483eb
0x08048422 <main+35>: mov eax,DWORD PTR [ebp-0x8]
0x08048425 <main+38>: mov DWORD PTR [esp+0x4],eax
0x08048429 <main+42>: mov DWORD PTR [esp],0x8048525
0x08048430 <main+49>: call 0x80482ec <printf@plt>
0x08048435 <main+54>: mov eax,DWORD PTR [ebp-0x8]
0x08048438 <main+57>: mov DWORD PTR [esp],eax
0x0804843b <main+60>: call 0x80483b2 <ciao>
0x08048440 <main+65>: leave
0x08048441 <main+66>: ret
End of assembler dump.
(gdb) x/40wx &sou
0xbffadca4: 0x41414141 0xbffadcd8 0x08048440 0x080483eb
0xbffadcb4: 0x080483eb 0xbffadcd8 0x08048479 0xb809ff50
0xbffadcc4: 0x08048300 0x0804846b 0xb807cff4 0x080483eb
0xbffadcd4: 0x08048300 0xbffadd38 0xb7f39685 0x00000001
0xbffadce4: 0xbffadd64 0xbffadd6c 0xb8091b38 0x00000001
0xbffadcf4: 0x00000001 0x00000000 0x0804820b 0xb807cff4
0xbffadd04: 0x08048460 0x08048300 0xbffadd38 0x2399c16a
0xbffadd14: 0x310c957a 0x00000000 0x00000000 0x00000000
0xbffadd24: 0xb80a5090 0xb7f395ad 0xb80adff4 0x00000001
0xbffadd34: 0x08048300 0x00000000 0x08048321 0x080483ff
(gdb) cont
Continuing.

Breakpoint 2, ciao (b=-1074078504) at xploitable.c:13
13 }
(gdb) x/40wx &sou
0xbffadca4: 0x41414141 0x080483eb 0x080483eb 0xbffadcd8
0xbffadcb4: 0x08048479 0xb809ff50 0x08048300 0x0804846b
0xbffadcc4: 0xb807cff4 0x080483eb 0x08048300 0x080483eb
0xbffadcd4: 0x08048300 0xbffadd38 0xb7f39685 0x00000001
0xbffadce4: 0xbffadd64 0xbffadd6c 0xb8091b38 0x00000001
0xbffadcf4: 0x00000001 0x00000000 0x0804820b 0xb807cff4
0xbffadd04: 0x08048460 0x08048300 0xbffadd38 0x2399c16a
0xbffadd14: 0x310c957a 0x00000000 0x00000000 0x00000000
0xbffadd24: 0xb80a5090 0xb7f395ad 0xb80adff4 0x00000001
0xbffadd34: 0x08048300 0x00000000 0x08048321 0x080483ff
(gdb) cont
Continuing.

Program received signal SIGSEGV, Segmentation fault.
0xbffadcda in ?? ()
(gdb)

In grassetto vedete l'eip... sia nel disassembler che nello stack. con il memcpy vedete che lo sovrascrivo... ma allora, perchè dà il segmentation fault nell'indirizzo 0xbffadcda??? che tra l'altro manco c'è nello stack?

non riesco a capire dove sbaglio... potete aiutarmi?

PaTeR non PeTeR
11-12-2008, 17:10
la cosa che non capisco è che iniettando una stringa lunga AAA... etc l'errore di segmentazione effettivamente lo da per 0x41414141... ci sto perdendo la testa!

oregon
11-12-2008, 18:07
Ma, prima di tutto, a che ti serve tutto cio'?

Non e' proprio un "problema di programmazione" ... :madai!?:

PaTeR non PeTeR
11-12-2008, 18:35
Per entrare nel server centrale della NASA... -.-

Mi serve per fare pratica con stack, stack frames, puntatori, flusso del programma... E' un problema di programmazione perchè c'è qualcosa che non va nella logica del programma che io nn riesco a capire..

alka
11-12-2008, 18:39
Originariamente inviato da PaTeR non PeTeR
Mi serve per fare pratica con stack, stack frames, puntatori, flusso del programma... E' un problema di programmazione perchè c'è qualcosa che non va nella logica del programma che io nn riesco a capire..
Se fai pratica con il buffer overflow, significa che tutt'al più devi fare in modo che il tuo programma NON si comporti come si deve. :stordita:

PaTeR non PeTeR
11-12-2008, 18:55
o che si comporti bene per quello che deve fare... alterando il proprio flusso...

sentendo sempre parlare di sti bof volevo capire come funzionano...

oregon
11-12-2008, 19:05
Originariamente inviato da alka
Se fai pratica con il buffer overflow, significa che tutt'al più devi fare in modo che il tuo programma NON si comporti come si deve. :stordita:

Concordo ...

XWolverineX
11-12-2008, 19:55
eip? ma forse intendi l'Heap?

oregon
11-12-2008, 19:59
Originariamente inviato da XWolverineX
eip? ma forse intendi l'Heap?

No ... intende poprio l' EIP ... la copia dell' EIP conservato nello stack e recuperato al rientro di una funzione. Se lo cambi in modo "malevolo" prima del rientro, il flusso del programma viene alterato e invece di rientrare al chiamante, vai a finire all'interno di codice "cattivo" ...

Il registro e' l' Instruction Pointer a 32 bit ...

XWolverineX
11-12-2008, 20:05
Ah, che figura di merda.

Loading