2016-06-18 3 views
0

Я сделал простую программу для сборки:проектировал Shellcode дает неверные результаты

.text 
    .globl _start 
    _start: 
     mov %20, %rbx 
     mov %1, %rax 
     int $0x80 

Это, очевидно, работает на 64-битных ОС (Linux). Затем я составил его следующим образом:

as -o ExitShellcode.o ExitShellcode.s 
ld -o ExitShellcode ExitShellcode.o 

И, наконец, после запуска программы, он выходит со статусом 20

echo $? 
20 

Использование objdump сваливать шеллкода для файла дает:

objdump -d ExitShellcode 

ExitShellcode:  file format elf64-x86-64 


Disassembly of section .text: 

0000000000400078 <_start>: 
400078: 48 c7 c3 14 00 00 00 mov $0x14,%rbx 
40007f: 48 c7 c0 01 00 00 00 mov $0x1,%rax 
400086: cd 80     int $0x80 

Однако после размещения шеллкода в этой программе:

#include <stdio.h> 

char shellcode[] = "\x48\xc7\xc3\x14\x00\x00\x00" 
        "\x48\xc7\xc0\x01\x00\x00\x00" 
        "\xcd\x80"; 

int main() 
{ 
    int *ret; 

    ret = (int *)&ret +2; 

    *ret = (int)shellcode; 

} 

и компиляции:

gcc -g -o Shellcode Shellcode.c 
Shellcode.c: In function ‘main’: 
Shellcode.c:13:9: warning: cast from pointer to integer of different  size  [-Wpointer-to-int-cast] 
*ret = (int)shellcode; 

и работает, программа завершается с 0 Статус:

echo $? 
0 

Что proplem? Не должен ли он выйти с 20?

+0

'* ret = (int) shellcode;' копирует только один int. – wildplasser

+1

Вы никогда не назовете шеллкод где-нибудь. – slugonamission

+0

@slugonamission Как мне это сделать? –

ответ

2

Ваш код неправильно предполагает, что компилятор поставит переменную ret в определенное место в стеке относительно обратного адреса main. Вместо этого компилятор помещает его в другое место, поскольку это разрешено делать, и поэтому ваш код ничего не делает. Возможно, вы следуете плохо спроектированному примеру, который вы нашли в Интернете.

Если вы хотите, чтобы выполнить «шеллкода» в shellcode массиве, вы можете попробовать кастинг на него указатель на функцию, а затем называть его:

char shellcode[] = "\x48\xc7\xc3\x14\x00\x00\x00" 
       "\x48\xc7\xc0\x01\x00\x00\x00" 
       "\xcd\x80"; 

int main() 
{ 
    ((void (*)()) shellcode)(); 
} 

Однако это все еще, вероятно, не потому, что секция .data где shellcode не является выполнимым и поэтому программа будет сбой при запуске. Чтобы устранить эту проблему, используйте опцию -zexecstack при связывании вашей программы. Например:

gcc -zexecstack -g -o Shellcode Shellcode.c 
+0

Большое спасибо; Это работало! Но можете ли вы объяснить, как это работает? –

+0

@DarkEagle Приводит «shellcode» к указателю на функцию, а затем вызывает функцию. –

+0

Большое спасибо за помощь –

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