Задание pywhat (main.py):
Just another python reverse challenge. OR IS IT?
Видим много make_fn, очевидно make function. А первый вызов подобной функции происходит с параметром длины введёного флага:
if not make_fn(b"\x48\x83\xff\x1f\x0f\x94\xc0\xc3")(len(f)):\n\tprint("Incorrect")\n\texit(-1)
Сразу пиханул в свой дизасм, и даже без регистров и значений видно (CMP и SETE), что это обычный ассемблер, и длина флага должна быть 0x1F (31).
Ок, нам нужны все функции. Идем в make_fn и добаляем bin.write(d), не забывая до этого открыть файл на запись, типа того:
bin = open('main.bin', 'wb+')\n\ndef make_fn(d):\n\tbin.write(b'\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90') # разделение функций\n\tbin.write(d)
Запускаем и вводим флаг. Получившийся main.bin закидываем в дизассемблер и наслаждаемся.
В нем мы обнаруживаем огромное количество XOR, MOV, MOVX. То есть это обычная мешанина байтами. Можно заценить main.asm:
movzx eax, byte ptr [edi+9]\nmovzx edx, byte ptr [edi+0Dh]\nmov\t [edi+0Dh], al\nmov\t [edi+9], dl\n...\nxor\t byte ptr [edi+17h], 36h\nxor\t byte ptr [edi+18h], 0E6h
И все в таком духе.
А в самом низу последняя функция, в которой сравнивается каждый символ флага (сокращенно):
cmp\t byte ptr [edi], 91h\nsetz al ; это повторяющийся блок\nand\t bl, al ; вырезал чтоб не громоздить\ncmp\t byte ptr [edi+1], 0C2h\ncmp\t byte ptr [edi+2], 21h ; '!'\ncmp\t byte ptr [edi+3], 90h\ncmp\t byte ptr [edi+4], 0DDh\ncmp\t byte ptr [edi+5], 0DDh\ncmp\t byte ptr [edi+6], 0EBh\ncmp\t byte ptr [edi+7], 5Dh ; ']'\ncmp\t byte ptr [edi+8], 0B0h\ncmp\t byte ptr [edi+9], 3\ncmp\t byte ptr [edi+0Ah], 73h ; 's'\ncmp\t byte ptr [edi+0Bh], 57h ; 'W'\ncmp\t byte ptr [edi+0Ch], 0AAh\ncmp\t byte ptr [edi+0Dh], 4\ncmp\t byte ptr [edi+0Eh], 4Eh ; 'N'\ncmp\t byte ptr [edi+0Fh], 0C8h\ncmp\t byte ptr [edi+10h], 30h ; '0'\ncmp\t byte ptr [edi+11h], 0D7h\ncmp\t byte ptr [edi+12h], 57h ; 'W'\ncmp\t byte ptr [edi+13h], 98h\ncmp\t byte ptr [edi+14h], 14h\ncmp\t byte ptr [edi+15h], 25h ; '%'\ncmp\t byte ptr [edi+16h], 79h ; 'y'\ncmp\t byte ptr [edi+17h], 7Eh ; '~'\ncmp\t byte ptr [edi+18h], 0CFh\ncmp\t byte ptr [edi+19h], 0D5h\ncmp\t byte ptr [edi+1Ah], 46h ; 'F'\ncmp\t byte ptr [edi+1Bh], 0D6h\ncmp\t byte ptr [edi+1Ch], 50h ; 'P'\ncmp\t byte ptr [edi+1Dh], 16h\ncmp\t byte ptr [edi+1Eh], 96h
В общем то все понятно. Берем эти символы и идем в обратную сторону (мы же реверсом занимаемся).
Как я сделал. Из main.asm отпарсил все инструкции с индексами (смещением) и значениями. И запустил в обратной последовательности.
И получился флаг: LB{4u70m471c_c0d3_4n41y515_101}
P.S. Мне показалось странным, что это задание решило меньше участников чем Strings.