пытаясь найти скрытую строку в 32-битном ELF - PullRequest
0 голосов
/ 09 мая 2018

Не волнуйтесь, я не собираюсь спрашивать ответ.

Я пытаюсь найти скрытую строку (может быть, электронная почта?) В простой 1-функции 32-битный exe

Я уже запустил строки в файле, ничего полезного.

Я декомпилировал файл в ASCII и нашел основную функцию.

Файл показывает, что это исполняемый файл GCC.

вот асм главной функции:

        ; ================ B E G I N N I N G   O F   P R O C E D U R E ================

        ; Variables:
        ;    arg_0: int, 4


             main:
080489cc         lea        ecx, dword [esp+arg_0]                              ; Begin of unwind block (FDE at 0x80d6cb8), DATA XREF=_start+23
080489d0         and        esp, 0xfffffff0
080489d3         push       dword [ecx-4]
080489d6         push       ebp
080489d7         mov        ebp, esp
080489d9         push       esi
080489da         push       ebx
080489db         push       ecx
080489dc         sub        esp, 0x2c
080489df         call       __x86.get_pc_thunk.cx                               ; __x86.get_pc_thunk.cx
080489e4         add        ecx, 0xa261c
080489ea         mov        eax, dword [gs:0x14]
080489f0         mov        dword [ebp-0x1c], eax
080489f3         xor        eax, eax
080489f5         mov        eax, esp
080489f7         mov        esi, eax
080489f9         mov        dword [ebp-0x2c], 0x15
08048a00         mov        eax, dword [ebp-0x2c]
08048a03         lea        edx, dword [eax-1]
08048a06         mov        dword [ebp-0x28], edx
08048a09         shl        eax, 0x2
08048a0c         lea        edx, dword [eax+3]
08048a0f         mov        eax, 0x10
08048a14         sub        eax, 0x1
08048a17         add        eax, edx
08048a19         mov        ebx, 0x10
08048a1e         mov        edx, 0x0
08048a23         div        ebx
08048a25         imul       eax, eax, 0x10
08048a28         sub        esp, eax
08048a2a         mov        eax, esp
08048a2c         add        eax, 0x3
08048a2f         shr        eax, 0x2
08048a32         shl        eax, 0x2
08048a35         mov        dword [ebp-0x24], eax
08048a38         mov        eax, dword [ebp-0x24]
08048a3b         mov        dword [eax], 0x2391
08048a41         mov        eax, dword [ebp-0x24]
08048a44         mov        dword [eax+4], 0x239d
08048a4b         mov        eax, dword [ebp-0x24]
08048a4e         mov        dword [eax+8], 0x239d
08048a55         mov        eax, dword [ebp-0x24]
08048a58         mov        dword [eax+0xc], 0x2399
08048a5f         mov        eax, dword [ebp-0x24]
08048a62         mov        dword [eax+0x10], 0x239c
08048a69         mov        eax, dword [ebp-0x24]
08048a6c         mov        dword [eax+0x14], 0x2363
08048a73         mov        eax, dword [ebp-0x24]
08048a76         mov        dword [eax+0x18], 0x2358
08048a7d         mov        eax, dword [ebp-0x24]
08048a80         mov        dword [eax+0x1c], 0x2358
08048a87         mov        eax, dword [ebp-0x24]
08048a8a         mov        dword [eax+0x20], 0x2390
08048a91         mov        eax, dword [ebp-0x24]
08048a94         mov        dword [eax+0x24], 0x2398
08048a9b         mov        eax, dword [ebp-0x24]
08048a9e         mov        dword [eax+0x28], 0x2398
08048aa5         mov        eax, dword [ebp-0x24]
08048aa8         mov        dword [eax+0x2c], 0x2357
08048aaf         mov        eax, dword [ebp-0x24]
08048ab2         mov        dword [eax+0x30], 0x2390
08048ab9         mov        eax, dword [ebp-0x24]
08048abc         mov        dword [eax+0x34], 0x2395
08048ac3         mov        eax, dword [ebp-0x24]
08048ac6         mov        dword [eax+0x38], 0x2358
08048acd         mov        eax, dword [ebp-0x24]
08048ad0         mov        dword [eax+0x3c], 0x2377
08048ad7         mov        eax, dword [ebp-0x24]
08048ada         mov        dword [eax+0x40], 0x235e
08048ae1         mov        eax, dword [ebp-0x24]
08048ae4         mov        dword [eax+0x44], 0x2380
08048aeb         mov        eax, dword [ebp-0x24]
08048aee         mov        dword [eax+0x48], 0x237a
08048af5         mov        eax, dword [ebp-0x24]
08048af8         mov        dword [eax+0x4c], 0x2381
08048aff         mov        eax, dword [ebp-0x24]
08048b02         mov        dword [eax+0x50], 0x23a3
08048b09         mov        eax, dword [ebp-0x2c]
08048b0c         sub        esp, 0xc
08048b0f         push       eax                                                 ; argument #1 for method __libc_malloc
08048b10         mov        ebx, ecx
08048b12         call       __libc_malloc                                       ; __libc_malloc
08048b17         add        esp, 0x10
08048b1a         add        eax, 0x1
08048b1d         mov        dword [ebp-0x20], eax
08048b20         mov        dword [ebp-0x30], 0x0
08048b27         jmp        loc_8048b44

