Регистр ПК изменяет предоставленное значение - PullRequest
0 голосов
/ 07 февраля 2019

Я новичок в переполнении буфера, и, хотя я верю, что получил процесс, я чувствую, что здесь что-то не так.Я изучаю из книги об эксплуатации, и в примере, есть простое переполнение буфера на 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 s.

Что я ожидал увидеть, так это то, что регистр pc будет иметь значение 0x46464646 для F, но на самом деле он возвращает 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 голосов
/ 11 февраля 2019

В случае, если у кого-то есть такая же проблема, как у меня, я обнаружил, что r15 или pc всегда должны делиться на 4 в ARM.Из официальной документации ARM :

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

...