Blog08: Разное — MCSC v10 Writeups: Part One (Reverse Challenges)
Привет, народ!
Подошла к концу 10-я версия нашего крупного турнира, MCSC, а также соревнования CTF. Победители были коронованы, но всем, казалось, не терпелось узнать все подробности о предстоящих испытаниях.
Именно по этой причине мы представим вам официальные отчеты о задачах, которые мы предложили на CTF этого года. Начиная с категории «Обратное».
Будьте начеку, так как в ближайшие дни в сети появится больше рецензий на другие категории.
Итак, давайте приступим к делу, не так ли?
Вызов — самореф.
Это ELF64, который динамически генерирует флаг. Это легко отследить с помощью хорошего отладчика, который не будет возражать против missing section headers at 4296, например, radiuse2.
[0x00600580]> db sym.main
[0x00600580]> doo
INFO: File dbg:///home/thamugadi/mcsc/selfref/selfref reopened in read-write mode
[0x00600580]> dc
hit breakpoint at: 0x60064b
[0x0060064b]>
r2
[0x0060064b]> db 0x006006a7
[0x0060064b]> dc
hit breakpoint at: 0x6006a7
[0x006006a7]> pxq @rsi
0x00a00a48 0x6c6b7b6365736e69 0x7831665f336e3333 insec{kl33n3_f1x
0x00a00a58 0x746e3130705f6433 0x000000000000007d 3d_p01nt}…….
0x00a00a68 0x0000000000000000 0x0000000000000000 …………….
Вызов — пакет
pack: ELF 64-bit LSB executable, x86–64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86–64.so.2, stripped
checksec pack
[*] ‘/home/thamugadi/mcsc/pack’
Arch: amd64–64-little
RELRO: No RELRO
Stack: No canary found
NX: NX disabled
PIE: No PIE (0x400000)
RWX: Has RWX segments
Мы собираемся проследить за его выполнением, используя radiuse2.
Первое, что мы можем заметить, это то, что основная функция массово перемещает байты в стек:
Мы также видим, что эти байты подвергаются операции XOR. Идея двоичного файла состоит в том, чтобы перейти к динамически сгенерированному коду, который был перемещен в зашифрованном виде в стек во время выполнения и подвергнут XOR, чтобы получить реальную инструкцию также во время выполнения.
Вот callинструкция к области стека
0x004010ea mov rdx, r10
0x004010ed call 0x401288
0x004010f2 lea r11, [rbp — 0x304]
0x004010f9 call r11
0x004010fc mov eax, 0
0x00401101 leave
0x00401102 ret
Обратное очень просто: у нас есть ключ 0xdeadbeefdeadbeefи пять магических значений : 0xeaddc58cbbded086, 0xb09cdcb0ba9ed58c, 0xb6ca8f9d81d4ccdb, 0xa3c8ccdcb6d9e19b, 0xfffeedaa9deeebbcкоторые с ним подвергаются операции XOR.
Значение, которое мы получаем после выполнения этих операций:insec{p4ck3d_b1n4ry_r1ght_th3re}
Задача — открыть прошивку
Эта задача состоит из изображения Apple Partition Map, предназначенного для Macintosh эпохи PowerPC.
После недолгих поисков в Интернете мы можем узнать, что на этих машинах используется прошивка OpenFirmware , а также что она запускает скрипт Forth при запуске.
Давайте просто напечатаем необработанный DISK.APM: мы сразу заметим скрипт Forth.
: initmsg .” I just loaded the flag for you! :)” cr ;
: startmsg .” Find it…” cr ;
: sup — dup abs = ;
: inf dup sup 1 + ;
: diff = if 0 else -1 then ;
: fba frame-buffer-adr ;
: val1 15d74719 ;
: val2 2626cd75 ;
: val3 637b663 ;
: val4 265cd ;
val1 5 * val2 3
* val3 10 * val4
2bf9 * 80000010 l! 80000014 l! 80000018 l! 8000001c l!
then fba mac99-vram = if mac99-message val1 5
* val2 3 * val3 10 * val4
2bf9 * 81000010 l!
81000014 l! 81000018 l! 8100001c l!
then .” informations stored :” cr variable run -1 run !
fba beige-vram diff fba mac99-vram diff and if hardware-error 0 run ! then
run @ 0 = if 1 0 do 0 +loop then
initmsg
startmsg
boot hd:,\boot\kernel.elf
Поэтому эти строки:
val1 5 * val2 3
* val3 10 * val4
2bf9 *
push 0x5*val1
push 0x3*val2
push 0x10*val3
push 0x2bf9*val4
0x696e7365
0x637b6630
0x7274685f
0x6d34637d
кстати, остальная часть образа диска совершенно не имеет значения и просто содержит один из моих игрушечных проектов , которые загружаются на Mac на базе PowerPC :)
Вызов — фамиком
Это испытание состоит из ПЗУ Nintendo Entertainment System . В описании предлагается использовать эмулятор FCEUX, в котором есть такие интересные возможности, как отладка, просмотр памяти, дизассемблирование.
Перед началом следует отметить, что не обязательно хорошо разбираться в сборке 6502 (на которой основан ЦП NES), чтобы полностью разобраться в интересующей нас части кода. На самом деле достаточно знать, что сравнения выполняются с помощью инструкции CMP.
Мы запустим ПЗУ и динамически проверим память (как указано в подсказке).
Мы сразу замечаем кое-что интересное: когда мы вводим пароль с помощью стрелок направления, место в памяти ( 0x300) заполняется байтами 01, 02, 03или 04. После нескольких тестов мы видим, что клавиша «Влево» соответствует 01, клавиша «Вправо» — 02, клавиша «Вверх» — 03, а клавиша «Вниз» — 04.
Теперь давайте посмотрим на исполняемый код. Мы, конечно, можем сделать это с помощью FCEUX, но я буду использовать Radeone2, который мне кажется более удобным.
Перейдем по указанному в описании адресу для начала Main:s 0x90a5
Спустившись немного вниз, мы обнаруживаем, что сталкиваемся с длинной цепочкой условных ветвей (BEQ, ветвь, если они равны) после сравнений со значениями в диапазоне от 1 до 4, точно так же, как байты, соответствующие входным данным, которые мы определили ранее.
Создавая соответствие, которое мы изложили ранее, вот полная последовательность, ожидаемая этим кодом:
ЛУДРЛУРУЛЛУДРДУ
Давайте попробуем этот пароль, и мы получим флаг :)
Мы надеемся, что эти статьи ответят на ваши вопросы об обратных вызовах.
И не забывайте! Очень скоро появятся новые рецензии на другие категории.
Ссылки
Facebook: ИНСЕК Энсиас
Инстаграм: ИНСЕК Энсиас
Linkedin: INSEC Ensias
Youtube: Клуб ИНСЕК
Не забудьте подписаться на нас в социальных сетях, чтобы быть в курсе всего, что делает клуб. С нетерпением ждем возможности поделиться знаниями со всеми читателями, и мы приветствуем ваши отзывы по адресу [email protected].
Сценарист: thmgdi
Редакторы: berradAtay , akna , F3nn3C

![В любом случае, что такое связанный список? [Часть 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































