Добро пожаловать обратно! Эта серия стала бы скучной, если бы все, что мы делали, — это инструкции по патчам, так что давайте попробуем на самом деле пройти этот уровень.
Если вы пропустили предыдущие посты, вот они:
Загрузите двоичный файл, проанализируйте его, найдите sym.phase_3,
и распечатайте его.
Несмотря на первые впечатления, эта функция не очень сложна, и с режимом Graph мы можем легко в ней разобраться. Войдите в режим графика с помощью команды (заглавная) VV
, затем перемещайтесь с помощью клавиш со стрелками или hjkl
а-ля vim. Выйдите, нажав qq
.
Функция считывает два аргумента из stdin
, использует один в операторе switch — case, затем сравнивает результат со вторым аргументом. Потратьте некоторое время, чтобы привыкнуть к режиму Graph, так как он чрезвычайно полезен для сложных функций. Больше команд можно найти здесь.
Функции становится довольно легко разбить в графическом режиме. Судя по графикам, Фаза 3 выглядит примерно так:
if !(argc > 1): fail() switch(arg1) { case1: // mov something into eax break; ... default: fail() } if arg2 != eax: fail()
Поскольку мы мятежники и отказываемся выполнять это задание должным образом, мы перезапишем число, перемещаемое в eax
at 0x00400fb9
для случая 1.
Есть много способов сделать это, но здесь мы будем использовать wai
—(W)rite (O)pcode (I)nside — с последующей новой инструкцией. Если новая инструкция не подходит, r2 попытается исправить ее с выводом nops или ошибки.
[0x00400c90]> wa? Usage: wa[of*] [arg] | wai jmp 0x8080 write inside this op (fill with nops or error if doesnt fit)
Снова откройте двоичный файл в режиме записи, найдите 0x00400fb9
, где 0x137
перемещается в eax
, затем используйте wai
, чтобы изменить число, перемещаемое в eax, на 0x2329
:
wai mov eax, 0x2329
Если вы не уверены, откуда взялось 0x2329
, попробуйте использовать встроенную в r2 функцию оценки выражений. Просто введите вопросительный знак в командной строке r2, а затем любое шестнадцатеричное/двоичное/целое число.
[0x00400c90]> ? 0x2329 int32 9001 uint32 9001 hex 0x2329 octal 021451 unit 8.8K segment 0000:0329 string “)#” fvalue: 9001.0 float: 0.000000f double: 0.000000 binary 0b0010001100101001 trits 0t110100101
Как видите, 0x2329
— это 9001. Почему? Потому что больше 9000. Никакой другой причины. Я упоминал, что r2 также может заниматься математикой?
[0x00400c90]> ? 0xdeadbeef & 0xFF int32 239 uint32 239 hex 0xef octal 0357 unit 239 segment 0000:00ef string “\xef” fvalue: 255.0 float: 0.000000f double: 0.000000 binary 0b11101111 trits 0t22212
В любом случае, вернемся к вызову. Теперь, когда инструкция перезаписана, закройте r2, обновите в файле answer.txt ваш пользовательский ответ фазы 3 и запустите его.
$ cat answers.txt Taylor Swift is pretty fly stupid sexy Flanders 1 9001
Новые команды:
VV # Enter Graph Mode (exit with qq) wai # Write — Opcode — Inside | less # pipe output through common *nix commands
В этом посте было мало новых команд, так как очень важно привыкнуть к режиму Graph. Мы углубимся в следующую часть, а пока пройдемся по этапам 1 и 2 в режиме графика и посмотрим, как все сочетается.
Далее: CMU Bomb Lab with Radare2 — Фаза 4