использование переполнения стека mips (цепочка rop)

Я пытаюсь разработать свой первый эксплойт на основе стека MIPS, используя технику цепочки ROP без особого успеха ... У меня не получается первый гаджет ROP, и я не могу понять, почему. Я слежу за фреймворком Python Bowcaster и некоторыми сообщениями в блогах, которые я искал. Поскольку переполнение, которое я обнаружил, позволяет мне перезаписывать слишком мало регистров S (только S0 и S8), мне нужно перейти к эпилогу функции, который установит S0-S8 из стека. Я использовал IDA PRO с плагином mipsrop для поиска гаджетов. Я пробовал гаджеты как из уязвимого бинарного файла, так и из libc, но с тем же результатом. Я вижу в GDB, что регистр $ RA правильно настроен на адрес, который я выбрал с помощью mipsrop, но по какой-то причине регистры S0-S8 не перезаписываются. ASLR здесь не проблема, поскольку я могу подтвердить это, запустив ldd несколько раз. Я выбрал гаджет с адресом 000112EC, используя IDA PRO, который выглядит так: (Я не могу размещать больше изображений - репутация)

LOAD:000112EC lw $ra, 0x48+var_4($sp)
LOAD:000112F0 lw $fp, 0x48+var_8($sp)
LOAD:000112F4 lw $s7, 0x48+var_C($sp)
LOAD:000112F8 lw $s6, 0x48+var_10($sp)
LOAD:000112FC lw $s5, 0x48+var_14($sp)
LOAD:00011300 lw $s4, 0x48+var_18($sp)
LOAD:00011304 lw $s3, 0x48+var_1C($sp)
LOAD:00011308 lw $s2, 0x48+var_20($sp)
LOAD:0001130C lw $s1, 0x48+var_24($sp)
LOAD:00011310 lw $s0, 0x48+var_28($sp)
LOAD:00011314 jr $ra
LOAD:00011318 addiu $sp, 0x48
LOAD:00011318 # End of function scandir

Я добавил к нему базовый адрес libc (echo 'obase = 16; ibase = 16; 2AABE000 + 112EC' | bc) и получил 0x2AACF2EC. Поскольку это процессор Big Endian, я отправил такую ​​строку:

AAAA и первый адрес гаджета

Ниже вы можете увидеть полный вывод GDB:

Вывод GDB после попадания

Как видите, были перезаписаны только S0 и S8, и ни один из регистров S не был восстановлен из стека.

Что я здесь делаю не так? Пожалуйста помоги :)

некоторый вывод checksec.sh:

RELRO           STACK CANARY      NX            PIE             RPATH      RUNPATH      FILE
No RELRO        No canary found   NX enabled    No PIE          No RPATH   No RUNPATH   /bin/vulnbin
RELRO           STACK CANARY      NX            PIE             RPATH      RUNPATH      FILE
Full RELRO      No canary found   NX enabled    DSO             No RPATH   No RUNPATH   /lib/libc.so.0

person Jane Doe    schedule 12.09.2016    source источник


Ответы (1)


У вас есть вывод GDB после выполнения инструкций, но не до (или во время)

Вы должны быть пошаговым и вручную проверять каждую загрузку с помощью x / wx $ sp +

Возможно, ваша строка была повреждена, и эти значения в s0-s7 были фактически извлечены из стека, как вы это просили, где ваш буфер раньше был, но теперь поврежден.

Кроме того, есть ли у вас дополнительные байты в строке переполнения после нового значения $ ra или это завершает строку? Если он завершает строку, то регистры s0-s7 будут заполнены данными стека мусора.

Нижняя строка: точка останова при первой загрузке, вручную x / wx $ sp + X каждая загрузка до того, как она произойдет, и stepi и подтверждение результата

Если вам нужен статический gdbserver, у меня есть тонна для различных архитектур ARM, MIPS и MIPSEL / ABI @ встраиваемых- набор инструментов

person adam    schedule 17.05.2017
comment
Кроме того, я бы не стал слишком сильно полагаться на фреймворк, пока вы не сделаете это вручную хотя бы несколько раз. Не могу этого достаточно подчеркнуть - person adam; 17.05.2017