2012-04-12 9 views
2

Ich mache einige überwältigende Stack-Praxis vor kurzem mit dem Buch "Shellcoders Handbuch".
Aber wenn ich versuche, etwas Code auf meinem Ubuntu11.04 zu testen, bekomme ich immer einen Segmentfehler.
Hier ist die Situation:Ich kann keinen Smash-Stack-Segment-Fehler finden

Zuerst schreibe ich exit_shellcode.s (nur die einfache Ausfahrt (0) Funktion):

.section .text 
.globl _start 
_start: 
movl $1, %eax 
movl $0, %ebx 
int $0x80 <br> 

dann erhalte ich die Hex-Code:

0x000001b8 0x0000bb00 0x80cd0000 

Nach dass ich machen den wack.c:

char shellcode[] = "\xb8\x01\x00\x00\x00\xbb\x00\x00\x00\x00\xcd\x80"; 
void f(void) 
{ 
    int *ret; 
    ret = (int *)&ret + 2; 
    (* ret) = (int)shellcode; 
} 

void main (void) 
{ 
    f(); 
} 

Kompilierung: gcc -mpreferred-stack-boundary = 2 -ggdb -fno-stack-Schutz -o wack wack.c

Aber Segment Fehler empfangen, wenn ich es laufen.

Hier gdb Ergebnis:

(gdb) disas main 
Dump of assembler code for function main: 
    0x080483af <+0>: push %ebp 
    0x080483b0 <+1>: mov %esp,%ebp 
    0x080483b2 <+3>: call 0x8048394 <f> 
    0x080483b7 <+8>: pop %ebp 
    0x080483b8 <+9>: ret 
End of assembler dump. 

(gdb) disas f 
Dump of assembler code for function f: 
    0x08048394 <+0>: push %ebp 
    0x08048395 <+1>: mov %esp,%ebp 
    0x08048397 <+3>: sub $0x4,%esp 
    0x0804839a <+6>: lea -0x4(%ebp),%eax 
    0x0804839d <+9>: add $0x8,%eax 
    0x080483a0 <+12>: mov %eax,-0x4(%ebp) 
    0x080483a3 <+15>: mov -0x4(%ebp),%eax 
    0x080483a6 <+18>: mov $0x804a010,%edx 
    0x080483ab <+23>: mov %edx,(%eax) 
    0x080483ad <+25>: leave 
    0x080483ae <+26>: ret 
End of assembler dump. 

Der Shellcode Array

(gdb) x/20x 0x804a010 
0x804a010 <shellcode>: 0x000001b8 0x0000bb00 0x80cd0000 0x00000000 

In f, die EBP und ret = 0x080483b7

(gdb) x/20x $ebp 
0xbffff2c0: 0xbffff2c8 0x080483b7 0xbffff348 0x00145e37 
0xbffff2d0: 0x00000001 0xbffff374 0xbffff37c 0x0012e414 
0xbffff2e0: 0xffffffff 0x0012cff4 0x08048215 0x00000001 
0xbffff2f0: 0xbffff330 0x0011da51 0x0012dad0 0xb7fffb48 
0xbffff300: 0x00000001 0x0028cff4 0x00000000 0x00000000 

Nach einigen si, ret = 0x0804a010, die ist die Adresse des Shellcode-Arrays.

(gdb) x/20x $ebp 
0xbffff2c0: 0xbffff2c8 0x0804a010 0xbffff348 0x00145e37 
0xbffff2d0: 0x00000001 0xbffff374 0xbffff37c 0x0012e414 
0xbffff2e0: 0xffffffff 0x0012cff4 0x08048215 0x00000001 
0xbffff2f0: 0xbffff330 0x0011da51 0x0012dad0 0xb7fffb48 
0xbffff300: 0x00000001 0x0028cff4 0x00000000 0x00000000 

Segmentfehler nach etwas si, was ich nicht verstehen kann.

Program received signal SIGSEGV, Segmentation fault. 
0x080483ae in f() at wack.c:8 

Können Sie mir bitte helfen?

+0

Ich habe versucht, Ihr Problem zu reproduzieren - der Shellcode sieht gut aus, ich kompilierte unter Debian 6.0.3 mit gcc 4.4.5 (Debian 4.4.5-8) mit genau den Optionen, die Sie verwendet haben, und in meinem Fall funktioniert alles perfekt. Haben Sie versucht, dies auf einem anderen Rechner zu kompilieren und auszuführen? – Rob

+0

Ich bezweifle, dass es so einfach ist, aber was passiert, wenn Sie 'int * ret = malloc (sizeof (int))' (oder welche Größe Sie benötigen) verwenden. – twain249

+0

Nein, ich benutze nur das Ubuntu 11.04. @ Rob – KUN

Antwort

4

Sie haben alles richtig gemacht; Ihr Problem ist, dass shellcode in der .data ELF-Abschnitt platziert wird, und in modernen Systemen .data zugewiesen sind und in nicht ausführbaren Seiten platziert. Versuchen Sie den NX-Flag zu löschen:

[email protected]:~$ sudo apt-get update 
[email protected]:~$ sudo apt-get install execstack 
[email protected]:~$ execstack -s ./wack 
[email protected]:~$ ./wack 
[email protected]:~$ echo $? 

(execstack ist ein Tool zur Abfrage und ändern Sie die ausführbaren Stapel Flagge von ELF-Binaries)

weiter Um die verschiedenen Schutzmechanismen in modernen Betriebssystemen zu verstehen, würde ich Ich schlage vor, Sie beginnen here und vielleicht lesen Mariano Graziano und Andrea Cugliari Papier "Smashing the stack in 2010".

+0

Vielen Dank [email protected] Michael Fouarakis – KUN

Verwandte Themen