【发布时间】: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