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?
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
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
Nein, ich benutze nur das Ubuntu 11.04. @ Rob – KUN