Я просматривал разные стили переполнения буфера и сталкивался с проблемой, о которой я не помню, почему это происходит. Код следующим образом является программой я попытка выполнить переполнение буфера:Переменные среды переполнения буфера Linux
#include <stdio.h>
void func(char *buff){
char buffer[5];
strcpy(buffer, buff);
printf("%s\n", buffer);
}
int main(int argc, char *argv[]){
func(argv[1]);
printf("I'm done!\n");
return 0;
}
Основная концепция программы очень прост, я просто переполнить буфер для перезаписи адреса возврата func()
. Это отлично работает, когда я даю ему адрес, такой как 0x0804850c
, который является <_fini>
программы. Конечным результатом, когда я реализую переполнение с этим адресом, является завершение программы «изящно» без печати I'm done!
. Проблема, с которой я столкнулся сейчас, - это когда я пытаюсь перенаправить обратный адрес на что-то, скажем, переменную среды, расположенную в 0xbfffd89
.
Код оболочки, расположенный в этой конкретной переменной окружения, должен просто выйти из программы после объявления hello
. Однако этого не происходит, программа просто отключается, и все. Код оболочки уже подтвержден для работы в предыдущей программе, которую я написал, для проверки кода оболочки. У кого-нибудь есть идеи, почему это не работает. Thx
Запустите его под gdb, чтобы узнать, что вызывает срабатывание segfault. Мое предположение: переменная среды живет в области памяти, которая читаема, но не является исполняемой[email protected] EugeneMayevski'EldoSCorp: Я предполагаю, что «shell-код» здесь - это жаргон для машинного кода, который запускает оболочку и некоторые внешние команды, которые, как правило, хотят делать. Хотя в этом случае это звучит, как будто никакая реальная оболочка не запускается. – Celada
@Celada Любые предложения о том, как я могу использовать GDB, чтобы проверить, являются ли переменные среды READ-ONLY. Также вы правильно знаете код оболочки. – Blackninja543
@ EugeneMayevski'EldoSCorp Обычно код оболочки - это байтовый код двоичного кода. В этом случае я сгенерировал код оболочки, написав то, что я хотел получить в ASM x86. Когда я перенаправляю обратный адрес функции, я направляю ее в область памяти, содержащую новый набор инструкций. – Blackninja543