2012-04-12 3 views
2

В последнее время я делаю несколько разбойных упражнений с книгой «справочник shellcoder».
Но когда я пытаюсь проверить код на моем Ubuntu11.04, я всегда получаю ошибку сегмента.
Вот ситуация:Невозможно выяснить, что произошло с разбивкой сегмента сегмента

Сначала я пишу exit_shellcode.s (только простой выход (0) функции):

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

затем я получаю шестнадцатеричный код:

0x000001b8 0x0000bb00 0x80cd0000 

После что я делаю 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(); 
} 

компиляции: НКУ -mpreferred-стек-граница = 2 -ggdb -fno-стек-протектор -o Вак wack.c

Но вина сегмент получил, когда я запускаю его.

Вот GDB Результат:

(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. 

Шеллкод массив

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

В F, то EBP и 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 

После некоторого си, RET = 0x0804a010, который является адресом массива shellcode.

(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 

Сегмент неисправности после некоторого си, который я не могу понять.

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

Не могли бы вы помочь мне?

+0

Попробовал воспроизвести вашу проблему - шеллкод выглядит хорошо, я скомпилирован на Debian 6.0.3 с использованием gcc 4.4.5 (Debian 4.4.5-8) с точно такими же параметрами, и в моем случае все работает отлично. Вы пробовали компилировать и запускать это на другой машине? – Rob

+0

Я сомневаюсь, что это так просто, но что произойдет, если вы используете 'int * ret = malloc (sizeof (int))' (или какой бы размер вам не нужен). – twain249

+0

Нет, я просто использую Ubuntu 11.04. @ Rob – KUN

ответ

4

Вы все сделали правильно; ваша проблема заключается в том, что shellcode находится в разделе ELF .data, а в современных системах .data выделяются и размещаются на неисполнимых страницах. Попробуйте очистить флаг NX:

[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 является инструментом для запроса и изменений исполняемого стека флага ELF бинарников)

Для дальнейшего понимания различных механизмов защиты в современных операционных системах, я бы предложите начать here и, возможно, прочитать статью Мариано Грациано и Андреа Куглиари «Smashing the stack in 2010».

+0

Большое спасибо [email protected] Foukarakis – KUN

Смежные вопросы