獲得操作碼作者here並執行以下操作:如何獲取c程序的最低可執行操作碼?
[[email protected] testbed8]$ as testshell2.s -o testshell2.o
[[email protected] testbed8]$ ld testshell2.o -o testshell2
[[email protected] testbed8]$ objdump -d testshell2
,然後他得到三段(或只提到這3個):
< _start>
<起動機>
<恩德>
我試圖以相同的方式得到十六進制操作碼,但不能正確地ld
。當然,我可以生產.o
和PROG文件例如用:
gcc main.o -o prog -g
然而
時
objdump --prefix-addresses --show-raw-insn -Srl prog
看到與註解和符號,I have many additional sections there完整的代碼,例如:
.init
.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」?
謝謝,我想我會找到我需要的那裏 – 4pie0