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