C 简单ARM任意代码执行程序上的非法指令错误
我在Raspberry Pi 3上编写了一个简单的代码执行漏洞,我得到了一个“非法指令”错误。为了编译此程序,我禁用了ASLR并添加了以下编译器选项: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
-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由于C语言的慷慨,code>似乎可以编译,但仍然会导致一个坏的可执行文件<代码>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