We're sponsoring PlaidCTF this year at Zellic. This is a lifelong dream of mine. Thank you so much to the organizers for putting on such an excellent CTF each year!
PlaidCTF will be running starting this Friday. Sign up here: plaidctf.com
Cheers!
We're sponsoring PlaidCTF this year at Zellic. This is a lifelong dream of mine. Thank you so much to the organizers for putting on such an excellent CTF each year!
PlaidCTF will be running starting this Friday. Sign up here: plaidctf.com
Cheers!
[0,9,15,2,1,4,3,8,10,5,13,11,14,6,7,12,0]
And if we feed this into the challenge, we actually get our flag!
[0,9,15,2,1,4,3,8,10,5,13,11,14,6,7,12,0]
And if we feed this into the challenge, we actually get our flag!
Here's a screenshot from the Binary Ninja plugin
@hgarrereyn.bsky.social independently wrote as part of his solve.
Here's a screenshot from the Binary Ninja plugin
@hgarrereyn.bsky.social independently wrote as part of his solve.
Again, keep in mind every name here used to be the name of a fish🫠 This is all manually renamed
Again, keep in mind every name here used to be the name of a fish🫠 This is all manually renamed
RISC processors often fetch operand values during the instruction decode stage, and that's what's going on here.
RISC processors often fetch operand values during the instruction decode stage, and that's what's going on here.
But then my heart sank when I saw this.
Can you guess what this does?
But then my heart sank when I saw this.
Can you guess what this does?
Well...using a full adder of course :-)
Well...using a full adder of course :-)
To make this concrete, let me give an example.
Correct computations typecheck!
To make this concrete, let me give an example.
Correct computations typecheck!
Then they use Car and Cdr with tail recursion to accomplish iteration. This is how they check if two binary numbers are equal:
Then they use Car and Cdr with tail recursion to accomplish iteration. This is how they check if two binary numbers are equal:
Here's how Car and Cdr work. Given a pair (tuple of 2 elements), Car gives you the first element. Cdr gives you the second element.
Can you see how it works?
Here's how Car and Cdr work. Given a pair (tuple of 2 elements), Car gives you the first element. Cdr gives you the second element.
Can you see how it works?
Swordfish is true, Ponyfish is false, and Dogfish is an algebraic type that must satisfy both True and False; e.g., the null type never.
We can check this in a REPL:
Swordfish is true, Ponyfish is false, and Dogfish is an algebraic type that must satisfy both True and False; e.g., the null type never.
We can check this in a REPL:
Let's try sorting all the lines by length, shortest to longest. That should put the simplest definitions first, so we can reverse it from the bottom up.
Let's try sorting all the lines by length, shortest to longest. That should put the simplest definitions first, so we can reverse it from the bottom up.
It's a huge pile of Typescript. Everything is named after a fish.
The catch? There's no code, only types. How do they perform computation using just the type system?
(Spoiler: Circuits!)
It's a huge pile of Typescript. Everything is named after a fish.
The catch? There's no code, only types. How do they perform computation using just the type system?
(Spoiler: Circuits!)