2016-11-03 9 views
0

Я постоянно получаю ошибки сегментации на этом кто-то может помочь мне в этом, я вроде новой для ASMexecve x86 - Сегментация Fault

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? Ваш отладчик должен остановиться в этот момент и позволить вам изучать регистры и память, чтобы понять, что происходит. –

+0

@TobySpeight Как узнать неизвестную строку – 0xDeMoN

+0

@mewa, если возможно, вы могли бы показать мне, где, потому что я уверен, что делаю, как вы уже сказали – 0xDeMoN

ответ

2

Как указано в комментариях, аргументы должны быть NULL прекращены.

Также mov al, 0xb устанавливает только младшие 8 бит регистра (32 бит) eax. Раньше вы также загружали адрес из стека в 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