Они не искажены, это (предположительно) правильная интерпретация этих байтов как символов ASCII.
И они не являются значениями EIP или значениями .(«Значение EIP» иногда используется для адреса возврата, даже если в EIP они не , но я не думаю, что это происходит здесь).Фактическое отображение EIP в порядке: EIP: 0x565560a4 (<_start+164>: pop esi)
.
Если бы в стеке были адреса возврата, вы бы использовали x /10xw $esp
или аналогичный.
Это похоже на строковые данные.например, 0x70 ^ 0x41 = 0x31 = '1'
.и 0x23^0x41 = 0x62 = 'b'
.
Но я думаю, что происходит то, что программа создает ключ с помощью серии открывающих инструкций DWORD и затем загружает его в стек.
Нет, он создает данные в стеке с серией нажатий.Это уже в стеке в этой точке.
Ключ 0x41
, в mov ebx, 0x41
.
Тогда этоПохоже, он имеет неэффективный цикл, который должен xor
каждый байт по одному с 0x41
, но вы закомментировали dec
и оставили в ветке абсолютный адрес 0xb7
, что приведет к segfault под Linux.
Совершенно очевидно, что это должно быть
.loop: ; do {
lodsb
xor eax,ebx
stosb
dec ecx
jnz .loop ; }while(--ecx);
после более ранних инструкций, которые настраивают EDI и ESI = ESP, и очищают инструкции DF to string, идущие вверх.
Thisзабавно неэффективен (идет по 1 байту за раз для ECX = 0x80 байтов и использует медленную инструкцию loop
, которая ограничивает ее до 1 итерации на 6 циклов на последних процессорах Intel), но также не выглядит оптимизированной для размера кода.(mov eax, 0x41
- 5 байтов против 3 для push 0x41
/ pop eax
).Оптимизация цикла для размера кода, но код за пределами для скорости обратный.
Гораздо эффективнее было бы xor dword [esi], 0x41414141
/ add esi,4
.(Или вы можете использовать lodsd
как 1-байтовый способ увеличить ESI на 4, если вам важен размер кода, а не скорость.)