2014-12-22 57 views
0

我正在嘗試編寫ASM代碼來生成一個shell。將「/ bin/sh」加載到寄存器中

我已經想通了,對於__execve系統調用號是0x3b或59

我需要發送"/bin/sh"作爲第一個參數,一個指向{"/bin/sh", NULL}作爲第二個參數和NULL作爲第三個參數。

通過在英特爾架構x86_64的ASM的convetions - 第一個參數被寫入到寄存器RDI,第二個參數被寫入到寄存器RSI,最後一個參數被寫入到RDX寄存器。

這是我的代碼:

global _start 

section .text 

_start: 

jmp message 

mystart: 
    xor  rax, rax 
    push rax 
    push rax 
    pop  rdx  ; third parameter - NULL 
    pop  rdi  ; first parameter - "/bin/sh" 
    mov  rax, rdi  
    push rax 
    push rsp 
    pop  rsi  ; second parameter - pointer to {"/bin/sh", NULL} 
    xor  rax, rax 
    mov  al, 0x3b 
    syscall 


    xor rax, rax 
    mov al, 0x3c 
    xor rdi, rdi 
    mov dil, 0x0a 
    syscall 

message: 

    call mystart 
    db "/bin/sh" 

section .data 

我用下面的指令來編譯和鏈接代碼。

yasm -f elf64 shell.asm -o shell.o 
ld -o shell.out shell.o 

_start功能的GDB轉儲如下:

Dump of assembler code for function _start: 
0x0000000000400080 <+0>: jmp 0x4000a3 <_start+35> 
0x0000000000400082 <+2>: xor rax,rax 
0x0000000000400085 <+5>: push rax 
0x0000000000400086 <+6>: push rax 
0x0000000000400087 <+7>: pop rdx 
0x0000000000400088 <+8>: pop rdi 
0x0000000000400089 <+9>: mov rax,rdi 
0x000000000040008c <+12>: push rax 
0x000000000040008d <+13>: push rsp 
0x000000000040008e <+14>: pop rsi 
0x000000000040008f <+15>: xor rax,rax 
0x0000000000400092 <+18>: mov al,0x3b 
0x0000000000400094 <+20>: syscall 
0x0000000000400096 <+22>: xor rax,rax 
0x0000000000400099 <+25>: mov al,0x3c 
0x000000000040009b <+27>: xor rdi,rdi 
0x000000000040009e <+30>: mov dil,0xa 
---Type <return> to continue, or q <return> to quit--- 
0x00000000004000a1 <+33>: syscall 
0x00000000004000a3 <+35>: call 0x400082 <_start+2> 
0x00000000004000a8 <+40>: pop rsp 
0x00000000004000a9 <+41>: (bad) 
0x00000000004000aa <+42>: (bad) 
0x00000000004000ab <+43>: .byte 0x69 
0x00000000004000ac <+44>: outs dx,BYTE PTR ds:[rsi] 
0x00000000004000ad <+45>: pop rsp 
0x00000000004000ae <+46>: (bad) 
0x00000000004000af <+47>: jae 0x400119 

正如你可以看到(bad)指令由db "/bin/sh"引起的,什麼是錯的這個字符串?什麼是(bad)指令?我如何在未來調試這些問題?

+2

字符串沒有錯。它中的字節不會映射到任何有效的asm操作碼。因此,當調試器試圖將該字符串解釋爲代碼時,它將其稱爲「不良」。 –

+0

@DavidWohlferd - 當我以同樣的方式創建一個'Hello,World!'程序時,這並沒有發生。 –

回答

2

①無法將字符串加載到寄存器中,只能指向字符串的指針。

②你的魔法堆只是錯誤的。將其中一個push rax加倍到pop rdi以下,該程序適用於我。

相關問題