Передача шелл-кода из Python в качестве аргумента командной строки - PullRequest
1 голос
/ 17 мая 2011

В настоящее время я готовлю небольшую презентацию о компьютерной безопасности среди моих сокурсников.Чтобы хотя бы немного их взволновать, я хотел продемонстрировать, как можно использовать неправильное использование функции 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.Кто-нибудь знает в чем дело с кодом?Мне не хватает какой-то базовой точки или это какая-то защита от переполнения буфера в стеке?

Спасибо,

1 Ответ

1 голос
/ 17 мая 2011

Похоже, ваш текст подвергается конвертации в UTF-8. Обратите внимание, что ваши оригинальные байты:

75 9a 21 1b
   ^^

заменены на

75 c2 9a 21 1b
   ^^^^^

Я выделил кодированный байт UTF-8. Если вы используете Python 3, попробуйте:

os.system(b"test.exe ABCDEFGHI\x75\x9a\x21\x1bNOPQRSTUVWXYZ")

b"" указывает, что данные представляют собой последовательность байт и не должны преобразовываться из Unicode в кодировку по умолчанию (которая в вашем случае выглядит как UTF-8).

...