данный документ описывает использование переполнения целочисленныхмассивов (integer arrays). это довольно частое явление в современномпрограммировании, но в отличии от хорошо известного и понятногопереполнения символьных массивов (char arrays), я нигде не встречалупоминания о целочисленных массивах. для понимания нижеизложенного вам необходимо знать как происходитпереполнения стека и кучи, иметь представление об организации памяти,некоторые знания о переполнении символьных массивов и конечно хорошийопыт программирования на ansi c. все примеры программ и эксплойтов присутствующие в этом документебыли написаны и проверены на redhat/7.1 в установке по умолчанию. переполнения целочисленных массивов происходят почти так же как илюбые другие переполнения, основанные на недостатках проверки выхода заграницы массива. в памяти, послеместа выделенного под некоторое количество определенных элементов,находятся локальные переменныеи адреса (например адрес возврата). как только у вас появитсявозможность выйти за эти границы, вы можете переписать локальныепеременные так же просто, как и при стандартном переполнении буфера.это возможно из-за того, что размер адреса на большинстве архитектуримеет тот же самый размер, что и целое число (четыре байта). также, этопозволяет не заботиться о выравнивании. иллюстрация того, как это выглядит в памяти: int array[32]; должно выглядеть примерно так (в памяти): [0x00000000][0x00000000][0x00000000][0x00000000][0x00000000][0x00000000] [0x00000000][0x00000000][0x00000000][0x00000000][0x00000000][0x00000000] [0x00000000][0x00000000][0x00000000][0x00000000][0x00000000][0x00000000] [0x00000000][0x00000000][0x00000000][0x00000000][0x00000000][0x00000000] [0x00000000][0x00000000][0x00000000][0x00000000][0x00000000][0x00000000] [0x00000000][0x00000000] сразу после 32-ой (последней) переменной массива находятсялокальные переменные и адреса, в зависимости от каждого случая, дающиевозможность создать опасность выполнения чужого, непредусмотренногопрограммой кода. факт, что и адрес, и целое число имеют одинаковые предельныезначения (0xffffffff = 4294967295) дает возможность "каверкать" любыедиапазоны памяти. пришло время показать пример уязвимой программы: int_array.c: example buggy program. /* int_array.c: a buggy test program. */ /* syntax: ./int_array [slot] [value] */ include include include void place_int_array(unsigned int slot,int value){ int array[32]; array[slot]=value; /* будет перезаписано */ printf("filled slot %u with %d.
Copyright 2010 - All rights reserved Your Company name
Related Posts
Many Tags
May 2, 2008Readability Test
May 1, 2008Many Tags
May 2, 2008Readability Test
May 1, 2008