2013-05-18 67 views
0

我在寫的shellcode(execve的使用堆棧法)閱讀基本的文章在這裏堆棧存儲器地址:http://hackoftheday.securitytube.net/2013/04/demystifying-execve-shellcode-stack.html中的Shellcode

在第6步:它會將一個空字符,因爲該字符串「/ bin/sh的」是null終止。之後,它按相反順序推動字符串「/ bin/sh」

爲什麼字符串按相反順序推送到堆棧,爲什麼是空字符終止將字符串推到「before」之前的字符串疊加麼?

+0

只是一個提示。如果你想讓這個問題吸引更多有幫助的人,我建議在問題本身中包含更多細節,而不是引用外部來源。這是因爲一旦這樣的消息來源到期,問題就會脫離上下文。 – jwaliszko

+0

@JaroslawWaliszko謝謝。我會記住這一點。 – Karan

回答

4

應放入堆棧的字符串以下內容:

//bin/sh + '\0'(null terminator) + alignment(3 additional null characters) - gives 3 DWORDs (12 bytes) 

爲了做到這一點,我們有一個正確的順序執行指令集:

xor  eax, eax  ;zero out full 32 bits of eax register 
push eax    ;0x00000000 
push 0x68732f6e  ;hs/n 
push 0x69622f2f  ;ib// 

爲什麼在這樣的訂單 ?

由於堆棧的性質。元素應該以相反的順序放入,以便將來能夠正確地讀出它。堆棧是一個數據結構,它有先進先出(FILO)排序(與堆相對)。這意味着放入堆棧的第一個項目是最後一個項目。隨着堆棧大小的變化,它向着更低的內存地址向上增長:

     memory 
.---------------.-- 00 <-- top /low addresses 
|  .  |  x+1 
|  /|\  |  x+2 
|  |  |  . 
|  stack  |  . 
|grows up toward|  . 
|lower addresses|  x+n 
'---------------'-- FF <-- bottom/high addresses 

現在,這些2個字:0x68732f6e (hs/n)0x69622f2f (ib//)?它們與//bin/sh有什麼聯繫?

看着0x68732f6e我們可以看到字節反轉效應,顯示的字節一字節,實際存儲在內存中,4字節:0x6e 0x2f 0x73 0x68 (n/sh)。它與IA-32體系結構特定的endianess連接,在手動將字節放入堆棧時必須考慮。在x86處理器的值存儲在小端(相反在SPARC處理器大端)字節順序,這意味着至少顯著字節首先被存儲(小端至上):

byte3 byte2 byte1 byte0 

將在內存中安排如下:

base address+0 byte0 
base address+1 byte1 
base address+2 byte2 
base address+3 byte3 

所以最後,以可視化的內存空間的填充方式,看看下面:

.--------- push eax    ;0x00000000 
| .----- push 0x68732f6e  ;hs/n   bytes reversed 
| | .- push 0x69622f2f  ;ib//   bytes reversed 
| | |          
| | |  register      
| | '> |69|62|2f|2f| (ib//)  memory 
| |  | | | |     .. 
| |  | | | '------->  x: 2f '/' 
| |  | | '----------> x+1: 2f '/' 
| |  | '-------------> x+2: 62 'b' 
| |  '----------------> x+3: 69 'i' 
| |   little endian  
| |     
| '----> |68|73|2f|6e| (hs/n)  
|   | | | | 
|   | | | '-------> x+4: 6e 'n' 
|   | | '----------> x+5: 2f '/' 
|   | '-------------> x+6: 73 's' 
|   '----------------> x+7: 68 'h' 
| 
'--------> |00|00|00|00| (\0\0\0\0) 
      | | | |     
      | | | '-------> x+8: 00 '\0' 
      | | '----------> x+9: 00 '\0' 
      | '-------------> x+10: 00 '\0' 
      '----------------> x+11: 00 '\0' 
             .. 

您可以通過使用GDB考試系統是:

(gdb) x/12b $sp 
0xbfb530b0:  0x2f 0x2f 0x62 0x69 0x6e 0x2f 0x73 0x68 
0xbfb530b8:  0x00 0x00 0x00 0x00 
(gdb) x/12c $sp 
0xbfb530b0:  47 '/' 47 '/' 98 'b' 105 'i' 110 'n' 47 '/' 115 's' 104 'h' 
0xbfb530b8:  0 '\0' 0 '\0' 0 '\0' 0 '\0' 
(gdb) x/3w $sp 
0xbfb530b0:  0x69622f2f  0x68732f6e  0x00000000