ios - PC 寄存器更改提供的值

标签 ios buffer-overflow armv7

我是缓冲区溢出的新手,虽然我相信我已经了解了该过程,但我觉得这里有些问题。我正在学习一本有关漏洞利用的书,在示例中,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;
}

正如您所猜测的,目标是调用 secret 函数。我使用 Clang 在 Mac 上编译它,并使用以下参数 -arch armv7 -fno-stack-protector -fno-pie,因此没有保护和ARMv7架构。它在 iPhone 上正常运行,当它要求用户输入时,我输入 32 个字节,以四个为一组,如下所示 AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHH。当应用程序崩溃时,我检查 iOS 日志,可以看到崩溃发生在 F 开始的位置。

我期望看到的是,pc 寄存器的 F 值为 0x46464646,但实际上它返回 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,结果返回 0x41414140。为什么它没有按预期返回输入的输入?

谢谢

最佳答案

如果有人有和我一样的问题,我发现在 ARM 中 r15 或 pc 应该总是除以 4。来自官方ARM Documentation :

请注意,r15 不能与写回一起使用,并且该偏移量必须能被 4 整除

关于ios - PC 寄存器更改提供的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54581593/

相关文章:

ios - 某些 iOS 约束在 Xcode 8 中不起作用(转换为 Swift 3 后)

c - 缓冲区分配不是字大小的倍数

android - 为什么使用 armeabi-v7a 代码而不是 armeabi 代码?

iOS可用架构问题

ios - XCODE 6.4 - 架构 armv7 错误的 undefined symbol

ios - MKMapView 显示 DetailView - 如何进行转场

ios - Xcode 版本 5.1.1 (5B1008) - 在 iOS 7.0 而非 7.1 上运行模拟器

android - 关闭滑动菜单

c - 堆溢出攻击

c - 运行 shellcode 时出现段错误