gpt4 book ai didi

c - 简单ARM任意代码执行程序出现非法指令错误

转载 作者:行者123 更新时间:2023-11-30 19:27:02 24 4
gpt4 key购买 nike

我正在 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

最佳答案

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

g = h; 由于 C 的慷慨,似乎可以编译,但仍然会导致可执行文件损坏。 h 将处于未定义状态。

关于c - 简单ARM任意代码执行程序出现非法指令错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56222371/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com