我有一段这样的代码:
#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
然后我转为一个可执行文件以确保它可以运行,并且确实使用了以下命令: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
答案 0 :(得分:3)
@st.composite
def list_of_dicts_with_keys_matching(draw, keys=st.text(), values=st.text()):
shared_keys = draw(st.sets(keys))
return draw(st.lists(st.fixed_dictionaries(
{k: values for k in shared_keys}
)))
的机器代码与位置无关,并尝试调用库函数。变成shellcode时,这“不起作用”。
在调试器中单步执行file
,看看它如何失败。
此外,您还需要使用a.exe
,使shellcode位于可执行页面中。