Выполнение указателя на функцию Shellcode - PullRequest
2 голосов
/ 13 декабря 2011

Я пытаюсь выполнить этот простой код операции для вызова exit (0), переписав обратный адрес main. Проблема в том, что у меня ошибка сегментации.

#include <stdio.h>

char shellcode[]= "/0xbb/0x14/0x00/0x00/0x00"
                  "/0xb8/0x01/0x00/0x00/0x00"
                  "/0xcd/0x80";

void main()
{
      int *ret;

      ret = (int *)&ret + 2; // +2 to get to the return address on the stack

      (*ret) = (int)shellcode;   

}

Результат выполнения при ошибке сегментации.

[user1@fedo BOF]$ gcc -o ExitShellCode ExitShellCode.c

[user1@fedo BOF]$ ./ExitShellCode

Segmentation fault (core dumped)

Это Objdump shellcode.a

[user1@fedo BOF]$ objdump -d exitShellcodeaAss

exitShellcodeaAss:     file format elf32-i386


Disassembly of section .text:

08048054 <_start>:
 8048054:       bb 14 00 00 00          mov    $0x14,%ebx
 8048059:       b8 01 00 00 00          mov    $0x1,%eax
 804805e:       cd 80                   int    $0x80

Система, которую я использую

fedora Linux 3.1.2-1.fc16.i686 
ASLR is disabled.
Debugging with GDB.
gcc version 4.6.2

Ответы [ 5 ]

2 голосов
/ 18 октября 2012

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

char shellcode[]= "/0xbb/0x14/0x00/0x00/0x00"
                  "/0xb8/0x01/0x00/0x00/0x00"
                  "/0xcd/0x80";

это не то же самое, что:

char shellcode[]= "\xbb\x14\x00\x00\x00"
                  "\xb8\x01\x00\x00\x00"
                  "\xcd\x80";

хотя это исправление не поможет вам решить эту проблему, но вы пытались отключить какой-то механизм защиты ядра, например: бит NX , рандомизация стека и т. Д ...?

0 голосов
/ 24 мая 2017

Если вы хотите, чтобы шелл-код выполнялся в стеке, вы должны скомпилировать его без NX (стековая защита) и с правильными разрешениями.

gcc -fno-stack-protector -z execstack shellcode.c -o shellcode

Например,

#include <stdio.h>
#include <string.h>

const char code[] ="\xbb\x14\x00\x00\x00"
              "\xb8\x01\x00\x00\x00"
              "\xcd\x80";


int main()
{
    printf("Length: %d bytes\n", strlen(code));
    (*(void(*)()) code)();
    return 0;
}

Если вы хотитеотладьте его с помощью gdb:

[manu@debian /tmp]$ gdb ./shellcode 
GNU gdb (Debian 7.7.1+dfsg-5) 7.7.1
Copyright (C) 2014 Free Software Foundation, Inc.
...
Reading symbols from ./shellcode...(no debugging symbols found)...done.
(gdb) b *&code
Breakpoint 1 at 0x4005c4
(gdb) r
Starting program: /tmp/shellcode 
Length: 2 bytes

Breakpoint 1, 0x00000000004005c4 in code ()
(gdb) disassemble 
Dump of assembler code for function code:
=> 0x00000000004005c4 <+0>: mov    $0x14,%ebx
   0x00000000004005c9 <+5>: mov    $0x1,%eax
   0x00000000004005ce <+10>:    int    $0x80
   0x00000000004005d0 <+12>:    add    %cl,0x6e(%rbp,%riz,2) 
End of assembler dump.

В этом примере доказательства концепции не важны нулевые байты.Но когда вы разрабатываете шелл-коды, вы должны помнить и удалять плохих персонажей.

0 голосов
/ 20 мая 2017

В шеллкоде не может быть нулей. Удалить нулевые символы.

0 голосов
/ 30 июля 2012

Вы также можете выполнить шелл-код, как в этом сценарии, приведя буфер к функции, подобной

(*(int(*)()) shellcode)();
0 голосов
/ 15 декабря 2011

На основании двух других вопросов, а именно Как определить адрес возврата в стеке? и C: адрес возврата функции (mac) , я уверен, что вы не перезаписываетеправильный адрес.Это в основном вызвано тем, что вы предполагаете, что адрес возврата может быть определен так, как вы это сделали.Но, как говорится в ответе на первый вопрос ( 1 ), этого не должно быть.

Поэтому:

  1. Проверьте, действительно ли адрес правильный
  2. Найдите способ определения правильного обратного адреса, если вы не хотите использовать встроенную функцию GCC
...