Red HatとUbuntuのコンパイルとアセンブリの問題(本を参照)

Red HatとUbuntuのコンパイルとアセンブリの問題(本を参照)

Shellcoderのマニュアルに記載されているELFファイルを実行する際に問題が発生するため、Shellcoderのマニュアルに記載されているオペレーティングシステムをお勧めできますか(下記のエラーを参照)。これらのエラーを克服するには、コマンドまたはパラメータを入力する必要があることを知っていますが、それを行いましたが、まだアセンブリレベルで本に記載されているのと同じ出力を取得できません。

デモするファイルを実行しています。Ubuntu 4.15.0-106-一般(私が使用するテスト環境)とアセンブリレベルの多くは異なります。

以下の違いは私の問題を理解するのに役立ちます。以下のコードはこの本の主な内容を抜粋したものですint 0x80 instruction

パスワード:

main()
{
    exit(0);
}

この本のo / pは次のとおりです。

[slap@0day root] gdb exit
GNU gdb Red Hat Linux (5.3post-0.20021129.18rh)
Copyright 2003 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you
are welcome to change it and/or distribute copies of it under certain
conditions. Type “show copying” to see the conditions.
There is absolutely no warranty for GDB. Type “show warranty” for
details.
This GDB was configured as “i386-redhat-linux-gnu”...
(gdb) disas _exit
Dump of assembler code for function _exit:
0x0804d9bc <_exit+0>: mov 0x4(%esp,1),%ebx
0x0804d9c0 <_exit+4>: mov $0xfc,%eax
0x0804d9c5 <_exit+9>: int $0x80
0x0804d9c7 <_exit+11>: mov $0x1,%eax
0x0804d9cc <_exit+16>: int $0x80
0x0804d9ce <_exit+18>: hlt
0x0804d9cf <_exit+19>: nop
End of assembler dump.

私のテスト環境(ubuntu 4.15.0-106-generic 16.04.1)のo / pは次のとおりです。:

GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.5)7.11.1
This GDB was configured as "i686-linux-gnu"
gdb-peda$ disas exit
Dump of assembler code for function exit@plt:
   0x080482e0 <+0>:     jmp    DWORD PTR ds:0x804a00c
   0x080482e6 <+6>:     push   0x0
   0x080482eb <+11>:    jmp    0x80482d0
End of assembler dump.

int 0x80ご覧のとおり、本とは異なり、テスト環境に関するガイダンスはありません。

間違い:

スタック衝突が検出されました。---このエラーを克服するために、時々動作する(-fno-stack-protector)を使用しました。

または

返品分割エラー(コアダンプ)---本に言及していないときにこのエラーが発生し、本の内容に合わせてパッチが必要なLinuxバージョンを使用していることがわかりました。

それでは、本で言及されている環境/オペレーティングシステムをお勧めできますか?それとも、私のテスト環境(Linux 4.15.0-106-generic#107〜16.04.1-Ubuntu)で動作するように本に記載されているバイナリをコンパイルする方法はありますか?

編集する:

elfファイルコンパイルコマンド:

gcc -m32 -fno-stack-protector exit.c -o exit

また、これを試しました。

gcc -static -m32 -fno-stack-protector exit.c -o exit 

アセンブリを追加すると、-static次のようになります。

gdb-peda$ disas exit
Dump of assembler code for function exit:
   0x0804e440 <+0>:     sub    esp,0x10
   0x0804e443 <+3>:     push   0x1
   0x0804e445 <+5>:     push   0x80eb070
   0x0804e44a <+10>:    push   DWORD PTR [esp+0x1c]
   0x0804e44e <+14>:    call   0x804e320 <__run_exit_handlers>
End of assembler dump.

ベストアンサー1

本の出力からの分解を示します_exit

This GDB was configured as “i386-redhat-linux-gnu”...
(gdb) disas _exit

しかし、実験では、次のように分解しましたexit(前に下線がないことに注意してください)。

This GDB was configured as "i686-linux-gnu"
gdb-peda$ disas exit

これは2つの別々の機能なので、使用していることを確認してください_exit。この回答では、2つの機能の違いについて説明します。https://unix.stackexchange.com/a/5375/90691

また、あなたの出力では、exit@plt「plt」は動的リンクシンボルを解決する部分である「プロシージャ接続テーブル」を表します。以下を使用してコンパイルする-static場合、この回答はより詳細な説明を提供します。https://unix.stackexchange.com/a/256852/90691

-static本の中のプログラムなしでコンパイルしてプログラムを逆アセンブルしようとすると、次のようなものが表示されることがあります。

(gdb) disassemble _exit
No symbol "_exit" in current context.

その理由は、プログラムがその記号を参照する項目がないためです_exit。コンパイルすると-static問題が解決する可能性があります。そうでない場合は、代わり_exitに呼び出すようにプログラムを変更できますexit

最後にi386-redhat-linux-gnuVS。i686-linux-gnu前者は386プロセッサに適しており、後者は686プロセッサに適しています。どちらも32ビットなので、運が良ければ686ツールチェーンを使用できます。

おすすめ記事