строки 08048a35 - 08048b09 выглядит так, как будто он перемещается на 1 символ за раз, что я уверен, что это строка.

Вопрос в том, может ли кто-нибудь помочь мне выяснить, что это за персонажи? Они не являются кодировкой ASCII, и я не уверен, как ASM действительно выполняет такие вещи, как кодировка символов, поэтому, возможно, я просто не вижу этого. Может быть, это зашифровано?

Я новичок в этом и не знаю лучшего подхода. Спасибо!

1 Ответ

0 голосов
/ 09 мая 2018

Последовательность

08048a38         mov        eax, dword [ebp-0x24]
08048a3b         mov        dword [eax], 0x2391
08048a41         mov        eax, dword [ebp-0x24]
08048a44         mov        dword [eax+4], 0x239d

(и т. Д.) Записывает 0x2391, 0x239d, ... в последовательных расположениях в массиве 32-битных целых чисел (см. Смежные смещения с интервалом в 4 байта), указатель которого был передан в качестве параметра (значение указателя загружено - необъяснимо каждый раз - от ebp минус что-то). В конечном итоге его содержание будет:

0x2391
0x239d
0x239d
0x2399
0x239c
0x2363
0x2358
0x2358
0x2390
0x2398
0x2398
0x2357
0x2390
0x2395
0x2358
0x2377
0x235e
0x2380
0x237a
0x2381
0x23a3

Теперь, это не ASCII, но повторение второго и третьего элемента (плюс другие повторения позже) и тот факт, что все они в значительной степени находятся в одном диапазоне, заставили меня думать, что все они должны быть закодированы в тот же самый простой способ, предположительно суммирование или xor с некоторым фиксированным значением (всегда идентичный верхний байт 0x23 был пустой раздачей); поэтому, поскольку остальная часть кода (где, по-видимому, этот массив декодируется) отсутствует в вашем вопросе, я просто угадал и попытался вычесть им одинаковое значение, чтобы они вернулись в диапазон ASCII.

Мое первое предположение состояло в том, что повторное число выше (0x239d) должно было быть l (которые часто встречаются парами на английском языке). Следовательно, мне нужно было такое число, чтобы 0x239d стал l (ASCII 108); 0x239d - 108 = 9009, и это то, что я вычитал каждому персонажу. Результатом был весь ASCII (обнадеживающий - если бы схема была чем-то более сложным, я бы получил нечитаемый случайный мусор, кроме двух l), но бессмысленный.

Я выбрал метод «грубой силы» (наиболее разумные случаи - всего 62 - прописные, строчные и цифры - и исчерпывающий поиск с использованием этого метода - не более 256 случаев, все еще управляемый при визуальном осмотре) и пробовал некоторые аналогичные числа - все, что приводило к ASCII-символам, но, надеюсь, более разумно.

И действительно, однажды я достиг 9001:

In [18]: [chr(int(x,16)-9001) for x in s.split()]
Out[18]: 
['h',
 't',
 't',
 'p',
 's',
 ':',
 '/',
 '/',
 'g',
 'o',
 'o',
 '.',
 'g',
 'l',
 '/',
 'N',
 '5',
 'W',
 'Q',
 'X',
 'z']

(s здесь строка, содержащая содержимое второго кодового блока этого поста, со всеми значениями массива)

Получайте удовольствие от следующего уровня вашей игры. : -)


Кстати, эта сборка действительно ужасна. Некоторые из них, такие как продолжение перезагрузки того же значения из стека в регистры

mov eax, dword [ebp-0x24]

заставит меня задуматься о неоптимизированной, дружественной к отладчику сборке; OTOH, есть вещи, которые на самом деле не приходят из компилятора:

mov        eax, 0x10
sub        eax, 0x1

Здесь даже компиляция на скромном уровне распространения константы оптимизации привела бы к mov eax, 0xf, или, при -O0, это было бы выполнено в стеке, а не в регистрах, чтобы помочь одноступенчатому переходу на уровне источника.

mov        ebx, 0x10
mov        edx, 0x0
div        ebx
imul       eax, eax, 0x10

Это мозговая смерть на разных уровнях; вы никогда не увидите компилятор, выдающий mov edx, 0x0 в целом - даже при -O0 обнуление регистра почти всегда xor edx, edx. Кроме того, существует некоторая путаница с типами данных: сначала без знака div, затем со знаком imul (он сопоставляется с чем-то вроде ((int)((unsigned)(foo)/16))*16, что я считаю маловероятным).

Но самое главное, что gcc никогда не выдаст div или mul для деления / умножения на 16; преобразует их в сдвиг даже при -O0; clang - это то же самое (хотя при -O0 он все равно будет выдавать idiv для деления со знаком вместо сдвига + знаковый бит, используемый на более высоких уровнях оптимизации).

Наконец, если входное значение не имеет знака (согласно div), все это сводится к маскировке младших 4 битов, так что весь этот беспорядок может быть просто and eax, 0xfffffff0.

Итак, мне кажется, что это рукописный код человека, не очень опытного в сборке; Подобные вещи даже не кажутся «преднамеренными трудностями», усложняющими разборку - код довольно прост, он просто очень наивен.

...