Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #122, ФЕВРАЛЬ 2009 г.

X-Puzzle

Иван Скляров (xpuzzle@real.xakep.ru, www.sklyaroff.ru)



«ПРОЙДИСЬ ДЕБАГГЕРОМ ПО СВОИМ МОЗГАМ!»

Не стесняйся присылать свои ответы! Даже если ты смог ответить всего на один пазл, я с интересом почитаю твои оригинальные решения. Ну а герои, которые первыми правильно ответят на все вопросы, получат призы и увидят свои имена на страницах ][.

Помни: в большинстве случаев вариант ответа засчитывается как правильный, только если к нему приложено подробное и ВЕРНОЕ объяснение.

ОТВЕТЫ К ПРЕДЫДУЩЕМУ ВЫПУСКУ X-PUZZLE

Ответ на пазл №1 «ЛЮБОВЬ И НЕНАВИСТЬ»

Исправить необходимо второй байт (или первый, если отсчет начинать с нуля) – с 2Dh на 17h. Ниже показан исходный код программы hatelove.com на ассемблере (можно также взять на диске к журналу):

CSEG segment
assume CS:CSEG,DS:CSEG,ES:CSEG,SS:CSEG
org 100h

Begin:

mov bx,offset Mess1
push bx
call Xorer

pop bx
mov ah,9
mov dx,bx
int 21h

mov ah,9
mov dx,offset Mess3
int 21h

int 20h

Mess2 db "N'khqb'#"

Xorer proc

mov cx,8

Hi:
mov ax,[bx]
xor ax,7
mov [bx],ax
inc bx

loop Hi

ret
Xorer endp

Mess1 db "N'ofsb'#"
Mess3 db "][akep!$"

CSEG ends
end Begin

Ответ на пазл №2 «ОЧЕНЬ ПРОСТОЙ ШИФР»

Расшифрованная фраза: «ПОКУПАЙ ХАКЕР». В зашифрованном тексте каждый ASCII-код представляет собой порядковый номер буквы в русском алфавите. Например, ASCII-код 6h – это шестая буква в русском алфавите, то есть буква «Е».

Ответ на пазл №3 «ЛОГИЧЕСКАЯ ЗВЕЗДА»

Вот возможные варианты:

  • число в середине – 57;
  • левая ветвь – AND;
  • нижняя ветвь – XOR;
  • верхняя ветвь – OR;
  • правая ветвь – XOR.

Ответ на пазл №4 «ЛОВЛЯ БАГОВ»

Первый участок кода. В начале функции main осуществляется проверка количества аргументов командной строки на равенство трем: if (argc != 3). Однако, далее по коду можно обнаружить, что используются аргументы argv[2] и argv[3], то есть argc должно быть, как минимум, равно 4 (от argv[0] до argv[3]). Очевидно, условие должно иметь такой вид: if (argc != 4).

Второй участок кода. Первая функция fopen, которая возвращает указатель fdout, открывает файл на чтение («rb»), но дальше в коде функцией fwrite осуществляется запись в этот файл. Вторая функция fopen, которая возвращает указатель fdin, открывает файл на запись («wb»), но затем в коде функцией fread из него осуществляется чтение. Соответственно, аргументы «rb» и «wb» в функциях fopen должны быть поменяны местами.

Третий участок кода. В стандартной Windows-функции CreateFile не хватает одного аргумента (всего их должно быть 7).

ПЕРВЫЙ ПАЗЛ «ЗАБАВНОЕ КОДИРОВАНИЕ»

С помощью неизвестного алгоритма фраза «Реши пазл» оказалась закодирована следующим образом:

БИшЫ СТЮЩ

Раскодируй такую фразу, закодированную этим же самым алгоритмом:

ьИ ЈтрИШЫЈь ЮЬТть ФЈИ, чтАУы ЬИ ЈтТть ФА ФЈИШ ЬИФИГЖАЭ

ВТОРОЙ ПАЗЛ «НАЙДИ ЗЛОВРЕДА»

На рисунках показаны четыре участка кода, взятые из реальных программ. Твоя задача – определить, какие из этих участков относятся к зловредам. Разумеется, необходимо обосновать, почему ты так решил.

ТРЕТИЙ ПАЗЛ «ЗАКОВЫРКА»

Определи правильный пароль к программе zakovirka.exe. Программу zakovirka.exe можно найти на диске к журналу или на моем сайте www.sklyaroff.ru.

ЧЕТВЕРТЫЙ ПАЗЛ «ОПТИМИЗАЦИЯ ПО САМОЕ НЕ БАЛУЙСЯ»

В листинге ты видишь кусок кода на языке программирования Ассемблер. Твоя задача – оптимизировать его по размеру и по скорости. При этом он не должен потерять своей функциональности.

loop $
push cx
not dx
not cx
or dx,cx
xor dx,0ffffh
mov bx,dx
or cx,bx
and ax,bx
xor ax,0ffffh
and cx,ax
pop cx
mov ax,cx

Содержание