C 简单ARM任意代码执行程序上的非法指令错误

C 简单ARM任意代码执行程序上的非法指令错误,c,arm,C,Arm,我在Raspberry Pi 3上编写了一个简单的代码执行漏洞,我得到了一个“非法指令”错误。为了编译此程序,我禁用了ASLR并添加了以下编译器选项: -fno-inline -O0 -fno-stack-protector -z execstack -Wall 我在g=h赋值上得到了一个“来自不兼容指针类型的赋值”警告,但我不明白为什么会出现这个问题 代码如下: #include <stdio.h> #include <stdint.h> #include <s

我在Raspberry Pi 3上编写了一个简单的代码执行漏洞,我得到了一个“非法指令”错误。为了编译此程序,我禁用了ASLR并添加了以下编译器选项:

-fno-inline -O0 -fno-stack-protector -z execstack -Wall
我在
g=h
赋值上得到了一个“来自不兼容指针类型的赋值”警告,但我不明白为什么会出现这个问题

代码如下:

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

void printFunction(char *f){
    for(int i=0;i<50;i++){
        printf("\\x%x",(f)[i]);
    }
    printf("\n");
}

void f(){
    printf("Success\n");
}

int main(){

    void (*g)();

    g=f;
    printf("%p\n",g);
    g=(void *)0x1053c; // This is the address of f()
    printf("%p\n",g);

    char h[256];
    memcpy(h,f,256);

    printFunction((char *)g);
    printFunction((char *)h);

    g(); // Succeeds
    g=h;
    g(); // Fails
}

不能将函数强制转换为任何类型的数据指针。
memcpy(h,f,256)是非法的


g=h似乎可以编译,但仍然会导致一个坏的可执行文件<代码>h
将处于未定义状态。

非常危险的主题,无法将函数复制到内存中的不同位置。第一个原因是代码存储在.text节中,您可以访问堆栈和堆。关于这一点,您可以在这里找到更多信息:将外壳代码写入另一个进程,然后仅使用CreateRemoteThread(例如windows计算机上的CreateRemoteThread)调用该进程是执行外壳代码的常用技术。这个特定的案例非常有趣,不幸的是,我的环境现在非常有限,所以我甚至不能在调试器中查看它。但我确实发现了以下几点:
memcpy(f,h,256)
即使内存看起来完全相同,来回复制也会中断第一个
g
调用。在这一点上,似乎不太可能出现对齐问题。也许是页面保护/调用conv?我不知道ARM,但在PowerPC上,仅仅复制代码是不够的。您还需要刷新缓存并使其无效,以便将新代码正确读入指令缓存。有关此代码的任何内容都不是任意的,也不希望以任何方式或形式工作。在某些平台上,您可能会感到幸运,因为您没有意识到它应该失败。但一般来说,没有理由期望该代码能够工作。如果失败了,那么您就成功了。事实上,堆栈所在的页面甚至都是可执行的吗?
0001053c <f>:
   1053c:       e92d4800        push    {fp, lr}
   10540:       e28db004        add     fp, sp, #4
   10544:       e59f0008        ldr     r0, [pc, #8]    ; 10554 <f+0x18>
   10548:       ebffff88        bl      10370 <puts@plt>
   1054c:       e1a00000        nop                     ; (mov r0, r0)
   10550:       e8bd8800        pop     {fp, pc}
   10554:       00010678        .word   0x00010678

00010558 <main>:
   10558:       e92d4800        push    {fp, lr}
   1055c:       e28db004        add     fp, sp, #4
   10560:       e24ddf42        sub     sp, sp, #264    ; 0x108
   10564:       e59f3084        ldr     r3, [pc, #132]  ; 105f0 <main+0x98>
   10568:       e50b3008        str     r3, [fp, #-8]
   1056c:       e51b1008        ldr     r1, [fp, #-8]
   10570:       e59f007c        ldr     r0, [pc, #124]  ; 105f4 <main+0x9c>
   10574:       ebffff77        bl      10358 <printf@plt>
   10578:       e59f3078        ldr     r3, [pc, #120]  ; 105f8 <main+0xa0>
   1057c:       e50b3008        str     r3, [fp, #-8]
   10580:       e51b1008        ldr     r1, [fp, #-8]
   10584:       e59f0068        ldr     r0, [pc, #104]  ; 105f4 <main+0x9c>
   10588:       ebffff72        bl      10358 <printf@plt>
   1058c:       e24b3f42        sub     r3, fp, #264    ; 0x108
   10590:       e3a02c01        mov     r2, #256        ; 0x100
   10594:       e59f1054        ldr     r1, [pc, #84]   ; 105f0 <main+0x98>
   10598:       e1a00003        mov     r0, r3
   1059c:       ebffff70        bl      10364 <memcpy@plt>
   105a0:       e51b0008        ldr     r0, [fp, #-8]
   105a4:       ebffffca        bl      104d4 <printFunction>
   105a8:       e24b3f42        sub     r3, fp, #264    ; 0x108
   105ac:       e1a00003        mov     r0, r3
   105b0:       ebffffc7        bl      104d4 <printFunction>
   105b4:       e24b3f42        sub     r3, fp, #264    ; 0x108
   105b8:       e1a02003        mov     r2, r3
   105bc:       e51b1008        ldr     r1, [fp, #-8]
   105c0:       e59f0034        ldr     r0, [pc, #52]   ; 105fc <main+0xa4>
   105c4:       ebffff63        bl      10358 <printf@plt>
   105c8:       e51b3008        ldr     r3, [fp, #-8]
   105cc:       e12fff33        blx     r3
   105d0:       e24b3f42        sub     r3, fp, #264    ; 0x108
   105d4:       e50b3008        str     r3, [fp, #-8]
   105d8:       e51b3008        ldr     r3, [fp, #-8]
   105dc:       e12fff33        blx     r3
   105e0:       e3a03000        mov     r3, #0
   105e4:       e1a00003        mov     r0, r3
   105e8:       e24bd004        sub     sp, fp, #4
   105ec:       e8bd8800        pop     {fp, pc}
   105f0:       0001053c        .word   0x0001053c
   105f4:       00010680        .word   0x00010680
   105f8:       0001053c        .word   0x0001053c
   105fc:       00010684        .word   0x00010684