Недопустимая ошибка инструкции в простой программе выполнения произвольного кода ARM - PullRequest
0 голосов
/ 20 мая 2019

Я пишу простой эксплойт для выполнения кода на 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
}

Я использую функцию printFunction, чтобы увидеть память, на которую указывает каждый указатель.Память, на которую указывают g и h, идентична, но g указывает на текстовый раздел, а h находится где-то в стеке, как и ожидалось.Я понимаю, что некоторая память не является исполняемой, но об этом должен позаботиться флаг -z execstack.

Я также подумал, что моя проблема может быть связана с выравниванием, но я понятия не имею, как исправить это.что.

Вот разборка соответствующих функций:

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

1 Ответ

0 голосов
/ 20 мая 2019

Вы не можете преобразовать функцию в указатель данных любого типа.Поэтому memcpy(h,f,256); является незаконным.

g = h;, кажется, компилируется из-за щедрости C, но все еще приводит к повреждению исполняемого файла.h будет в неопределенном состоянии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...