簡體   English   中英

GDB-匯編程序返回/ bin / sh:0:無法打開

[英]GDB - Assembly program returns /bin/sh: 0: Can't open �

我目前正在從相關的Pentester學院課程中學習64位匯編語言。 我正在處理的代碼在GDB中運行時會產生以下錯誤:

/ bin / sh:0:無法打開-[以代碼0177退出的劣等1(進程4049)]

我已經在錯誤和退出代碼上搜索了Google,但沒有發現任何有用的信息。 我試圖一遍又一遍地分析GDB中的代碼,但是所有正確的值似乎都在正確的寄存器中。 我似乎找不到任何問題。

您可以在下面找到代碼。 我的目標只是使用Jump-call-pop技術調用execve syscall。

global _start
section .text

_start:

jmp bash

code:

xor rax, rax
pop rdi
mov [rdi +7], al    

push rdi
mov rsi, rsp
push rax
mov rdx, rsp
mov al, 59
syscall 

bash:

call code 
string:     db      '/bin/shABBBBBBBBCCCCCCCC' 

編輯:

這是我構建程序的方式:

nasm -f elf64 -o execve_stack_jcp.o execve_stack_jcp.asm 
ld -o execve_stack_jcp execve_stack_jcp.o

然后,我使用objdump -M intel -d execve_stack_jcp輸出反匯編,然后在此c程序中輸入該反匯編:

#include <stdio.h>
#include <string.h>

unsigned char code[] = \
"\xeb\x13\x48\x31\xc0\x5f\x88\x47\x07\x57\x48\x89\xe6\x50\x48\x89\xe2\xb0\x3b\x0f\x05\xe8\xe8\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x41\x42\x42\x42\x42\x42\x42\x42\x42\x43\x43\x43\x43\x43\x43\x43\x43";

int main(void) {

printf("Shellcode length: %d\n", (int)strlen(code));

int (*ret)() = (int(*)())code;

ret();

return 0;
}

最后,我使用以下命令編譯c程序:

gcc -fno-stack-protector -z execstack -o shellcode shellcode.c

Linux中的execve是這樣定義的:

int execve(const char *文件名,char * const argv [],char * const envp []);

[剪斷]

argv是傳遞給新程序的參數字符串數組。 按照約定,這些字符串中的第一個(即argv [0])應包含與正在執行的文件關聯的文件名。 envp是一個字符串數組,通常形式為key = value,這些字符串作為環境傳遞到新程序。 argvenvp數組必須在數組末尾都包含一個空指針

如果要通過strace ./shellcode運行程序,則可能會看到類似以下內容:

execve(“ / bin / sh”,[“ / bin / sh”,“ \\ 270”,“ \\ 1”,“ \\ 353 \\ 23H1 \\ 300_ \\ 210G \\ 7WH \\ 211 \\ 346PH \\ 211 \\ 342 \\ 260; \\ 17 \\ 5 \\ 350 \\ 350 \\ 377 \\ 377 \\ 377 / bin / s“ ...],[/ * 0變量* /])= 0

您會注意到第二個參數argv在數組中有很多額外的條目。 這是因為您沒有使用NULL終止argv數組。 要更正此問題,您可以通過如下方式通過將0(通過RAX )壓入堆棧來修改代碼:

xor rax, rax 
pop rdi
mov [rdi +7], al

push rax      ; NULL terminates the `argv` array
push rdi
mov rsi, rsp
push rax
mov rdx, rsp

如果您再次通過strace運行此更改,則會看到類似以下內容的內容:

execve(“ / bin / sh”,[“ / bin / sh”],[/ * 0 vars * /])= 0

這應該最終是成功的execve調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM