Эксплойты переполнения стека: перезапись RET и SEH

Я изучал руководства по написанию эксплойтов перезаписи RET и SEH с использованием переполнения стека.

Насколько я понимаю, когда я перезаписываю значение SEH, значение RET также перезаписывается, также гораздо сложнее создать эксплойт SEH, потому что вам также нужно сгенерировать исключение, чтобы запустить эксплойт.

Если да, то в чем польза эксплойта перезаписи SEH, если я всегда могу использовать вместо него значение RET? И каковы плюсы и минусы перезаписи SEH поверх перезаписи RET?


person Slava Bronfman    schedule 26.04.2015    source источник
comment
Я бы не подумал, что вы всегда можете перезаписать и то, и другое. Может быть ошибка, позволяющая перезаписать только один из них.   -  person nobody    schedule 26.04.2015
comment
@AndrewMedico Я не сказал, что всегда могу перезаписать оба, я сказал, что как только вам удалось перезаписать SEH, с очень очень высокой вероятностью вы также перезаписали RET, потому что в большинстве случаев он находится над ним в стеке.   -  person Slava Bronfman    schedule 27.04.2015


Ответы (1)


Это зависит от уязвимости и условий эксплуатации.

Если вы можете перезаписать RET и создать полноценный эксплойт, чем вы правы, и перезапись SEH не потребуется.

Но это не всегда так. В некоторых случаях защита от перезаписи RET будет присутствовать, например, канарейка стека.

В этом случае использование перезаписи RET будет намного сложнее (если вообще возможно), чем перезапись обработчика SEH и генерация исключения.

То же самое можно сказать и о перезаписи SEH, если SafeSeh включен, а stack canary выключен, было бы намного проще использовать перезапись RET, чем SEH.

В общем, я бы сказал, что главный факт, который определит, какую технику эксплойта использовать, зависит от существующих средств защиты и простоты использования.

Всегда хорошо иметь другой вектор атаки, который можно использовать, если все остальные варианты не работают.

person Michael    schedule 26.04.2015