В настоящее время я готовлю небольшую презентацию о компьютерной безопасности среди моих сокурсников.Чтобы хотя бы немного их взволновать, я хотел продемонстрировать, как можно использовать неправильное использование функции strcpy inc C.Это код уязвимой программы:
#include<string.h>
#include<stdio.h>
void function(char *buffer1)
{
char buffer2[5];
strcpy(buffer2,buffer1);
}
int main (int argc, char **argv)
{
function(argv[1]);
return 0;
}
Просто используя командную строку, я смог завершить работу приложения, вызвав его с помощью
test.exe ABCDEFGHIJKLMNOPQRSTUVWXYZ
, что дало мне правильный 0x4D4C4B4A (MLKJ) для EIP.Это также работает, если я вызываю его из Python:
os.system("test.exe ABCDEFGHIJKLMNOPQRSTUVWXYZ")
Однако, если я хочу поместить адрес вместо JKLM, например так:
os.system("test.exe ABCDEFGHI\x75\x9a\x21\x1bNOPQRSTUVWXYZ")
Это дает мне следующий вывод рядомESP в стеке:
0028cca0 e4 21 d7 41 42 43 44 45-46 47 48 49 75 c2 9a 21 .!.ABCDEFGHIu..!
0028ccb0 1b 4e 4f 50 51 52 53 54-55 56 57 58 59 5a 00 00 .NOPQRSTUVWXYZ..
Здесь 75 c2 9a 21 имеет значение, потому что это почти то, что я ожидал, за исключением 0x1B, который является символом ASCII для ESCAPE, заменяется на 0xC2.Когда я меняю порядок адреса, и он выглядит так: \ x21 \ x1b \ x75 \ x9a, 9a заменяется тем же таинственным C2.Кто-нибудь знает в чем дело с кодом?Мне не хватает какой-то базовой точки или это какая-то защита от переполнения буфера в стеке?
Спасибо,