要在此处获取操作码作者,请执行以下操作:
[bodo@bakawali testbed8]$ as testshell2.s -o testshell2.o
[bodo@bakawali testbed8]$ ld testshell2.o -o testshell2
[bodo@bakawali testbed8]$ objdump -d testshell2
然后他得到三个部分(或仅提及这三个部分):
<_开始>
<启动器>
<安德>
我试图以相同的方式获取十六进制操作码,但不能ld
正确。当然,我可以生成.o
和 prog 文件,例如:
gcc main.o -o prog -g
然而当
objdump --prefix-addresses --show-raw-insn -Srl prog
要查看带有注释和符号的完整代码,我还有许多其他部分,例如:
。在里面
.plt
.text(是的,我知道,主要在这里)[这里有很多部分:_start()、call_gmon_start()、__do_global_dtors_aux()、frame_dummy()、main()、__libc_csu_init()、__libc_csu_fini()、__do_global_ctors_aux()]
.fini
我假设这些是 gcc 链接到运行时库引入的附加功能。我认为我不需要这些所有部分来从 c 代码调用操作码(作者只使用这 3 个部分)但是我的问题是我不知道我可能会丢弃哪些确切的内容以及哪些是必要的。我想像这样使用它:
#include <unistd.h>
char code[] = "\x31\xed\x49\x89\x...x00\x00";
int main(int argc, char **argv)
{
/*creating a function pointer*/
int (*func)();
func = (int (*)()) code;
(int)(*func)();
return 0;
}
所以我创建了这个:
#include <unistd.h>
/*
*
*/
int main() {
char *shell[2];
shell[0] = "/bin/sh";
shell[1] = NULL;
execve(shell[0], shell, NULL);
return 0;
}
我按照我的描述做了拆卸。我尝试使用 .text main() 中的操作码,这给了我分段错误,然后是 .text main() + 另外 .text _start(),结果相同。
那么,从上面的部分中选择什么,或者如何只生成最小化的“prog”,就像三个部分一样?