<feed xmlns="http://www.w3.org/2005/Atom"> <id>/</id><title>brew's writeups</title><subtitle></subtitle> <updated>2026-03-09T05:54:31+00:00</updated> <author> <name>bytebrew</name> <uri>/</uri> </author><link rel="self" type="application/atom+xml" href="/feed.xml"/><link rel="alternate" type="text/html" hreflang="en" href="/"/> <generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator> <rights> © 2026 bytebrew </rights> <icon>/assets/img/favicons/favicon.ico</icon> <logo>/assets/img/favicons/favicon-96x96.png</logo> <entry><title>Easy Shellcoding</title><link href="/posts/Easy-Shellcoding/" rel="alternate" type="text/html" title="Easy Shellcoding" /><published>2025-11-18T00:00:00+00:00</published> <updated>2025-11-20T01:02:44+00:00</updated> <id>/posts/Easy-Shellcoding/</id> <content type="text/html" src="/posts/Easy-Shellcoding/" /> <author> <name>bytebrew</name> </author> <category term="Amateurs-2025" /> <summary>Overview The challenge itself is pretty small: #!/usr/bin/python3 from capstone import * from capstone.x86 import X86Op, X86_OP_IMM import os ALLOWED_MNEMONICS = ["jmp", "add", "mov", "sub", "inc", "dec", "cmp", "push", "pop", "int3"] shellcode = b"\xbc\x00\x70\x76\x06" + bytes.fromhex(input("shellcode: ")) + b"\xcc" if len(shellcode) &amp;gt; 0x1000: exit("too long") cs = Cs(CS_ARCH_X86, C...</summary> </entry> <entry><title>ELF Capsule</title><link href="/posts/ELF-Capsule/" rel="alternate" type="text/html" title="ELF Capsule" /><published>2025-07-28T00:00:00+00:00</published> <updated>2025-08-01T05:25:22+00:00</updated> <id>/posts/ELF-Capsule/</id> <content type="text/html" src="/posts/ELF-Capsule/" /> <author> <name>bytebrew</name> </author> <category term="UIUCTF-2025" /> <summary>In this writeup I analyze a riscv64 kernel that contains a VM and a process executed in userland. This process utilizes invalid reads/writes in order to trigger the VM. I construct a disassembler and instruction logger, disassemble the userland program’s VM calls, decompile the checks to python, and transcribe them into z3 constraints. Kernel Analysis This is a riscv64 kernel that executes a...</summary> </entry> <entry><title>Better Packet Filter</title><link href="/posts/Better-Packet-Filter/" rel="alternate" type="text/html" title="Better Packet Filter" /><published>2025-06-10T00:00:00+00:00</published> <updated>2025-08-01T05:50:02+00:00</updated> <id>/posts/Better-Packet-Filter/</id> <content type="text/html" src="/posts/Better-Packet-Filter/" /> <author> <name>bytebrew</name> </author> <category term="USCG-2025" /> <summary>Better Packet Filter is an arm64 kernel module that runs a custom VM with a user-supplied program to filter “packets” that are placed in a file. In this writeup, I analyze the VM and construct a program that leaks bits from /flag.txt. Overview We are tasked with reverse engineering a kernel module and leaking the flag (placed at /flag.txt). We are given shell access to an Alpine image as a u...</summary> </entry> <entry><title>Is it data or data?</title><link href="/posts/Is-it-data-or-data/" rel="alternate" type="text/html" title="Is it data or data?" /><published>2025-05-10T00:00:00+00:00</published> <updated>2025-08-01T05:22:11+00:00</updated> <id>/posts/Is-it-data-or-data/</id> <content type="text/html" src="/posts/Is-it-data-or-data/" /> <author> <name>bytebrew</name> </author> <category term="DamCTF-2025" /> <summary>This challenge requires a sequence of instructions that produces a target output. Initial Analysis This is an x86-64 ELF coded in C++. The main function contains a loop that prints the flag once the loop is broken. { char i; do { if (!set_7th_char_to_g()) { char j; do j = input_and_mut...</summary> </entry> <entry><title>Sheriff Says</title><link href="/posts/Sheriff-Says/" rel="alternate" type="text/html" title="Sheriff Says" /><published>2025-04-05T00:00:00+00:00</published> <updated>2025-08-01T05:27:45+00:00</updated> <id>/posts/Sheriff-Says/</id> <content type="text/html" src="/posts/Sheriff-Says/" /> <author> <name>bytebrew</name> </author> <category term="PlaidCTF-2025" /> <summary>This is a Golang LSP server that we have to reverse engineer in order to find commands that allow us to read the flag. Due to protections the flag can not be directly read, but a race condition can be used as a bypass. Overview The README.md says: Use Neovim `nvim -u ./init.lua &amp;lt;file.go&amp;gt;` After launching the binary and opening a file with nvim -u ./init.lua &amp;lt;file.go&amp;gt;, the serve...</summary> </entry> </feed>
