Я пытаюсь удачи с переполнением буфера, однако я застрял в одной точке. Я перезаписываю обратный адрес, так что EIP
укажет на адрес ушей из моего шеллкода nop
. Однако, когда выполняется ret
, я получаю ошибку: Cannot access memory at address 0x90909094
. Кто-нибудь может понять, что не так?Не удается получить адрес возврата на x86-32
дамп памяти:
(gdb) x/8wx $esp
0xbffff18c: 0xbffff470 0xbffff400 0x00000000 0x08048559
0xbffff19c: 0xb7fc6ff4 0x08048550 0x00000000 0x00000000
(gdb) x/8wx 0xbffff470
0xbffff470: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffff480: 0x90909090 0x90909090 0x90909090 0x90909090
(gdb) nexti
Cannot access memory at address 0x90909094
(gdb) i r eip
eip 0xbffff470 0xbffff470
Как вы можете видеть, обратный адрес 0xbffff470 и на этом месте, мой nop
салазки помещается. Однако, как только я запускаю следующую инструкцию (которая равна ret
), я получаю сообщение об ошибке. Что здесь не так? Edit: Я использую x86-32
Edit: я нашел ответ в другом посте: GDB ret "cannot access memory at address" В принципе, проблема находится прямо перед адресом особ устанавливается на равных EBP, когда в моем случае будет 0x90909090 .. Таким образом, быстрым решением является не использовать «А как дополнение», а просто адрес в каждом слове.
Это x86-32? Я не знал, что кто-то все еще использовал это! :) Отметьте свой вопрос [x86-32] или [x86-64], чтобы люди знали, какой из них вы используете. Если вы используете x86-64, одна ошибка очевидна: вы должны смотреть на '% rip' и'% rsp', а не просто '% eip' и'% esp'. Это все? – Quuxplusone
Предполагая, что вы не допустили каких-либо ошибок, есть ли вероятность того, что защита выполнения данных процессора будет включена, и предотвращение запуска инструкций в сегментах без кода? – rcgldr
@rcgldr Думаю, что нет? Если я скомпилирую с -z execstack и -fno-stack-protector, все должно быть хорошо? – user1090614