VolgaCTF Quals 2013 (Reverse 100)

Решения

http://www.koibasta.ru/2013/05/14/volgactf-2013-quals-reverse-100/ (КОИБАСta) Назад к списку заданий

Задание (reverse)

image00.jpg

Подробное описание

"У вас есть программка, установленная на вашем главном компьютере, причем, она очень важна для всей системы, но вы не можете заставить ее работать. Вам необходимо найти способ, чтобы запустить эту программу".

Это простое приложение rev100.efi для UEFI Shell (http://sourceforge.net/apps/mediawiki/tianocore) с amdx86_64 архитектурой.


UEFI (единый интерфейс EFI) - это стандартный интерфейс встроенного программного обеспечения для компьютеров, заменяющий BIOS. В создании этого стандарта участвовали более 140 технологических компаний, составляющих часть консорциума UEFI, включая Microsoft. Стандарт был создан для улучшения взаимодействия программного обеспечения и устранения ограничений BIOS. Вот некоторые из преимуществ UEFI.

  • Повышение безопасности при защите процессов, происходящих перед запуском или загрузкой, от атак bootkit.
  • Уменьшение времени загрузки или восстановления после гибернации.
  • Поддержка дисков объемом более 2,2 Тбайт.
  • Поддержка современных драйверов устройств с 64-разрядным встроенным ПО, которые система может использовать для привлечения более 17,2 миллиарда гигабайт памяти во время запуска.
  • Возможность использовать BIOS с оборудованием UEFI.

Внимание: нам нет необходимости выполнять приложение, достаточно просто использовать статический анализ. Ищем строки в коде, и находим:
enter passwd
Success!
Failed!
Все они встречаются в одной функции - 0x00022A9, которая занимается проверкой введенного пароля. Проверка (0x0002310 – 0x00023CE) обрабатывает пароль посимвольно (7 символов), получаем шифр, который затем сравниваем с фиксированной строкой:

.data:00003F8A check db C5h,8Ah,0BFh,46h,38h,09h,81h,14h,58h,79h,57h,4Fh,ACh,4Bh,1Fh,38h

Реверсим алгоритм и пишем скрипт:

enstr = "\xC5\x8A\xBF\x46\x38\x09\x81\x14\x58\x79\x57\x4F\xAC\x4B\x1F\x38"
def ror8(num, count):
    return (num >> count | num << (8-count)) & 0xFF
def rol8(num, count):
    return (num << count | num >> (8-count)) & 0xFF
 
def encode(s):
    res = ""
    len_ = len(s) / 2
    s += "\0"
    for i in range(len_):
        x = ror8(ord(s[i*2+1]), i)
        res += chr(x ^ 0xAD)
        x = ror8(ord(s[i*2]), i)
        res += chr(x ^ 0xDE)
    return res
 
def decode(s):
    res = ""
    for i in range(8):
        x = ord(s[i*2+1]) ^ 0xDE
        x = rol8(x, i)
        res += chr(x)
        x = ord(s[i*2]) ^ 0xAD
        x = rol8(x, i)
        res += chr(x)
    return res
 
my = decode(enstr)
print("[+]Decode: "+my)
 
my = encode(my)
res = ""
for i in range(len(my)):
    res += hex(ord(my[i]))+", "
print("[+]Encode: "+res)

Результат:
[+]Decode: Th1$_VVaz_2_e@sY
[+]Encode: 0xc5, 0x8a, 0xbf, 0x46, 0x38, 0x9, 0x81, 0x14, 0x58, 0x79, 0x57, 0x4f, 0xac, 0x4b, 0x1f, 0x38,

Флаг:
Th1$_VVaz_2_e@sY

Пока не указано иное, содержимое этой страницы распространяется по лицензии Creative Commons Attribution-ShareAlike 3.0 License