Убедите бинарник, что ХОТИТЕ флаг.

Solution

Бинарь тот же. Ладно. Теперь нужно уговорить его выдать нам флаг.

00400590    int32_t main(int32_t argc, char** argv, char** envp)

00400598        int32_t var_c = 0
0040059f        int64_t rax
0040059f        rax.b = 0
004005a1        obfuscated_prepare_memory()
004005b0        void* rax_1
004005b0        rax_1.b = 0
004005c1        int32_t var_10 = printf(format: "Hope you got what you wanted!\n")
004005c4        int32_t rax_2
004005c4        rax_2.b = 0
004005d5        int32_t var_14 = printf(format: "Checking... ")
004005e0        int32_t rax_4
004005e0        
004005e0        if (strcmp("dont_give_flag", "I_WANT_THE_FLAG!") == 0)
00400606            rax_4.b = 0
0040060d            int32_t var_18_1 = printf(format: "okok, giving you the flag..\n")
00400610            int32_t rax_5
00400610            rax_5.b = 0
00400612            obfuscated_give_flag()
004005e0        else
004005f0            rax_4.b = 0
004005f2            printf(format: "looks like you don't want flag\n")
0040061f        return 0

Нам мешает проверка strcmp. Запатчим?

Патчинг

Использую для этого встроенные возможности Binary Ninja:

IMG

На выходе я имею следующую функцию:

IMG

Запускаю.

IMG

Внезапно.

IMG

Поиск строки в файле мне ничего не дал.

IMG

Пропатчу саму строку. Для этого использую команду Binary Ninja API - bv.write(0x60b040, 'I_WANT_THE_FLAG!').

IMG

Запущу:

IMG

IMG

Ладно. Полез в отладчик.

Отладка.

Чтобы убедиться в своей адекватности, я поставлю брейкпоинт на main и через strcmp, чтобы проверить, что подается правильная строка для сравнения:

IMG

Начало main:

IMG

Перед сравнением:

IMG

Замечательно. С головой все в порядке. Ну так уж и быть. Пропатчу строку перед вызовом strcmp. Делов-то:

  • Дойду до нужного брейкпоинта:

IMG

  • Изменю память командой set {char[0x11]} 0x60b040 = "I_WANT_THE_FLAG!":

IMG

  • Продолжу нормальное выполнение программы с помощью continue/c:

IMG

А вот и флаг:

spbctf{ed1t1ng_t3h_memory_l1ke_a_PRO}