Нужна помощь в компиляции .c файла в шеллкод - PullRequest
2 голосов
/ 20 мая 2019

У меня есть такой код:

#include <stdio.h>

int main()
{
   char z[100] = "Hello world";

   printf("%s", z); 

   getchar(); 
}

Затем я скомпилировал его, используя gcc -S file.c

Затем я превратился в объектный файл, используя: gcc -c file.S -o file.o

Затем я превратился в exe, чтобы убедиться, что он работает, и он использовал это: gcc file.o -o file

Затем я перешел к дампу объектного файла, чтобы найти код операции, используя это: objdump -d file.o

Я извлек код операции и получил это:

\x55\x48\x89\xe5\x48\x81\xec\x90
\x00\x00\x00\xe8\x00\x00\x00\x00
\x48\xb8\x49\x20\x61\x6d\x20\x6c
\x65\x61\x48\xba\x72\x6e\x69\x6e
\x67\x20\x43\x20\x48\x89\x45\x90
\x48\x89\x55\x98\x48\xb8\x70\x72
\x6f\x67\x72\x61\x6d\x6d\x48\xba
\x69\x6e\x67\x20\x6c\x61\x6e\x67
\x48\x89\x45\xa0\x48\x89\x55\xa8
\x48\xb8\x75\x61\x67\x65\x2e\x00
\x00\x00\xba\x00\x00\x00\x00\x48
\x89\x45\xb0\x48\x89\x55\xb8\x48
\xc7\x45\xc0\x00\x00\x00\x00\x48
\xc7\x45\xc8\x00\x00\x00\x00\x48
\xc7\x45\xd0\x00\x00\x00\x00\x48
\xc7\x45\xd8\x00\x00\x00\x00\x48
\xc7\x45\xe0\x00\x00\x00\x00\x48
\xc7\x45\xe8\x00\x00\x00\x00\xc7
\x45\xf0\x00\x00\x00\x00\x48\x8d
\x45\x90\x48\x89\xc2\x48\x8d\x0d
\x00\x00\x00\x00\xe8\x00\x00\x00
\x00\xe8\x00\x00\x00\x00\xb8\x00
\x00\x00\x00\x48\x81\xc4\x90\x00
\x00\x00\x5d\xc3\x90\x90\x90\x90

Затем я выполнил это, используя

#include <stdio.h>

unsigned char code[] = "\x55\x48\x89\xe5\x48\x81\xec\x90\x00\x00\x00\xe8\x00\x00\x00\x00\x48\xb8\x49\x20\x61\x6d\x20\x6c\x65\x61\x48\xba\x72\x6e\x69\x6e\x67\x20\x43\x20\x48\x89\x45\x90\x48\x89\x55\x98\x48\xb8\x70\x72\x6f\x67\x72\x61\x6d\x6d\x48\xba\x69\x6e\x67\x20\x6c\x61\x6e\x67\x48\x89\x45\xa0\x48\x89\x55\xa8\x48\xb8\x75\x61\x67\x65\x2e\x00\x00\x00\xba\x00\x00\x00\x00\x48\x89\x45\xb0\x48\x89\x55\xb8\x48\xc7\x45\xc0\x00\x00\x00\x00\x48\xc7\x45\xc8\x00\x00\x00\x00\x48\xc7\x45\xd0\x00\x00\x00\x00\x48\xc7\x45\xd8\x00\x00\x00\x00\x48\xc7\x45\xe0\x00\x00\x00\x00\x48\xc7\x45\xe8\x00\x00\x00\x00\xc7\x45\xf0\x00\x00\x00\x00\x48\x8d\x45\x90\x48\x89\xc2\x48\x8d\x0d\x00\x00\x00\x00\xe8\x00\x00\x00\x00\xe8\x00\x00\x00\x00\xb8\x00\x00\x00\x00\x48\x81\xc4\x90\x00\x00\x00\x5d\xc3\x90\x90\x90\x90";

int main(int argc, char **argv) {
  int foo_value = 0;

  int (*foo)() = (int(*)())code;
  foo_value = foo();

  printf("%d\n", foo_value);
}

Скомпилировано с использованием gcc shell.c Затем я запустил a.exe и он говорит:

1 [main] a 106 cygwin_exception::open_stackdumpfile: Dumping stack trace to a.exe.stackdump

1 Ответ

3 голосов
/ 20 мая 2019

Машинный код для file не зависит от позиции и пытается вызвать библиотечные функции.Это не «просто работает», когда превращается в шелл-код.

Выполните однократное выполнение вашего a.exe в отладчике и посмотрите, как оно выйдет из строя.

Также вам нужно использовать gcc -zexecstack shell.c, чтобышелл-код находится на исполняемой странице.

...