PC寄存器更改提供的值

时间:2019-02-07 20:17:00

标签: ios buffer-overflow arm7

我是缓冲区溢出的新手,尽管我相信我已经掌握了该过程,但我还是觉得有些问题。我正在从一本有关剥削的书中学习,在示例中,在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上正常运行,并且在要求用户输入时,我以这样的AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHH四个一组的形式输入32个字节。当应用程序崩溃时,我检查了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。为什么它不返回预期输入的输入?

谢谢

1 个答案:

答案 0 :(得分:0)

万一有人遇到与我相同的问题,我发现r15或pc在ARM中应始终除以4。来自官方ARM Documentation

Note that r15 cannot be used with writeback, and that offset must be divisible by 4