Привет. Погнали дальше.
Включаем и слушаем, для настроения!
По классике - скачиваем, unzip, в IDA и в main.
Видим, что оба scanf у нас уязвимые, т.к. нет ограничения на количество получаемых символов. Два раза жмём на true_answer и смотрим какой он есть для того, чтобы пройти первый вопрос.
Чтобы пройти второй надо каким-то образом сделать так чтобы secret был равен 15580379 или (нажать на эту цифру правой кнопкой мыши и выбрать Hexadecimal) 0xEDBCDB, но как это передать в уязвимый ввод?
Смотрим память
Видим, что не зря мы не стали в первом scanf переписывать память - могли нарваться на то, что перетрем true_answer и не сможем пройти первый вопрос. Однако вопрос с secret остался, записать туда такие байты мы не можем (ранее мы находили аналоги среди символов и их hex значение). Так как у нас pwn, то мы его и используем. В нем есть такая фича, как упаковка p8() 1байт, p16() 2байта, p32() 4байта. Чтобы переписать secret нам надо в часть нагрузки запаковать hex значение которое проверяется в коде. Надо помнить о big-endian и little-endian, этими параметрами можно руками управлять (самому менять местами байты) или автоматически указывая в функции pN(endian) big/little.
Считаем байты, которые надо перетирать и формируем нагрузку.
PWNED
PS
Огромное спасибо устроителю за TheDarkSideOfTheMoon =)
Включаем и слушаем, для настроения!
По классике - скачиваем, unzip, в IDA и в main.
Видим, что оба scanf у нас уязвимые, т.к. нет ограничения на количество получаемых символов. Два раза жмём на true_answer и смотрим какой он есть для того, чтобы пройти первый вопрос.
Чтобы пройти второй надо каким-то образом сделать так чтобы secret был равен 15580379 или (нажать на эту цифру правой кнопкой мыши и выбрать Hexadecimal) 0xEDBCDB, но как это передать в уязвимый ввод?
Смотрим память
Видим, что не зря мы не стали в первом scanf переписывать память - могли нарваться на то, что перетрем true_answer и не сможем пройти первый вопрос. Однако вопрос с secret остался, записать туда такие байты мы не можем (ранее мы находили аналоги среди символов и их hex значение). Так как у нас pwn, то мы его и используем. В нем есть такая фича, как упаковка p8() 1байт, p16() 2байта, p32() 4байта. Чтобы переписать secret нам надо в часть нагрузки запаковать hex значение которое проверяется в коде. Надо помнить о big-endian и little-endian, этими параметрами можно руками управлять (самому менять местами байты) или автоматически указывая в функции pN(endian) big/little.
Считаем байты, которые надо перетирать и формируем нагрузку.
PWNED
PS
Огромное спасибо устроителю за TheDarkSideOfTheMoon =)