Рис. 13: Vuln() загружает несколько
Наконец,
функция возвращается, и мы можем проверить состояние регистров:
...
(gdb) nexti
Cannot access memory at address 0x44444440
(gdb) info reg
r0
0xbeaca786
3198986118
r1
0xbeacaa22
3198986786
r2
0x17 23
r3
0x0 0
r4
0x8488
33928
r5
0x0 0
r6
0x8330
33584
r7
0x0 0
r8
0x0 0
r9
0x0 0
r10 0x40025000
1073893376
r11 0x44444444
1145324612
r12 0xbeaca79c
3198986140
sp
0x45454545
0x45454545
lr
0x46464646
1179010630
pc
0x8440
0x8440
fps 0x0 0
cpsr
0x60000010
1610612752
(gdb)
Подробный анализ того, как стек перезаписывается на системах ARM, закончен.
Мы готовы к изменению потока программы.
30
4.2.2 Изменение потока выполнения
Чтобы эффективно перенаправить поток исполнения, мы
должны решить
несколько проблем. Помните ли вы вы помните сообщение об ошибке GDB при
возврате уязвимой функции?
...
(gdb) nexti
Cannot access memory at address 0x44444440
...
Отметим, что программе нужны действительные адреса для указателя фрейма и
указателя стека, а не только для адреса возврата. Более того, даже эти адреса
должны быть выровнены по словам.
Обе
проблемы преодолимы, поскольку, даже
если существует определенная
случайность в распределении памяти, мы можем с большой долей вероятности
предсказать правильное место в памяти.
Например, давайте попробуем использовать последний действительный адрес
памяти, который мы наблюдали:
Do'stlaringiz bilan baham: