2014-02-19 4 views
2

Я пытаюсь удачи с переполнением буфера, однако я застрял в одной точке. Я перезаписываю обратный адрес, так что 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 .. Таким образом, быстрым решением является не использовать «А как дополнение», а просто адрес в каждом слове.

+0

Это x86-32? Я не знал, что кто-то все еще использовал это! :) Отметьте свой вопрос [x86-32] или [x86-64], чтобы люди знали, какой из них вы используете. Если вы используете x86-64, одна ошибка очевидна: вы должны смотреть на '% rip' и'% rsp', а не просто '% eip' и'% esp'. Это все? – Quuxplusone

+2

Предполагая, что вы не допустили каких-либо ошибок, есть ли вероятность того, что защита выполнения данных процессора будет включена, и предотвращение запуска инструкций в сегментах без кода? – rcgldr

+0

@rcgldr Думаю, что нет? Если я скомпилирую с -z execstack и -fno-stack-protector, все должно быть хорошо? – user1090614

ответ

0

OP отвечает на свой вопрос (более или менее):

Edit: I found the answer in another post: GDB ret "cannot access memory at address" Basically, the problem is right before the address esp is set to equals ebp, when in my case will be 0x90909090.. Thus, a quick solve is to not use 'A's as padding, but rather just the address in every word.

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

// let's say his function ended with a "return 0"... 
xorl %eax, %eax 
// now here is where he did the "x/8wx" debugger command... 
// but then the function epilogue goes and does the usual thing: 
movl %esp, %ebp 
popl %ebp 
// and so here, at the actual return, %esp no longer points 
// to the same bytes he saw with "x/8wx" 
ret 

The linked answer предполагает, что его отладчик может иметь какой-то глюк с leave инструкции (что эквивалентно movl/popl, описанного выше), что отладчик был говорить ОП, что он был остановлен на инструкция ret, но на самом деле процессор еще не выполнил leave.

Эквивалентно, отладчик может иметь отвращение к точке прерывания в середине пролога или эпилога функции, так что, если вы попытаетесь установить точку останова в середине эпилога, он тайно настроен на начало эпилога.

Смежные вопросы