Red hat vs Ubuntu 編譯組裝問題(書籍參考)
你能推薦我在 Shellcoder 的手冊中提到的作業系統嗎,因為我在執行那裡提到的 ELF 文件時經常遇到問題(請參閱下面的錯誤)。我知道要克服這些錯誤,我必須輸入命令或參數,但我也這樣做了,但我仍然沒有得到與書中彙編級別相同的輸出。
我正在執行一個文件以在ubuntu 4.15.0-106-generic(我正在使用的測試環境)上進行展示,並且彙編級別的很多東西都不同。
以下差異將幫助您理解我的問題。下面的程式碼來自本書的重點
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.
在本書的輸出中,您表明它們是反彙編的
_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
這是兩個獨立的功能,因此請確保您使用的是
_exit
. 這個答案解釋了兩者之間的區別: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
與i686-linux-gnu
. 前者用於 386 處理器;後者用於 686 處理器。兩者都是 32 位的,所以運氣好的話,使用 686 工具鏈應該沒問題。