ここでオペコードの作成者を取得するには、次のことを行います。
[bodo@bakawali testbed8]$ as testshell2.s -o testshell2.o
[bodo@bakawali testbed8]$ ld testshell2.o -o testshell2
[bodo@bakawali testbed8]$ objdump -d testshell2
そして、彼は 3 つのセクションを取得します (またはこれら 3 つだけに言及します)。
<_start>
<スターター>
<エンダー>
同じ方法で 16 進数のオペコードを取得しようとしましたが、ld
正しく取得できません。もちろん.o
、たとえば次のようにファイルを生成およびプログラムできます。
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() が発生し、同じ結果になりました。
では、上記のセクションから何を選択するか、または 3 つのセクションのように最小化された "prog" のみを生成するにはどうすればよいでしょうか?