A
ALXIMIKS
Добрый день.
В рамках тестирования обнаружена stack overflow уязвимость Windows Desktop приложения.
При подготовке PoC, из-за отсутсвия опыта и достаточности знаний, возникла следующая проблема:
Access violation write to 0x0BB1F693
Ниже приведено описание попытки эксплуатации stack overflow уязвимости, при которой возникает AV проблема:
1) Stack выглядит следущим образом:
где:
2) Стек разворачивается, идет возврат из функции (скриншот из Cheat Engine):
3) Shellcode помещается под память Аrray (выделено фиолетовым):
4) EBP адрес остается прежним (выделено зеленым)
RET адрес перезаписывается (выделено красным) и теперь указывает на начало ShellCode
5) Если продолжить выполнение кода, из стека в EIP регистр будет записан адрес ShellCode,
и выполнение программы удачно переходит на указанный адрес.
6) Но уже после первой инструкции вылетает exception, который обрабатывается программой и на выходе в логи записывается Access violation write to 0x0BB1F693.
Буду признательный любым идеям относительно возможных причин неадекватного поведения.
Скорее всего что-то эллементарное опустил, блин, где-то.
[doublepost=1492037650,1492015084][/doublepost]
---Update----
На данный момент предполагаю, что проблема связана с дальньстью перехода, так как используется С3 ret opcode:
C3 RET Near return to calling procedure -
Shellcode находится по адресу - 0x0BB1F693
Изначальный переход - 0x04530000
В связи с чем возникли новые вопросы:
1) Что такое Near return, как он завязан на CS регистре и где об этом доступно почитать?
2) Возможно ли сделать возварт через RET иструкцию внутрь другого опкода?
Например, есть инструкция add eax 00FFE4FF. (добавить к eax какое-то число)
И EIP регистру присвоить непосредственно адресc где находится FFE4 (отвечает jmp esp инструкции), то выполнится ли инструкция jmp esp?
[doublepost=1492670713][/doublepost]
---Update----
Чудестный форум, спасибо весм за помощь.
Если по делу:
1) Дальность перехода вообще ни при чем.
Срабатывает защитный механизм современных ПК - DEP (запрет выполнения кода в стековой памяти и в куче).
Общее описание основных принципов и защит при переполнении буфера -
Лучший обзор по обходу защиты DEP -
2) Да, это основная техника обхода DEP - return-oriented-programming (ROP, возвратно-ориентированное программирование).
Используется уже имеющийся код, который вызывается в необходимых местах и состоит в основном из:
полезное действие + RET.
В рамках тестирования обнаружена stack overflow уязвимость Windows Desktop приложения.
При подготовке PoC, из-за отсутсвия опыта и достаточности знаний, возникла следующая проблема:
Access violation write to 0x0BB1F693
Ниже приведено описание попытки эксплуатации stack overflow уязвимости, при которой возникает AV проблема:
1) Stack выглядит следущим образом:
Array------------------------EBP-RET----------... (high addresses)
EBP - сохраненное значение регистра EBP;
RET - адрес возврата;
Array - массив, выйдя за пределы которого можно перетереть EBP и RET.
RET - адрес возврата;
Array - массив, выйдя за пределы которого можно перетереть EBP и RET.
2) Стек разворачивается, идет возврат из функции (скриншот из Cheat Engine):
3) Shellcode помещается под память Аrray (выделено фиолетовым):
Взят на
/*
User32-free Messagebox Shellcode for any Windows version
========================================================
Title: User32-free Messagebox Shellcode for any Windows version
Release date: 16/10/2013
Author: Giuseppe D'Amore
Size: 113 byte (NULL free)
Tested on: Win8,Win7,WinVista,WinXP,Win2kPro,Win2k8,Win2k8R2,Win2k3
*/
char shellcode[] = "\x31\xd2\xb2\x30\x64\x8b\x12\x8b\x52\x0c\x8b\x52\x1c\x8b\x42"
"\x08\x8b\x72\x20\x8b\x12\x80\x7e\x0c\x33\x75\xf2\x89\xc7\x03"
"\x78\x3c\x8b\x57\x78\x01\xc2\x8b\x7a\x20\x01\xc7\x31\xed\x8b"
"\x34\xaf\x01\xc6\x45\x81\x3e\x46\x61\x74\x61\x75\xf2\x81\x7e"
"\x08\x45\x78\x69\x74\x75\xe9\x8b\x7a\x24\x01\xc7\x66\x8b\x2c"
"\x6f\x8b\x7a\x1c\x01\xc7\x8b\x7c\xaf\xfc\x01\xc7\x68\x79\x74"
"\x65\x01\x68\x6b\x65\x6e\x42\x68\x20\x42\x72\x6f\x89\xe1\xfe"
"\x49\x0b\x31\xc0\x51\x50\xff\xd7";
int main(int argc, char **argv){int (*f)();f = (int (*)())shellcode;(int)(*f)();}
Ссылка скрыта от гостей
/*
User32-free Messagebox Shellcode for any Windows version
========================================================
Title: User32-free Messagebox Shellcode for any Windows version
Release date: 16/10/2013
Author: Giuseppe D'Amore
Size: 113 byte (NULL free)
Tested on: Win8,Win7,WinVista,WinXP,Win2kPro,Win2k8,Win2k8R2,Win2k3
*/
char shellcode[] = "\x31\xd2\xb2\x30\x64\x8b\x12\x8b\x52\x0c\x8b\x52\x1c\x8b\x42"
"\x08\x8b\x72\x20\x8b\x12\x80\x7e\x0c\x33\x75\xf2\x89\xc7\x03"
"\x78\x3c\x8b\x57\x78\x01\xc2\x8b\x7a\x20\x01\xc7\x31\xed\x8b"
"\x34\xaf\x01\xc6\x45\x81\x3e\x46\x61\x74\x61\x75\xf2\x81\x7e"
"\x08\x45\x78\x69\x74\x75\xe9\x8b\x7a\x24\x01\xc7\x66\x8b\x2c"
"\x6f\x8b\x7a\x1c\x01\xc7\x8b\x7c\xaf\xfc\x01\xc7\x68\x79\x74"
"\x65\x01\x68\x6b\x65\x6e\x42\x68\x20\x42\x72\x6f\x89\xe1\xfe"
"\x49\x0b\x31\xc0\x51\x50\xff\xd7";
int main(int argc, char **argv){int (*f)();f = (int (*)())shellcode;(int)(*f)();}
4) EBP адрес остается прежним (выделено зеленым)
RET адрес перезаписывается (выделено красным) и теперь указывает на начало ShellCode
5) Если продолжить выполнение кода, из стека в EIP регистр будет записан адрес ShellCode,
и выполнение программы удачно переходит на указанный адрес.
6) Но уже после первой инструкции вылетает exception, который обрабатывается программой и на выходе в логи записывается Access violation write to 0x0BB1F693.
Буду признательный любым идеям относительно возможных причин неадекватного поведения.
Скорее всего что-то эллементарное опустил, блин, где-то.
[doublepost=1492037650,1492015084][/doublepost]
---Update----
На данный момент предполагаю, что проблема связана с дальньстью перехода, так как используется С3 ret opcode:
C3 RET Near return to calling procedure -
Ссылка скрыта от гостей
Shellcode находится по адресу - 0x0BB1F693
Изначальный переход - 0x04530000
В связи с чем возникли новые вопросы:
1) Что такое Near return, как он завязан на CS регистре и где об этом доступно почитать?
2) Возможно ли сделать возварт через RET иструкцию внутрь другого опкода?
Например, есть инструкция add eax 00FFE4FF. (добавить к eax какое-то число)
И EIP регистру присвоить непосредственно адресc где находится FFE4 (отвечает jmp esp инструкции), то выполнится ли инструкция jmp esp?
[doublepost=1492670713][/doublepost]
---Update----
Чудестный форум, спасибо весм за помощь.
Если по делу:
1) Дальность перехода вообще ни при чем.
Срабатывает защитный механизм современных ПК - DEP (запрет выполнения кода в стековой памяти и в куче).
Общее описание основных принципов и защит при переполнении буфера -
Ссылка скрыта от гостей
Лучший обзор по обходу защиты DEP -
Ссылка скрыта от гостей
.2) Да, это основная техника обхода DEP - return-oriented-programming (ROP, возвратно-ориентированное программирование).
Используется уже имеющийся код, который вызывается в необходимых местах и состоит в основном из:
полезное действие + RET.