为什么此shellcode会导致目标挂起?

时间:2019-09-13 15:19:10

标签: assembly arm shellcode

首先,我对ARM的汇编不太熟悉。

基本上,我正在尝试编写类似于this的shellcode。该代码工作正常,但是我正在尝试进行一些修改以查看其工作方式。这是目标程序:

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

int main(){

    char payload[34];
    int len=fread(payload, 1, 34, stdin);

    printf("Length: %d\n", len);
    (*(void(*)()) payload) ();
}

我从该链接编译程序集,将shellcode切成一个文件,然后将其发送到stdin,如下所示:

(cat shellcode; echo ps) | ./target

哪种产量:

Length: 34
  PID TTY          TIME CMD
 3565 pts/3    00:00:00 bash
 3854 pts/3    00:00:00 sh
 3856 pts/3    00:00:00 ps

当我对编写的Shellcode执行相同操作时,该程序挂起,占用了100%的CPU。如果我在gdb中经过足够的时间,就会一遍又一遍地得到以下内容:

(gdb) s
55      in dl-addr.c

这是我写的汇编代码:

.LC0:
        .global main
main:
        mov     r2, #0
        mov     r1, #0
        ldr     r0, =string
        bl      execve
string:
        .asciz "/bin/sh"

我正在Raspberry Pi上运行它。

谢谢!

1 个答案:

答案 0 :(得分:1)

bl execve试图调用'C'库execve,而不是Linux syscall。使用

mov r7, #11
swi #0

代替writing ARM shellcodebl execve。另外,使用adr string代替ldr =string将节省四个字节,并使Shell代码更健壮(PIC)。

我将汇编代码修改为以下代码,并且可以正常工作!

.LC0:
        .global main
main:
        mov     r2, #0
        mov     r1, #0
        adr     r0, string
        mov r7, #11
        swi #0
string:
        .asciz "/bin/sh"