понедельник, 1 октября 2012 г.

Хак виртуальной машины внутри WinRAR -


Специалист по безопасности Тэвис Орманди (Tavis Ormandy) покопался в коде архиватора WINRAR и разработал набор инструментов для встроенной в архиватор виртуальной машины RARVM. Мало кто знает, что внутри WINRAR есть примитивная x86-совместимая виртуальная машина. В ней всего около 50 инструкций, а вся виртуальная машина со стандартными фильтрами занимает чуть более 1000 строк. Она реализована внутри архиватора с одной целью: улучшить сжатие x86-кода. К примеру, представим программу вроде такой.
mov foo, bar
cmp bar, baz
push foo call
write push bar

call write
     Повторяющиеся вызовы возможно транслировать в абсолютные адреса и более эффективно заархивировать.


   По этой причине в RAR есть фильтры для 10-ка стандартных вызовов. Также, в нём есть возможность создания новых фильтров в ходе архивации! То есть в архив RAR возможно включать байткод, который будет исполняться встроенной виртуальной машиной RARVM. До сих пор не существовало программ, которые бы использовали эту необычную функциональность, по этой причине Тэвис Орманди разработал компоновщик и ассемблер, опубликовал документацию для работы с RARVM, скоро собирается выпустить ещё дизассемблер и, может оказаться, портировать компилятор на основе llvm. Пример программы, которая выводит классическое "Hello, World!" за счёт CRC-компенсации в проверке CRC.
$ cat sample.rs
#include
#include
#include
#include ;
vim: syntax=fasm ;
Test RAR assembly file that just demonstrates the syntax.
_start: ;
Install our message in the output buffer mov r3,
#0x1000 ;
Output buffer.
mov [r3+#0], #0x41414141 ;Padding for compensation
mov [r3+#4], #0x0a414141 ; Padding for compensation
mov [r3+#8], #0x6c6c6548 ; 'Lleh'
mov [r3+#12], #0x57202c6f ; 'W ,o'
mov [r3+#16], #0x646c726f ; 'dlro'
mov [r3+#20], #0x00000a21 ; '!n'
mov [VMADDR_NEWBLOCKPOS], #0x00001000
mov [VMADDR_NEWBLOCKSIZE], #22 ;
Compensate to required CRC
push RAR_FILECRC

push [VMADDR_NEWBLOCKSIZE]

push [VMADDR_NEWBLOCKPOS]
call $_compensate_crc
test r0, r0 jz $finished
call $_error finished:
call $_success $
make sample.rar
cpp -Istdlib < sample.rs > sample.ri ./
raras -o sample.ro sample.ri ./
rarld sample.ro > sample.rar
rm sample.ri sample.ro
$ unrar p -idq sample.rar AAC��!A Hello, World!




Till now there were no programs which would use this unusual functionality, therefore Tevis Ormandi has developed компоновщик and the assembler, has published the documentation for work with RarVM, in the near future plans to let out still дизассемблер and, maybe, портировать the compiler on a basis llvm. Example of the program which deduces classical “Hello, World!” At the expense of CRC-indemnification in check CRC.
$ cat sample.rs
#include
#include
#include
#include ;
vim: syntax=fasm ;
Test RAR assembly file that just demonstrates the syntax. _start: ; Install our message in the output buffer mov r3, #0x1000; Output buffer. mov [r3+#0], #0x41414141; Padding for compensation mov [r3+#4], #0x0a414141; Padding for compensation mov [r3+#8], #0x6c6c6548; ' lleH' mov [r3+#12], #0x57202c6f; ' W, o' mov [r3+#16], #0x646c726f; ' dlro' mov [r3+#20], #0x00000a21; '! \n' mov [VMADDR_NEWBLOCKPOS], #0x00001000 mov [VMADDR_NEWBLOCKSIZE], #22 ; Compensate to required CRC push RAR_FILECRC push [VMADDR_NEWBLOCKSIZE] push [VMADDR_NEWBLOCKPOS] call $ _compensate_crc test r0, r0 jz $finished call $ _error finished: call $ _success $ make sample.rar cpp-Istdlib  sample.ri ./raras-o sample.ro sample.ri ./rarld sample.ro> sample.rar rm sample.ri sample.ro $ unrar p-idq sample.rar AAc��! A Hello, World! Бесплатный Хостинг

Комментариев нет:

Отправить комментарий