![]() |
Задача для хекеров =)
(Очень занимательное домашнее задание от препода =) )
Дана несколько запутанная программа. Преподователь вводит пароль, который студент не видит. После этого студент должен ввести свои варианты пароля и добиться вывода строки "You're COOl hacker" Количество попыток ограниченно(2 штуки). Требование: во время угадывания нельзя запускать дебаггеры, виртуальные машины и т.д. Просто для исследования программы можно использовать дизасм и дебаггер, hex редакторы нельзя использовать (препод все равно будет компилить прогу сам). (Решений несколько) Код программы: Код:
#include <stdio.h> |
если отлад4ик можно юзать, то какие-проблемы? препод ввел серийнки. запустил ольку, приатта4ился, нашел код ввода проверки, отттрейсил сравнение, нашел буфер эталонного паса, ввел. все. 1 попытка, 100% результат
|
Отладчик можно использовать дома, что бы изучить структуру, того что скомпилировалось. Использовать инструменты во время проверки нельзя.
|
keylogger поставь ^_^
|
Проблема чисто программая:)
|
Вероятно, один из способов решения, это использовать ошибку форматной строки:
Код:
printf(p_user);P.S. компилировал gcc на 64-битной системе upd: Вобщем, вот мой вариант решения данной задачи =) Код:
Etalon password: 1234 |
Особой сложности не имеет. Есть два способа обхода.
1) Системный. Часто все забывают, что типовой системный ввод обладает "историей". Достаточно во время ввода нажать кнопку вверх, последнее введённое значение будет подставлено. 2) Программный. В самом деле, внимательно смотрим на два куска кода. Цитата:
Цитата:
Проверим идею - вуа-ля, см. рисунок: http://img231.imageshack.us/img231/2...le01ik0.th.png С клавиатуры вводятся (через Alt+Num Цифра) три байта. В моём случае - с кодами 20, 255, 18 (0x12FF14). Путём анализа скомпилированного кода можно узнать значение для конкретного случая. http://img218.imageshack.us/img218/1...le02yz9.th.png Желтым выделена область, содержащая эталон пароля, красным - пользовательский, зелёным - ссылочные переменные. Возможно затереть только три байта первой ссылки (нулевой символ с клавиатуры ввести нельзя). Таким образом, просто узнав второй адрес, можно поместить его в кодах позади последовательности, буфер переполнится, значение затрётся, после ста проверок флаг всё равно будет нулевой. Пример данных, затирающих ссылку. http://img61.imageshack.us/img61/721...le03ak4.th.png Видно, что данные ссылок одинаковы. Именно это обстоятельство позволяет осуществить успешную атаку. |
в добавление, компилироваться все это будет на unix машине
|
Тогда придётся активно осваивать gdb. Сейчас, к сожалению, ни одной завалящей консоли под рукой нет, проверить не на чем, как на обед пойду - гляну, что да как.
|
Проанализировав программы с разных компиляторов, пришел к выводу, что решения с затиранием числа попыток ввода и указателей (p_user, p_etalon) очень сильно зависят от компилятора и флагов компиляции. Например у меня на xp pro sp2 с компилером gcc, без оптимайза число попыток непосредственно загружалось в регистр в программе, а указатели находились до массива, так что эти способы не канали (хотя изменяя флаги компиляции можно было прийти к данным решениям). Тем не менее существует (на мой взгляд) достаточно универсальный способ нахождения пароля. Завтра я его выложу (после того как сдам работу преподу, конкуренция блин=) ), кто выложит до меня поставлю +15 (ибо способ достаточно сложен для нахождения), если будет найден ещё один универсальный способ поставлю +20. Дерзайте =)
|
| Время: 15:50 |