Linux

Red hat vs Ubuntu 編譯組裝問題(書籍參考)

  • July 2, 2020

你能推薦我在 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-gnui686-linux-gnu. 前者用於 386 處理器;後者用於 686 處理器。兩者都是 32 位的,所以運氣好的話,使用 686 工具鏈應該沒問題。

引用自:https://unix.stackexchange.com/questions/596321