Добро пожаловать обратно! Эта серия стала бы скучной, если бы все, что мы делали, — это инструкции по патчам, так что давайте попробуем на самом деле пройти этот уровень.

Если вы пропустили предыдущие посты, вот они:





Загрузите двоичный файл, проанализируйте его, найдите 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

Ссылки

Автономные инструменты r2

r2 Вступительное видео от производителя — Pancake

LiveOverflow проходит простой кряк-челлендж