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

image

Специалист по безопасности Тэвис Орманди (Tavis Ormandy) покопался в коде архиватора WinRAR и разработал инструментарий для встроенной в архиватор виртуальной машины RarVM.

Мало кто знает, что внутри WinRAR есть примитивная x86-совместимая виртуальная машина. В ней всего около 50 инструкций, а вся виртуальная машина со стандартными фильтрами занимает чуть больше 1000 строк. Она реализована внутри архиватора с одной целью: улучшить сжатие x86-кода. Например, представим программу вроде такой.

mov foo, bar
cmp bar, baz
push foo
call write
push bar
call write

Повторяющиеся вызовы можно транслировать в абсолютные адреса и более эффективно заархивировать. Поэтому в RAR есть фильтры для десятка стандартных вызовов. Более того, в нём есть возможность создания новых фильтров в процессе архивации! То есть в архив 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.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!

Bookmark and Share

Подробнее: http://www.xakep.ru/post/59409/default.asp

Читать комменты и комментировать

Добавить комментарий / отзыв



Защитный код
Обновить

Хак виртуальной машины RarVM внутри WinRAR | | 2012-10-01 03:14:54 | | Статьи об Интернет безопасности | | Специалист по безопасности Тэвис Орманди (Tavis Ormandy) покопался в коде архиватора WinRAR и разработал инструментарий для встроенной в архиватор виртуальной машины RarVM. Мало кто знает, что внутри WinRAR ес | РэдЛайн, создание сайта, заказать сайт, разработка сайтов, реклама в Интернете, продвижение, маркетинговые исследования, дизайн студия, веб дизайн, раскрутка сайта, создать сайт компании, сделать сайт, создание сайтов, изготовление сайта, обслуживание сайтов, изготовление сайтов, заказать интернет сайт, создать сайт, изготовить сайт, разработка сайта, web студия, создание веб сайта, поддержка сайта, сайт на заказ, сопровождение сайта, дизайн сайта, сайт под ключ, заказ сайта, реклама сайта, хостинг, регистрация доменов, хабаровск, краснодар, москва, комсомольск |
 
Поделиться с друзьями: