【问题标题】:Need help compiling .c file into shellcode需要帮助将 .c 文件编译成 shellcode
【发布时间】:2019-05-20 02:13:34
【问题描述】:

我有一段这样的代码:

#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编译 然后我运行了一个.exe,它说:

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

【问题讨论】:

  • 另外请注意,当遇到 nul 时,CPU 将停止执行您的 shellcode。所以 "\x55\x48\x89\xe5\x48\x81\xec\x90\x00" 是您的示例中将执行的全部内容。
  • 啊,我忘了 nul 字符

标签: c gcc assembly shellcode objdump


【解决方案1】:

file 的机器代码与位置无关,它会尝试调用库函数。当变成 shellcode 时,这不会“正常工作”。

在调试器中单步执行您的a.exe,看看它是如何失败的。

另外,您需要使用gcc -zexecstack shell.c,以便shellcode 在可执行页面中。

【讨论】:

  • OP 已将他的 shell 代码放入静态存储中,因此使堆栈可执行不会改变任何内容。
  • @fuz: gcc -zexecstack 使所有部分/段可执行,包括使用malloc 新分配的动态存储。 “堆栈”名称很不幸。
  • 谢谢,有时间我会查的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多