2016-11-03 4 views
0

私は誰もがこの1で私を助けることができる、この上でセグメンテーションフォールトを取得しておくが、私は一種のASMはexecve x86の - セグメンテーションフォールト

global _start 

section .text 
_start: 

push dword 0x0068732F ; Push /sh 
push dword 0x6E69622F ; Push /bin 
mov eax, esp   ; Store Pointer To /bin/sh In EAX 

push dword 0x0000632D ; Push -c 
mov ebx, esp   ; Store Pointer To -c In EBX 

push dword 0x00000068 ; Push h 
push dword 0x7361622F ; Push /bas 
push dword 0x6E69622F ; Push /bin 
mov ecx, esp   ; Store Pointer To /bin/bash In ECX 

push dword 0x0  ; NULL 
push ecx    ; Push /bin/bash Pointer 
push ebx    ; Push -c Pointer 
push eax    ; Push /bin/sh Pointer 

mov ebx, eax   ; Move /bin/sh Pointer To EAX 
mov ecx, esp   ; Store /bin/sh -c /bin/bash Pointer in ECX 
xor edx, edx   ; Store 0 In EDX 

mov al, 0xb   ; sys_execve 
int 0x80    ; system call 

に新しいです私は、次の

char* Args[] = { "/bin/sh", "-c", "/bin/bash" }; 
    execve("/bin/sh", Args, NULL) 
を複製しようとしています事前に

おかげ

+0

あなたのコードは、SEGV信号を発行するのでしょうか。デバッガはその時点で停止し、何が起きているのかを理解するためにレジスタとメモリを調べます。私はこれらの3つのプッシュがECXにESP保存した後、あなたがすでに –

+0

@TobySpeightあなたはどこに私を示すことができました。 (私は後でマシンでそれを確認する必要があります) – 0xDeMoN

+0

@mewaを取得 – 0xDeMoN

答えて

2

としては、引数がNULLで終了する必要がコメントで指摘しました。

また、mov al, 0xbは、(32ビット)eaxレジスタの下位8ビットのみを設定します。 また、スタックからeax mov eax, espにアドレスをロードし、スタックが大きくなるので、eaxに格納された値は0xFFFFFFFFに非常に近く、0になります。後でmov al, 0xbあなただけの最後のFを代用してeax正確0xbする必要がある場合。

したがって、値をeaxレジスタ全体に移動するか、あらかじめ上位24ビットがゼロに設定されていることを確認する必要があります。たとえば、xor eax, eaxを実行します。どの行で

global _start 

section .text 
_start: 

push dword 0x0068732F ; Push /sh 
push dword 0x6E69622F ; Push /bin 
mov eax, esp   ; Store Pointer To /bin/sh In EAX 

push dword 0x0000632D ; Push -c 
mov ebx, esp   ; Store Pointer To -c In EBX 

push dword 0x00000068 ; Push h 
push dword 0x7361622F ; Push /bas 
push dword 0x6E69622F ; Push /bin 
mov ecx, esp   ; Store Pointer To /bin/bash In ECX 

push 0    ; <----- NULL args terminator 
push ecx    ; Push /bin/bash Pointer 
push ebx    ; Push -c Pointer 
push eax    ; Push /bin/sh Pointer 

mov ebx, eax   ; Move /bin/sh Pointer To EAX 
mov ecx, esp   ; Store /bin/sh -c /bin/bash Pointer in ECX 
xor edx, edx   ; Store 0 In EDX 
;xor eax, eax  ; <----- either xor eax, eax or mov into eax 
mov eax, 11   ; sys_execve 
int 0x80    ; system call 
関連する問題