2017-09-28 47 views
1

我正在用匯編程序存在:編譯彙編程序以扁平狀二進制包括外來「F」字符不以其它格式

xor eax, eax  ; make eax equal to 0 
push eax   ; pushes null 
push 0x68732f2f  ; pushes /sh (//) 
push 0x6e69622f  ; pushes /bin 
mov ebx, esp  ; passes the first argument 
push eax   ; empty third argument 
mov edx, esp  ; passes the third argument 
push eax   ; empty second argument 
mov ecx, esp  ; passes the second argument 
mov al, 11   ; execve system call #11 
int 0x80   ; makes an interrupt 

當使用nasm爲平坦編譯-form二進制文件,我在程序的十六進制表示中看到無關的f字符。我期待看到:

0000000: 31c0 5068 2f2f 7368 682f 6269 6e89 e350 1.Ph//shh/bin..P         
0000010: 89e2 5089 e1b0 0bcd 80     ..P...... 

但真正看到:

0000000: 6631 c066 5066 682f 2f73 6866 682f 6269 f1.fPfh//shfh/bi 
0000010: 6e66 89e3 6650 6689 e266 5066 89e1 b00b nf..fPf..fPf.... 
0000020: cd80          .. 

奇怪的是,當我嘗試以其他格式,如ELF-32使用nasm編譯我的程序,我看到了十六進制表示我我希望(儘管許多其他十六進制的我也許不應該在我的解決方案包括):

0000000: 7f45 4c46 0101 0100 0000 0000 0000 0000 .ELF............ 
0000010: 0100 0300 0100 0000 0000 0000 0000 0000 ................ 
0000020: 4000 0000 0000 0000 3400 0000 0000 2800 @.......4.....(. 
0000030: 0500 0200 0000 0000 0000 0000 0000 0000 ................ 
0000040: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 
0000050: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 
0000060: 0000 0000 0000 0000 0100 0000 0100 0000 ................ 
0000070: 0600 0000 0000 0000 1001 0000 1900 0000 ................ 
0000080: 0000 0000 0000 0000 1000 0000 0000 0000 ................ 
0000090: 0700 0000 0300 0000 0000 0000 0000 0000 ................ 
00000a0: 3001 0000 2100 0000 0000 0000 0000 0000 0...!........... 
00000b0: 0100 0000 0000 0000 1100 0000 0200 0000 ................ 
00000c0: 0000 0000 0000 0000 6001 0000 3000 0000 ........`...0... 
00000d0: 0400 0000 0300 0000 0400 0000 1000 0000 ................ 
00000e0: 1900 0000 0300 0000 0000 0000 0000 0000 ................ 
00000f0: 9001 0000 1000 0000 0000 0000 0000 0000 ................ 
0000100: 0100 0000 0000 0000 0000 0000 0000 0000 ................ 
0000110: 31c0 5068 2f2f 7368 682f 6269 6e89 e350 1.Ph//shh/bin..P 
0000120: 89e2 5089 e1b0 0bcd 8000 0000 0000 0000 ..P............. 
0000130: 002e 7465 7874 002e 7368 7374 7274 6162 ..text..shstrtab 
0000140: 002e 7379 6d74 6162 002e 7374 7274 6162 ..symtab..strtab 
0000150: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 
0000160: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 
0000170: 0100 0000 0000 0000 0000 0000 0400 f1ff ................ 
0000180: 0000 0000 0000 0000 0000 0000 0300 0100 ................ 
0000190: 0073 6865 6c6c 7370 6177 6e2e 6173 6d00 .shellspawn.asm. 

對於什麼,我試圖完成,我想我必須使用一臺形式的二進制文件。

我的問題:這是什麼f字符來自什麼,它是什麼意思;我如何刪除它?

NASM version 2.10.09 compiled on Dec 29 2013

xxd V1.10 27oct98 by Juergen Weigert

+0

如果您只是想將指針傳遞給NULL作爲第二個和第三個參數,爲什麼不讓它們都指向第一個'push eax'結果(這也是字符串終止符)?即xor-zero/push /'mov edx,esp' /'mov ecx,esp'。另外,[man page](http://man7.org/linux/man-pages/man2/execve.2.html)說你實際上可以傳遞一個argv = NULL和envp = NULL(但是警告它不是可移植的並不依賴於它)。所以你可以只用'edx,edx' /'push edx'/... /'mov ecx,edx' /'lea eax,[edx + 11]'。 –

回答

2

nasm -f bin一個更深入的答案設置默認模式爲16位。在該模式下,32位操作數大小指令(如xor eax,eaxpush eax)必須用0x66操作數大小前綴進行編碼。有關操作數大小和地址大小的模式與前綴的對比見this table。 (f0x66,以ASCII)。另請參閱標記wiki中的x86手冊鏈接。另請參閱how to disassemble flat binaries,採用16,32或64位模式。

-f elf-felf32的同義詞,所以其定位的32位模式。 -felf64靶向64位模式下(其中push eax不是encodeable)。

請參閱NASM手冊中的section 6.1BITS 32告知彙編程序彙編程序爲32位模式,根據輸出文件格式覆蓋缺省值。 IDK,如果有一個命令行選項可以生成32位代碼的平面二進制文件。我在手冊頁或--help中看不到一個。如果由於某種原因,您確實不想更改源代碼,則可以使用-felf並使用ld --oformat binary鏈接平面二進制文件。見How to generate plain binaries like nasm -f bin with the GNU GAS assembler?

啊,文檔意味着BITS 32是唯一的方法:

使用BITS指令最可能的原因是在一個平面的二進制文件中寫入32位或64位代碼;你的實際代碼


代碼審查:

如果你只是想指針傳遞給NULL作爲第二和第三指定參數時,爲什麼不能讓他們都指向第一push eax結果(這也是字符串結束符)?即xor-zero/push/mov edx, esp/mov ecx, esp

此外,the man page說,你其實可以傳遞一個的argv = NULL和envp = NULL(但警告說,這並不便攜,不依賴於它)。所以你可以只需要xor edx,edx/push edx/.../mov ecx,edx/lea eax, [edx+11]

+0

我用'BITS 32'去了,現在hex代表我想要的方式。謝謝! – jakenberg

0

我前言本有,我不是100%肯定這一點,但...

This website,它是一個操作數大小覆蓋前綴。我要去猜測,彙編正在加倍小心,或者是設置爲32位彙編輸出,這是剩下的有趣的嘗試,並確保您xormov指令是正確的尺寸。它似乎實際上不會影響運行時,如果該網站是正確的,所以也許只是額外的窗飾。

我會仔細檢查傳入NASM標誌,以確保你不小心告訴它做的比預期的舉動。

或者希望從鐵道部近86 ASM編碼器:)

+0

感謝您對Michael的幫助。我的nasm用法如下:'nasm shellspawn.asm'。我試過比這更具體,但我得到了相同的結果。我會繼續研究這條大道 – jakenberg

+1

這不是一個「額外謹慎」的問題。在32位代碼中,0x66操作數大小意味着16位操作數大小,所以您必須正確地獲取模式。但是,是的,@jakenberg'-fbin'的默認值是16位模式。您可以使用「BITS 32」指令。我不確定是否有NASM選項將模式設置爲32位,同時仍然製作平面二進制文件。 –

+0

謝謝彼得。我在'.asm'文件的頂部放置了'BITS 32',我不再看到大小操作數前綴。從你們兩個人那裏學到了一些東西! – jakenberg

相關問題