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