1

ここでオペコードの作成者を取得するには、次のことを行います。

[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" のみを生成するにはどうすればよいでしょうか?

4

2 に答える 2

1

この記事を読む必要があります: http://www.muppetlabs.com/~breadbox/software/tiny/teensy.html . 非常に小さなプログラムを作成するために必要なすべてを詳細に説明しています。

于 2013-08-27T02:39:37.000 に答える