Я следую инструкциям по переполнению буфера Youtube Computerphile, чтобы узнать, как это работает. Учебное пособие говорит об этом в Kali, и я использую 64-битный тест Kali, чтобы проверить его (я думаю, что он работает 32-битный).Основная путаница с ошибкой переполнения буфера
Он пишет простую программу, как это:
#include <stdio.h>
#include <string.h>
int main(int argc, char** argv) {
char buffer[500];
strcpy(buffer, argv[1]);
return 0;
}
Затем после запуска программы в GDB он работает:
(gdb) run $(python -c 'print "\x41" * 506')
и результатом неисправности сегментный, который показывает, что возвращение адрес был частично перезаписан двумя 41-м.
Когда я пытаюсь дублировать это, мне нужно изменить 506 на 522, чтобы получить тот же результат. Так что мои вопросы:
Почему 506 только переписать два байта вместо трех, когда он бежит это?
Зачем мне писать 522 байта для перезаписывания 2 байтов в обратном адресе ? Я думаю, что это связано с ним, возможно, с использованием 32-битного вместо 64-битного Kali, но я не совсем понимаю, как это различие складывается математически.
Когда я делаю
disassemble main
Я вижу, что после пролог функции есть инструкцияsub rsp, 0x210
, поэтому он выглядит так, что буфер выделяется 528 байт. Почему это число в частности (его вместо subs 0x1f4, который ровно 500) и как он относится к выше, где требуется больше 520 байт, чтобы начать переписывать указатель инструкции?Что происходит в диапазоне написания [500520] байт, где это более , чем размер буфера, но не писать поверх указателя на инструкции?
Возможно, 32-разрядная версия использует 4-байтовое выравнивание стека, тогда как 64-разрядная версия использует 8-байтовое выравнивание стека. 500 делится на 4, но не 8. «Буфер» будет дополняться 4 байтами, но это приведет к 504 байтам. Не уверен, откуда приходит 520. –
Хм, возможно ли, что это 500 дополняется от 4 до 504, а затем от +16 до 520, потому что между буфером и адресом возврата является адрес базового указателя? – Austin
Можете ли вы посмотреть на разборку 'strcpy'? Возможно, это толкает регистры в стек. Наверное, нет. –