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