PC 寄存器更改提供的值
PC register changes supplied value
我是缓冲区溢出的新手,虽然我相信我明白了这个过程,但我觉得这里有问题。我正在学习一本关于开发的书,在示例中,16 字节字符串上有一个简单的缓冲区溢出。这是二进制代码。
#include <stdio.h>
#include <string.h>
void vuln(){
char buff[16];
scanf("%s",buff);
printf("You entered: %s",buff);
}
void secret(){
printf("My secret is 131313");
}
int main() {
vuln();
return 0;
}
如您所料,目标是调用秘密函数。我在 Mac 上使用带有以下参数的 Clang 编译它 -arch armv7
-fno-stack-protector
-fno-pie
,因此没有保护和 ARMv7 架构。它在 iPhone 上正常运行,当它要求用户输入时,我输入 32 个字节,像这样 AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHH
以四个为一组。当应用程序崩溃时,我检查 iOS 日志,我可以看到崩溃发生在 F
开始的地方。
我希望看到的是,pc
寄存器对于 F 的值是 0x46464646
,但实际上它是 returns 0x46464644
。
这些是崩溃时寄存器的值。
Thread 0 Crashed:
0 ??? 0x46464644 0 + 1179010628
Thread 0 crashed with ARM Thread State (32-bit):
r0: 0x0000002d r1: 0x00000000 r2: 0x3ba30f80 r3: 0x00000000
r4: 0x00000000 r5: 0x0000bf71 r6: 0x00000000 r7: 0x45454545
r8: 0x00201854 r9: 0x00000000 r10: 0x00000000 r11: 0x00000000
ip: 0x00012068 sp: 0x00201834 lr: 0x0000bf53 pc: 0x46464644
cpsr: 0x40000010
此外,我只尝试了 40 A
s,结果 returned 0x41414140
。为什么它 return 没有按预期输入?
谢谢
如果有人遇到和我一样的问题,我发现在 ARM 中 r15 或 pc 应该总是除以 4。来自官方ARM Documentation:
Note that r15 cannot be used with writeback, and that offset must be divisible by 4
我是缓冲区溢出的新手,虽然我相信我明白了这个过程,但我觉得这里有问题。我正在学习一本关于开发的书,在示例中,16 字节字符串上有一个简单的缓冲区溢出。这是二进制代码。
#include <stdio.h>
#include <string.h>
void vuln(){
char buff[16];
scanf("%s",buff);
printf("You entered: %s",buff);
}
void secret(){
printf("My secret is 131313");
}
int main() {
vuln();
return 0;
}
如您所料,目标是调用秘密函数。我在 Mac 上使用带有以下参数的 Clang 编译它 -arch armv7
-fno-stack-protector
-fno-pie
,因此没有保护和 ARMv7 架构。它在 iPhone 上正常运行,当它要求用户输入时,我输入 32 个字节,像这样 AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHH
以四个为一组。当应用程序崩溃时,我检查 iOS 日志,我可以看到崩溃发生在 F
开始的地方。
我希望看到的是,pc
寄存器对于 F 的值是 0x46464646
,但实际上它是 returns 0x46464644
。
这些是崩溃时寄存器的值。
Thread 0 Crashed:
0 ??? 0x46464644 0 + 1179010628
Thread 0 crashed with ARM Thread State (32-bit):
r0: 0x0000002d r1: 0x00000000 r2: 0x3ba30f80 r3: 0x00000000
r4: 0x00000000 r5: 0x0000bf71 r6: 0x00000000 r7: 0x45454545
r8: 0x00201854 r9: 0x00000000 r10: 0x00000000 r11: 0x00000000
ip: 0x00012068 sp: 0x00201834 lr: 0x0000bf53 pc: 0x46464644
cpsr: 0x40000010
此外,我只尝试了 40 A
s,结果 returned 0x41414140
。为什么它 return 没有按预期输入?
谢谢
如果有人遇到和我一样的问题,我发现在 ARM 中 r15 或 pc 应该总是除以 4。来自官方ARM Documentation:
Note that r15 cannot be used with writeback, and that offset must be divisible by 4