<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Blog on Thomas Rinsma</title>
    <link>https://th0mas.nl/</link>
    <description>Recent content in Blog on Thomas Rinsma</description>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Tue, 19 Aug 2025 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://th0mas.nl/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Popping an alert from a sandboxed WebAssembly module</title>
      <link>https://th0mas.nl/2025/08/19/popping-an-alert-from-a-sandboxed-webassembly-module/</link>
      <pubDate>Tue, 19 Aug 2025 00:00:00 +0000</pubDate>
      <guid>https://th0mas.nl/2025/08/19/popping-an-alert-from-a-sandboxed-webassembly-module/</guid>
      <description>&lt;p&gt;Would you believe me if I told you this HTML page could show an &lt;code&gt;alert(&#39;hi from WASM&#39;)&lt;/code&gt;, when loaded?&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;script&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;WebAssembly&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;instantiateStreaming&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fetch&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;plugin.wasm&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{});&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;script&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;More generally, if &lt;code&gt;plugin.wasm&lt;/code&gt; is attacker-controlled, this could execute arbitrary JavaScript, despite the empty object as imports! Doesn&amp;rsquo;t this feel counter-intuitive, given the isolation properties of WebAssembly?&lt;/p&gt;&#xA;&lt;p&gt;It turns out that the WASM/JS barrier is not really meant to be a sandbox, and that a subtle &amp;ldquo;feature, not a bug&amp;rdquo; in the &lt;a href=&#34;https://webassembly.github.io/spec/js-api/#read-the-imports&#34;&gt;WebAssembly JS API specification&lt;/a&gt; allows for such an &amp;ldquo;escape&amp;rdquo;, when making use of some convoluted JS prototype and WASM interop trickery.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Spoofing OpenPGP.js signature verification (write-up)</title>
      <link>https://th0mas.nl/2025/06/15/spoofing-openpgp.js-signature-verification-write-up/</link>
      <pubDate>Sun, 15 Jun 2025 00:00:00 +0000</pubDate>
      <guid>https://th0mas.nl/2025/06/15/spoofing-openpgp.js-signature-verification-write-up/</guid>
      <description>&lt;p&gt;During a research project for Codean Labs, &lt;a href=&#34;https://b0n0.blog/&#34;&gt;Edoardo&lt;/a&gt; and I found several vulnerabilities in OpenPGP.js. The worst of which was a subtle logical flaw which allowed an attacker to craft a &amp;ldquo;valid&amp;rdquo; PGP signature without access to the respective private key.&lt;/p&gt;&#xA;&lt;p&gt;Read the write-up on Codean Labs&amp;rsquo; blog:&lt;br&gt;&#xA;&lt;a href=&#34;https://codeanlabs.com/2025/06/cve-2025-47934-spoofing-openpgp-js-signatures/&#34;&gt;https://codeanlabs.com/2025/06/cve-2025-47934-spoofing-openpgp-js-signatures/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;media-coverage&#34;&gt;Media coverage&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.yeswehack.com/news/critical-signature-spoofing-vulnerability-openpgpjs&#34;&gt;YesWeHack&lt;/a&gt; wrote a blog about this bug after several online news media picked it up, including &lt;a href=&#34;https://www.techradar.com/pro/security/an-openpgp-js-flaw-just-broke-public-key-cryptography&#34;&gt;TechRadar&lt;/a&gt;, &lt;a href=&#34;https://www.securityweek.com/critical-openpgp-js-vulnerability-allows-spoofing/&#34;&gt;SecurityWeek&lt;/a&gt;, and &lt;a href=&#34;https://www.theregister.com/security/2025/05/20/openpgpjs-bug-enables-encrypted-message-spoofing/754624&#34;&gt;The Register&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Exploiting LibreOffice (write-up)</title>
      <link>https://th0mas.nl/2025/02/12/exploiting-libreoffice-write-up/</link>
      <pubDate>Wed, 12 Feb 2025 00:00:00 +0000</pubDate>
      <guid>https://th0mas.nl/2025/02/12/exploiting-libreoffice-write-up/</guid>
      <description>&lt;p&gt;During a research tangent at work, I found several logical vulnerabilities in LibreOffice.&lt;/p&gt;&#xA;&lt;p&gt;The write-up includes a proof-of-concept showing how one of the bugs can be used to steal a secret from an incoming email (assuming a desktop Linux usecase with LibreOffice and Thunderbird), which was particularly fun to put together.&lt;/p&gt;&#xA;&lt;p&gt;Read the write-up on Codean Labs&amp;rsquo; blog: &lt;br&gt;&#xA;&lt;a href=&#34;https://codeanlabs.com/2025/02/exploiting-libreoffice-cve-2024-12425-and-cve-2024-12426/&#34;&gt;https://codeanlabs.com/2025/02/exploiting-libreoffice-cve-2024-12425-and-cve-2024-12426/&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Tetris in a PDF</title>
      <link>https://th0mas.nl/2025/01/12/tetris-in-a-pdf/</link>
      <pubDate>Sun, 12 Jan 2025 14:00:00 +0100</pubDate>
      <guid>https://th0mas.nl/2025/01/12/tetris-in-a-pdf/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://th0mas.nl/downloads/pdftris.pdf&#34;&gt;&lt;figure class=&#34;right&#34;&gt;&lt;img src=&#34;https://th0mas.nl/2025/01/12/tetris-in-a-pdf/pdftris.png&#34; width=&#34;250px&#34;&gt;&lt;figcaption&gt;&#xA;      &lt;h4&gt;Click to play Tetris&lt;/h4&gt;&#xA;    &lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Recently, just for fun, I managed to create a playable version of Tetris inside a PDF. I posted about this a couple days ago on &lt;a href=&#34;https://news.ycombinator.com/item?id=42645218&#34;&gt;Hacker News&lt;/a&gt; and &lt;a href=&#34;https://x.com/thomasrinsma/status/1875923074635424250&#34;&gt;Twitter&lt;/a&gt;. You can play it by opening &lt;a href=&#34;https://th0mas.nl/downloads/pdftris.pdf&#34;&gt;this file&lt;/a&gt; in a compatible desktop browser (Firefox and anything Chromium-based). The &amp;ldquo;source code&amp;rdquo; can be found &lt;a href=&#34;https://github.com/ThomasRinsma/pdftris&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;As there was quite some feedback, I&amp;rsquo;ll share a bit more context here.&lt;/p&gt;&#xA;&lt;h2 id=&#34;why&#34;&gt;Why?&lt;/h2&gt;&#xA;&lt;p&gt;Why not? I learned a bit about PDF&amp;rsquo;s JavaScript API and its implementations and realized there might be just enough I/O possibility there for a simple game.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Ghostscript security research (write-up series)</title>
      <link>https://th0mas.nl/2024/10/31/ghostscript-security-research-write-up-series/</link>
      <pubDate>Thu, 31 Oct 2024 00:00:00 +0000</pubDate>
      <guid>https://th0mas.nl/2024/10/31/ghostscript-security-research-write-up-series/</guid>
      <description>&lt;p&gt;Through pentest work at Codean Labs, I found that Ghostscript is unexpectedly part of many attack surfaces, even server-side: applications that process user-submitted documents or images may invoke ImageMagick or LibreOffice for conversion, which in turn may call into Ghostscript for (embedded) EPS images.&lt;/p&gt;&#xA;&lt;p&gt;Hence, I went digging and found a bunch of memory corruption bugs, several logic bugs and a really fun format string bug. I was able to turn the latter into a nice privilege escalation exploit, bypassing Ghostscript&amp;rsquo;s &lt;code&gt;SAFER&lt;/code&gt; flag and thereby being able to invoke system commands. This results in RCE on server-side document conversion flows, but also in desktop cases when opening malicious documents/images.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Arbitrary JavaScript execution in PDF.js (write-up)</title>
      <link>https://th0mas.nl/2024/05/20/arbitrary-javascript-execution-in-pdf.js-write-up/</link>
      <pubDate>Mon, 20 May 2024 00:00:00 +0000</pubDate>
      <guid>https://th0mas.nl/2024/05/20/arbitrary-javascript-execution-in-pdf.js-write-up/</guid>
      <description>&lt;p&gt;I found a way to execute Javascript inside PDF.js from within an untrusted PDF. Real Javascript, not the sandboxed PDF version :)&lt;/p&gt;&#xA;&lt;p&gt;This had heavy consequences for many platforms rendering user-uploaded PDFs, lots of which use PDF.js, directly or indirectly (e.g. through react-pdf). Firefox itself &lt;a href=&#34;https://www.mozilla.org/en-US/security/advisories/mfsa2024-22/&#34;&gt;was also vulnerable&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Read the write-up on Codean Labs&amp;rsquo; blog: &lt;br&gt;&#xA;&lt;a href=&#34;https://codeanlabs.com/2024/05/cve-2024-4367-arbitrary-js-execution-in-pdf-js/&#34;&gt;https://codeanlabs.com/2024/05/cve-2024-4367-arbitrary-js-execution-in-pdf-js/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;This bug gained quite some attention in the bug bounty crowd, and ended up being voted nr. 7 in Portswigger&amp;rsquo;s &lt;a href=&#34;https://portswigger.net/research/top-10-web-hacking-techniques-of-2024&#34;&gt;top 10 web hacking techniques 2024&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>kb1: a fully DIY mechanical keyboard</title>
      <link>https://th0mas.nl/2024/04/18/kb1-a-fully-diy-mechanical-keyboard/</link>
      <pubDate>Thu, 18 Apr 2024 20:00:00 +0100</pubDate>
      <guid>https://th0mas.nl/2024/04/18/kb1-a-fully-diy-mechanical-keyboard/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;./full_centered.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Recently I&amp;rsquo;ve been learning more about electronics and PCB design, something I had no experience with up until recently. I wanted to challenge myself so I picked a relatively hard goal. This keyboard is the result of that. I call it &lt;code&gt;kb1&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;specs&#34;&gt;Specs&lt;/h2&gt;&#xA;&lt;p&gt;In short, it&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;is mechanically built using two PCBs with standoffs in between;&lt;/li&gt;&#xA;&lt;li&gt;has a proper &amp;ldquo;tenkeyless&amp;rdquo; layout, compatible with Cherry MX-style switches (my version has Kailh box crystal jades);&lt;/li&gt;&#xA;&lt;li&gt;has per-key RGB backlight using reverse-mounted SK6812 neopixels;&lt;/li&gt;&#xA;&lt;li&gt;features an old-school 16x2 character LED display, located between F6 and F7;&lt;/li&gt;&#xA;&lt;li&gt;has an obligatory &lt;em&gt;knob&lt;/em&gt; (rotary encoder);&lt;/li&gt;&#xA;&lt;li&gt;makes use of a Raspberry Pi Pico and &lt;a href=&#34;https://github.com/KMKfw/kmk_firmware&#34;&gt;KMK&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;See &lt;a href=&#34;https://github.com/ThomasRinsma/kb1&#34;&gt;the Github project&lt;/a&gt; for the firmware and PCB design files.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Overclocking a Gameboy Color using a Raspberry Pi Pico</title>
      <link>https://th0mas.nl/2023/12/28/overclocking-a-gameboy-color-using-a-raspberry-pi-pico/</link>
      <pubDate>Thu, 28 Dec 2023 13:13:00 +0100</pubDate>
      <guid>https://th0mas.nl/2023/12/28/overclocking-a-gameboy-color-using-a-raspberry-pi-pico/</guid>
      <description>&lt;p&gt;You might have seen &lt;a href=&#34;https://www.youtube.com/watch?v=nwJQxD8LLNY&#34;&gt;the classic Youtube video&lt;/a&gt; by &lt;a href=&#34;https://marcan.st&#34;&gt;marcan&lt;/a&gt; showing a Gameboy Color being overclocked to arbitrary frequencies, using an FPGA development board.&lt;/p&gt;&#xA;&lt;p&gt;Recently, I got hold of a GBC again and wanted to try this myself. I don&amp;rsquo;t have such an FGPA or a even a VCO, but I realized that the RP2040 on the Raspberry Pi Pico supports PWM at varying frequencies. Turns out, it indeed has a pretty wide frequency range, and it is trivial to connect it to a Gameboy.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Vulnerability write-up - &#34;Dangerous assumptions&#34;</title>
      <link>https://th0mas.nl/2023/02/24/vulnerability-write-up-dangerous-assumptions/</link>
      <pubDate>Fri, 24 Feb 2023 20:20:00 +0100</pubDate>
      <guid>https://th0mas.nl/2023/02/24/vulnerability-write-up-dangerous-assumptions/</guid>
      <description>&lt;p&gt;Last year, during a tangent for a project, &lt;a href=&#34;https://www.kevinvalk.nl/&#34;&gt;Kevin&lt;/a&gt; and I found a series of vulnerabilities in (combinations of) several Node.js packages that led to critical issues for our client, and most likely other users as well.&lt;/p&gt;&#xA;&lt;p&gt;It was a lot of fun learning about all the ways that logic in Javascript code like this can break, mostly by abusing its dynamic typing and oddities like &lt;code&gt;__proto__&lt;/code&gt;. All in all, this resulted in 6 CVEs in three different packages (&lt;a href=&#34;https://feathersjs.com/&#34;&gt;Feathers.js&lt;/a&gt;, &lt;a href=&#34;https://sequelize.org/&#34;&gt;Sequelize&lt;/a&gt; and &lt;a href=&#34;https://socket.io/&#34;&gt;Socket.IO&lt;/a&gt;).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Porting Doom to a payment terminal</title>
      <link>https://th0mas.nl/2022/07/18/porting-doom-to-a-payment-terminal/</link>
      <pubDate>Mon, 18 Jul 2022 10:00:00 +0100</pubDate>
      <guid>https://th0mas.nl/2022/07/18/porting-doom-to-a-payment-terminal/</guid>
      <description>&lt;figure class=&#34;right&#34;&gt;&lt;img src=&#34;https://th0mas.nl/2022/07/18/porting-doom-to-a-payment-terminal/vx820_doom_cropped.png&#34; width=&#34;300px&#34;&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;For the past half a year or so I have been playing around with a specific type of payment terminal, the VX820 from Verifone.&lt;/p&gt;&#xA;&lt;p&gt;I randomly bought a couple of second-hand devices, and found out that they are wonderful pieces of hardware with lots of potential for &lt;em&gt;alternative&lt;/em&gt; uses. I figured that a fun goal for myself would be to port Doom to it, which would nicely showcase the device&amp;rsquo;s unexpected computational power.&lt;/p&gt;</description>
    </item>
    <item>
      <title>dromaius: a C&#43;&#43; GameBoy emulator and debugger</title>
      <link>https://th0mas.nl/2021/04/25/dromaius-a-c-gameboy-emulator-and-debugger/</link>
      <pubDate>Sun, 25 Apr 2021 00:00:00 +0000</pubDate>
      <guid>https://th0mas.nl/2021/04/25/dromaius-a-c-gameboy-emulator-and-debugger/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;gui.png&#34; alt=&#34;Screenshot&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Over many years I kept coming back to this side-project: an emulator for the original Nintendo GameBoy (aka DMG). I believe I started by just parsing ROM files in C, then ended up following &lt;a href=&#34;https://imrannazar.com/series/gameboy-emulation-in-javascript&#34;&gt;Imran Nazar&amp;rsquo;s wonderful tutorial&lt;/a&gt;, and came back to it a couple more times in later years with ideas for GUI elements (&lt;em&gt;dear imgui&lt;/em&gt; is amazing) and debugging features.&lt;/p&gt;&#xA;&lt;p&gt;It&amp;rsquo;s quite buggy, but I&amp;rsquo;m calling it good enough. It served its purpose as a learning tool for me. Pokemon Red was my main benchmark; I did not play it to the end but it seems to work :)&lt;/p&gt;</description>
    </item>
    <item>
      <title>Exploiting a stack-based buffer overflow in practice</title>
      <link>https://th0mas.nl/2020/11/17/exploiting-a-stack-based-buffer-overflow-in-practice/</link>
      <pubDate>Tue, 17 Nov 2020 09:00:00 +0100</pubDate>
      <guid>https://th0mas.nl/2020/11/17/exploiting-a-stack-based-buffer-overflow-in-practice/</guid>
      <description>&lt;!-- tested on firmware V5.50(ABPY.1)b14) --&gt;&#xA;&lt;p&gt;In my &lt;a href=&#34;https://th0mas.nl/2020/03/26/getting-root-on-a-zyxel-vmg8825-t50-router/&#34;&gt;previous post&lt;/a&gt;, I detailed a fun method of obtaining root access on the Zyxel VMG8825-T50 router, which required physical access to the device and authenticated access to the web interface.&lt;/p&gt;&#xA;&lt;p&gt;In this post, I will detail the exploitation of a vulnerability that could potentially result in unauthenticated RCE as root, given LAN access only. This vulnerability was also found on the VMG8825-T50 router, but it turns out to be present in &lt;a href=&#34;https://www.zyxel.com/support/Zyxel-security-advisory-for-remote-code-execution-and-denial-of-service-vulnerabilities-of-CPE.shtml&#34;&gt;multiple other Zyxel devices&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Getting root on a Zyxel VMG8825-T50 router</title>
      <link>https://th0mas.nl/2020/03/26/getting-root-on-a-zyxel-vmg8825-t50-router/</link>
      <pubDate>Thu, 26 Mar 2020 08:43:00 +0100</pubDate>
      <guid>https://th0mas.nl/2020/03/26/getting-root-on-a-zyxel-vmg8825-t50-router/</guid>
      <description>&lt;figure class=&#34;right&#34;&gt;&lt;img src=&#34;https://th0mas.nl/2020/03/26/getting-root-on-a-zyxel-vmg8825-t50-router/device_front.png&#34; width=&#34;250px&#34;&gt;&lt;figcaption&gt;&#xA;      &lt;h4&gt;The device.&lt;/h4&gt;&#xA;    &lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;&lt;em&gt;&lt;strong&gt;Update (December 2020):&lt;/strong&gt; Several of the vulnerabilities mentioned in the post below have since been patched by Zyxel. In a &lt;a href=&#34;https://th0mas.nl/2020/11/17/exploiting-a-stack-based-buffer-overflow-in-practice/&#34;&gt;later&lt;/a&gt; post I detail a different vulnerability, which has also been fixed.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;My ISP recently provided me with a new router, the Zyxel VMG8825-T50. It seems to be a relatively new gigabit router with all kinds of capabilities. Sadly, some of them are locked down behind a somewhat restrictive web interface.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Rendering recursive portals with OpenGL</title>
      <link>https://th0mas.nl/2013/05/19/rendering-recursive-portals-with-opengl/</link>
      <pubDate>Sun, 19 May 2013 19:26:56 +0200</pubDate>
      <guid>https://th0mas.nl/2013/05/19/rendering-recursive-portals-with-opengl/</guid>
      <description>&lt;p&gt;For the last couple of months I&amp;rsquo;ve been working on and off on &lt;a href=&#34;https://github.com/ThomasRinsma/opengl-game-test&#34; title=&#34;GitHub project page of the OpenGL engine&#34;&gt;my C++/OpenGL &amp;ldquo;game engine&amp;rdquo;&lt;/a&gt;, mostly for the purpose of learning OpenGL. The feature I was the most excited about trying to implement in this engine was portal rendering. Actually understanding and implementing that correctly has taken me a little while but I feel like I know enough now to explain some of the concepts here.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Tetris Friends AI</title>
      <link>https://th0mas.nl/2012/12/24/tetris-friends-ai/</link>
      <pubDate>Mon, 24 Dec 2012 16:29:11 +0100</pubDate>
      <guid>https://th0mas.nl/2012/12/24/tetris-friends-ai/</guid>
      <description>&lt;p&gt;You might know the Facebook game called &amp;ldquo;Tetris Friends&amp;rdquo;. It&amp;rsquo;s basically just a flash version of tetris but with some added features like the ability to &amp;ldquo;hold&amp;rdquo; a block and to see multiple pieces in advance.&lt;/p&gt;&#xA;&lt;p&gt;About a year ago I started to wonder if I could make an AI for it, just like I did for my own implementation of Tetris. It would have to look at the rendered pixels of the webpage containing the flash object, use those to determine the current state of the game, and then send keystrokes to the web browser to provide new input.&lt;/p&gt;</description>
    </item>
    <item>
      <title>External publications</title>
      <link>https://th0mas.nl/publications/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://th0mas.nl/publications/</guid>
      <description>&lt;p&gt;A list of publications external to this site (hence, excluding articles original to this blog). Most entries link to a meta-post containing the external link(s) with some context.&lt;/p&gt;&#xA;&lt;h2 id=&#34;conference-talks&#34;&gt;Conference talks&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;em&gt;&lt;a href=&#34;https://th0mas.nl/2025/08/19/popping-an-alert-from-a-sandboxed-webassembly-module/&#34;&gt;Escaping a misleading &amp;ldquo;sandbox&amp;rdquo;: breaking the WebAssembly-JavaScript barrier&lt;/a&gt;&lt;/em&gt; (WHY2025)&lt;/li&gt;&#xA;&lt;li&gt;&lt;em&gt;&lt;a href=&#34;https://th0mas.nl/2022/07/18/porting-doom-to-a-payment-terminal/&#34;&gt;Payment terminals as general purpose (game-)computers&lt;/a&gt;&lt;/em&gt; (MCH2022)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;articles-and-papers&#34;&gt;Articles and papers&lt;/h2&gt;&#xA;&lt;p&gt;(in addition to original content on this blog itself)&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Article in Phrack 72&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;em&gt;&lt;a href=&#34;https://th0mas.nl/2025/08/19/popping-an-alert-from-a-sandboxed-webassembly-module/&#34;&gt;Popping an alert from a sandboxed WebAssembly module&lt;/a&gt;&lt;/em&gt; (Phrack 72, 2025)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Write-ups for Codean Labs research&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;em&gt;&lt;a href=&#34;https://th0mas.nl/2025/06/15/spoofing-openpgp.js-signature-verification-write-up/&#34;&gt;CVE-2025-47934 – Spoofing OpenPGP.js signature verification&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;em&gt;&lt;a href=&#34;https://th0mas.nl/2025/02/12/exploiting-libreoffice-write-up/&#34;&gt;Exploiting LibreOffice (CVE-2024-12425 and CVE-2024-12426)&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;em&gt;&lt;a href=&#34;https://th0mas.nl/2024/05/20/arbitrary-javascript-execution-in-pdf.js-write-up/&#34;&gt;CVE-2024-4367 – Arbitrary JS execution in PDF.js&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;em&gt;&lt;a href=&#34;https://th0mas.nl/2024/10/31/ghostscript-security-research-write-up-series/&#34;&gt;CVE-2024-29510 – Exploiting Ghostscript using format strings&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;em&gt;&lt;a href=&#34;https://th0mas.nl/2024/10/31/ghostscript-security-research-write-up-series/&#34;&gt;CVE-2024-29511 – Abusing Ghostscript&amp;rsquo;s OCR device&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;em&gt;&lt;a href=&#34;https://th0mas.nl/2024/10/31/ghostscript-security-research-write-up-series/&#34;&gt;Ghostscript wrap-up: overflowing buffers&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;em&gt;&lt;a href=&#34;https://th0mas.nl/2023/02/24/vulnerability-write-up-dangerous-assumptions/&#34;&gt;Vulnerability write-up: Dangerous Assumptions&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Academic writing&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arxiv.org/abs/1703.00298&#34;&gt;&lt;em&gt;Automatic Library Version Identification, an Exploration of Techniques&lt;/em&gt;&lt;/a&gt; (research paper, 2017, arXiv)&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://th0mas.nl/downloads/thesis/thesis.pdf&#34;&gt;&lt;em&gt;Seeing through obfuscation: interactive detection and removal of opaque predicates&lt;/em&gt;&lt;/a&gt; (Master&amp;rsquo;s thesis, 2017, pdf)&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://th0mas.nl/downloads/bscthesis/bscthesis.pdf&#34;&gt;&lt;em&gt;University Card security&lt;/em&gt;&lt;/a&gt; (Bachelor&amp;rsquo;s thesis, 2015, pdf)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
  </channel>
</rss>
