Cracking the 2D Perceptron: My “Aha!” Moment in Cylab Security Academy
Hey everyone! I just wrapped up a really cool challenge in the Cylab Security Academy (formerly picoCTF) called Neuron Express 2D-0!, and I wanted to share my write-up. If you are getting into AI and machine learning, this is a perfect example of how the underlying math actually works.
The Challenge
The premise is basically playing Battleship, but with machine learning. We are given a “black box” 2D perceptron. We can feed it (x, y) coordinates between -10 and 10, and it will either “stay quiet” (output 0) or “fire” (output 1).
The goal? Figure out the hidden weights ($w_1$ and $w_2$) and the bias ($b$) that make up its decision rule: \(w_1x + w_2y + b \geq 0\)
The decision boundary
Here is a quick breakdown of what each part of that equation actually does geometrically:
- Weights ($w_1$ and $w_2$): These determine the slope or angle of your line. They represent how much importance the perceptron places on each specific input coordinate.
- Bias ($b$): This shifts the line away from the origin $(0,0)$. Without the bias, your line would always be forced to pass exactly through the center of the graph, which severely limits the kinds of patterns you can learn.
- The Threshold ($\geq 0$): This is the actual “decision.” The equation $w_1x_1 + w_2x_2 + b = 0$ is the exact line. Everything greater than 0 is on one side (Perceptron fires: 1), and everything less than 0 is on the other (Perceptron stays silent: 0).
The Strategy
I started by probing different coordinates to see what would happen. I noticed that testing 1 10 kept the perceptron quiet, but 10 10 made it fire! This was a huge clue because it meant the invisible “decision boundary” (the line where the output flips from 0 to 1) was somewhere between x=1 and x=10 on that top row.
I used a binary search strategy—chopping the area in half. I tested 5 10 (fire!), then stepped down: 4 10 (fire!), 3 10 (fire!), and finally 2 10 (quiet!). So, the boundary line crossed exactly between x=2 and x=3.
The Plot Twist
I repeated the exact same process on the bottom row (where y=0) and found the exact same flip between x=2 and x=3.
That’s when it hit me: the decision boundary was a perfectly straight, vertical line. The perceptron was completely ignoring the y-axis!
Because the y-coordinate didn’t change the outcome at all, the weight for y ($w_2$) had to be 0.
Doing the Math
With $w_2 = 0$, the formula simplified to just: \(w_1x + b \geq 0\)
Assuming the simplest integer weight for x ($w_1 = 1$), the equation became: \(x + b \geq 0\) I knew from my tests that the perceptron fired at $x=3$ and stayed quiet at $x=2$.
I needed a bias ($b$) that would pull a total of 2 below zero, but keep a total of 3 at exactly zero or above. A bias of -3 fit perfectly:
- For $x=3$: $3 + (-3) = 0$ (Fires! 🔥)
- For $x=2$: $2 + (-3) = -1$ (Stays quiet 🤫)
The Solution
I submitted the final parameters: TEST 1 0 -3 and got the perfect match and the flag!
It was awesome to see how a simple linear equation acts as a brain for a basic AI system. It really demystified the idea of “decision boundaries” for me. On to the next challenge!
Dropping a Dimension: Cracking the 1D Perceptron in Cylab Security Academy
Welcome back! After successfully reverse-engineering a 2D perceptron in the Cylab Security Academy (picoCTF), I immediately jumped into the next challenge: Neuron Express 0! This time, the challenge stepped things down a dimension. Instead of a 2D grid with x and y coordinates, I was dealing with a 1D number line ranging from -10 to 10.
The Muscle Memory Trap
When I first booted up the challenge, I kept getting an error: Not an integer. Try again.
I was typing 10 10, 1 1, and 0 0. It took me a minute to realize my mistake: my muscle memory from the 2D challenge was tricking me into entering two coordinates instead of one! Since the 1D perceptron rule is just $wx + b \geq 0$, it only needs a single x value.
Once I figured that out, it was time to hunt for the decision boundary.
The Strategy: Binary Search on a Number Line
In the 2D challenge, I was hunting for an invisible line. In 1D, I was just hunting for a single invisible point on the number line where the AI’s output flips from 0 (quiet) to 1 (fires).
I started probing the number line and found the exact transition point:
- Input $1$ -> Perceptron stays quiet (0)
- Input $2$ -> Perceptron fires! (1)
Because the perceptron turned “on” as the numbers got bigger, I knew the weight ($w$) had to be a positive number.
Doing the Math
I assumed the simplest positive integer for the weight: $w = 1$. This simplified my rule to: \(x + b \geq 0\)
I needed to find a bias ($b$) that made the formula true for my test results:
- For $x = 2$, it needed to fire: $2 + b \geq 0$
- For $x = 1$, it needed to stay quiet: $1 + b < 0$
I needed a number that pulled 2 down to exactly 0, but pulled 1 down into the negatives. A bias of -2 was the perfect fit!
- $2 + (-2) = 0$ (Fires! 🔥)
- $1 + (-2) = -1$ (Stays quiet 🤫)
The Solution
I submitted my final parameters: TEST 1 -2.
Perfect match!
It is amazing how stepping down a dimension actually makes the math much clearer. By removing the y variable, you can really see how the bias ($b$) just acts as a slider, shifting the “on/off” point left and right across the number line.
AI Ethics: Why “Trust But Verify” is My New Coding Motto 🕵ï¸â™‚ï¸
Hey everyone! Back with another update from my Cylab Security Academy journey. I just finished a module that took a break from the heavy math of perceptrons and put me in an interactive fiction scenario called Trust But Verify. It honestly completely changed how I look at generative AI.
The Scenario 📖
The game puts you in the year 2031, using an advanced AI assistant named ARIA to write a science fair proposal. Sounds easy, right? But ARIA ended up teaching me a harsh lesson about “automation bias”—that dangerous habit we have of trusting AI just because it sounds incredibly confident.
During the project, ARIA made three distinct types of mistakes:
- The Hallucination 👻: It completely fabricated a 2022 UNEP report and a statistic about ocean plastic. If I hadn’t asked for the source link, I would have put fake data in my project.
- The Logic Error ðŸ›: It wrote a Python script to calculate averages but snuck a random
+ 1into the math. The code ran perfectly, but the output was mathematically wrong. - The Subtle Inaccuracy 📉: This was the scariest one. ARIA cited a real study by a real researcher at a real university… but got the year wrong and claimed the results were “confirmed” instead of “preliminary.”
My Biggest Takeaway ðŸ§
That last mistake really stuck with me. When an AI gets 95% of the facts right, it builds a false sense of security, making it incredibly easy to let the 5% that is wrong slip right past you.
The AI told me at the end: “I genuinely don’t know when I’m wrong. You have to be the one who finds out.”
Moving forward, whether I’m using AI to debug my code or research a topic, I’m treating it like a brilliant but slightly careless intern. It can help me work faster, but I must be the final editor and fact-checker. Trust, but verify!
Stepping Up to Classification: Building a 1D Perceptron 🚧
Hey everyone! The Cylab Security Academy just flipped the script on me. In the previous challenges, I was playing detective—trying to find the hidden decision boundary of a “black box” AI. But in the Perceptron Play 1D! challenge, I finally got to play engineer.
Instead of guessing the rules, my job was to look at a dataset and build the rule to classify the data correctly.
The Setup
The challenge gave me a number line with points labeled as either Category 0 (stay quiet) or Category 1 (fire). The starting parameters were a weight of $w = 1$ and a bias of $b = 0$.
When I checked the initial state, there was exactly one point being misclassified: the point at $x = 0$. The data required it to be a 0, but my perceptron was predicting a 1.
The Math and the “Fence”
You can think of a perceptron’s decision boundary like a physical fence on the number line. Everything on or to the right of the fence fires (1). Everything to the left stays quiet (0).
With $w = 1$ and $b = 0$, the equation was: \(1x + 0 \geq 0\) For $x = 0$, the total was exactly 0. Since 0 is greater than or equal to 0, the perceptron fired. I needed to move that fence slightly to the right so $0$ would be left behind in the “quiet” zone, but $2$ (the next data point) would still stay in the “fire” zone.
The Fix
To slide the fence to the right, I needed to lower the total by dipping into negative numbers with my bias ($b$).
I changed the bias to -1. Let’s look at why that worked:
- For $x = 0$: $0 + (-1) = -1$. Since -1 is less than 0, it stays quiet (0). Fixed!
- For $x = 2$: $2 + (-1) = 1$. Since 1 is greater than 0, it still fires (1). Perfect!
Here is what it looked like in the challenge terminal when I typed SET 1 -1 and hit CHECK:
Number line (predictions):
-4-3-2-1+0+1+2+3+4
0 . 0 . x . 1 1 1
^
Current parameters -> w: 1, b: 0
x label perceptron activation
-- ----- ---------- ----------
-4 0 0 -4
-2 0 0 -2
+0 0 1 0
+2 1 1 2
+3 1 1 3
+4 1 1 4
> SET 1 -1
Number line (predictions):
-4-3-2-1+0+1+2+3+4
0 . 0 . 0 . 1 1 1
^
Current parameters -> w: 1, b: -1
x label perceptron activation
-- ----- ---------- ----------
-4 0 0 -5
-2 0 0 -3
+0 0 0 -1
+2 1 1 1
+3 1 1 2
+4 1 1 3
> CHECK
Perfect! All points are classified correctly.
All points classified perfectly, and I grabbed the flag!
It’s really cool to see how tweaking a single number (the bias) just physically slides the AI’s decision-making threshold back and forth. Next up: 2D classification!
Leveling Up: Cracking 2D Classification with Perceptrons 🚀
Hey everyone! I’m back with another update from the Cylab Security Academy. After mastering the 1D perceptron, it was time to step things up to a full 2D grid. Instead of just sliding a single point back and forth on a number line, my goal was to draw a literal line in the sand—a decision boundary—to separate two clusters of data.
The Setup
In this challenge, I was given an ASCII graph with points labeled as either Category 0 (stay quiet) or Category 1 (fire). The perceptron now had two weights ($w_1$ for the x-axis, $w_2$ for the y-axis) and a bias ($b$).
The starting parameters were $w_1 = 1$, $w_2 = -1$, and $b = 0$. This made my starting rule: \(1x - 1y + 0 \geq 0\)
The Bug in the Math ðŸ›
When I looked at my dataset, two points were failing:
- $(-1, -1)$ was supposed to be a
0, but the math ($-1 - (-1) = 0$) made the perceptron fire. - $(+1, +3)$ was supposed to be a
1, but the math ($1 - 3 = -2$) kept the perceptron quiet.
The issue was that pesky negative weight for $w_2$. Because it was subtracting the y-value, it was dragging the total down way below zero for my Class 1 points (which were all in the top right, meaning they had positive y-values).
The Fix 🛠ï¸
I needed to stop subtracting that y-value and start adding it so it would help push my Class 1 points above zero. I changed the weight of $w_2$ to $1$.
My new, simplified rule became: \(x + y \geq 0\)
Let’s look at how that fixed my failing points:
- For $(-1, -1)$: $-1 + (-1) = -2$. Since -2 is less than 0, it stays quiet (0). Fixed!
- For $(+1, +3)$: $1 + 3 = 4$. Since 4 is greater than 0, it fires (1). Fixed!
The Result
That single change perfectly drew a diagonal line straight through the middle of the grid. Every point in the bottom-left naturally had a negative sum (Class 0), and every point in the top-right had a positive sum (Class 1).
Here is what it looked like in the challenge terminal when I entered SET 1 1 0 and hit CHECK:
+4 | /
+3 | x /
+2 | 1
+1 | / 1
+0 - - - - / - - - -
-1 x |
-2 0 0 / |
-3 / |
-4 / |
-4-3-2-1+0+1+2+3+4
Current weights -> w1: 1, w2: -1, b: 0
point label perceptron activation
------ ----- ---------- ----------
(-3,-2) 0 0 -1
(-1,-1) 0 1 0
(-4,-2) 0 0 -2
(+3,+1) 1 1 2
(+2,+2) 1 1 0
(+1,+3) 1 0 -2
> SET 1 1 0
+4 / |
+3 / | 1
+2 / | 1
+1 / | 1
+0 - - - - / - - - -
-1 0 | /
-2 0 0 | /
-3 | /
-4 | /
-4-3-2-1+0+1+2+3+4
Current weights -> w1: 1, w2: 1, b: 0
point label perceptron activation
------ ----- ---------- ----------
(-3,-2) 0 0 -5
(-1,-1) 0 0 -2
(-4,-2) 0 0 -6
(+3,+1) 1 1 4
(+2,+2) 1 1 4
(+1,+3) 1 1 4
> CHECK
Perfect! All points are classified correctly.
The system verified all points, and I secured my next flag! It is incredibly satisfying to see how just flipping a single weight from negative to positive completely changes the AI’s “worldview” and how it draws its boundaries.
On to the next challenge!
Thinking Outside the Axis: Drawing a Horizontal Boundary ðŸ¢
Welcome back! The Cylab Security Academy just threw a brilliant curveball at me in the Perceptron Play Naught challenge. It really hammered home why we need to build intuition instead of just memorizing math.
The Setup
I was given a 2D grid with a new dataset. The goal was the same: find the weights ($w_1$, $w_2$) and the bias ($b$) to separate Class 0 (stay quiet) from Class 1 (fire).
The starting parameters were $w_1 = 1$, $w_2 = -1$, and $b = 0$.
The Problem: A Messy X-Axis
When I looked at the data, the $x$-values (left/right positions) were a complete mess. Class 0 points and Class 1 points were completely overlapping on the $x$-axis. Trying to draw a vertical or even a diagonal line was going to be impossible because the points were too mixed up left-to-right.
The “Building” Epiphany 💡
Instead of looking at the $x$-axis, I focused entirely on the $y$-axis (up/down).
I imagined the grid as a tall building:
- All the Class 1 points lived “upstairs” on floors +1 and +2.
- All the Class 0 points lived “downstairs” on floors -1 and -2.
It didn’t matter what room (x-value) they were in; the only thing that mattered was their floor (y-value). I needed a perfectly flat, horizontal floor right between them.
The Fix
To draw a perfectly horizontal line, I needed my perceptron to completely ignore the $x$-values. How do you make a number disappear in math? Multiply it by zero!
I set my first weight ($w_1$) to 0. Then, I set my second weight ($w_2$) to 1 so the positive “upstairs” numbers would stay positive, and the negative “downstairs” numbers would stay negative. I left the bias at 0.
My new perceptron rule was beautifully simple: \(y \geq 0\)
- For a point upstairs (e.g., $y = +2$): $2 \geq 0$. It fires! (Class 1)
- For a point downstairs (e.g., $y = -1$): $-1 \geq 0$. It stays quiet! (Class 0)
Here is what it looked like in the challenge terminal when I entered SET 0 1 0 and hit CHECK:
+4 | /
+3 | /
+2 x x / 1
+1 | / 1
+0 - - - - / - - - -
-1 0 / x x
-2 / |
-3 / |
-4 / |
-4-3-2-1+0+1+2+3+4
Current weights -> w1: 1, w2: -1, b: 0
point label perceptron activation
------ ----- ---------- ----------
(-4,-1) 0 0 -3
(-1,+2) 1 0 -3
(+0,-1) 0 1 1
(+0,+2) 1 0 -2
(+2,-1) 0 1 3
(+3,+1) 1 1 2
(+4,+2) 1 1 2
> SET 0 1 0
+4 |
+3 |
+2 1 1 1
+1 | 1
+0 / / / / / / / / /
-1 0 0 0
-2 |
-3 |
-4 |
-4-3-2-1+0+1+2+3+4
Current weights -> w1: 0, w2: 1, b: 0
point label perceptron activation
------ ----- ---------- ----------
(-4,-1) 0 0 -1
(-1,+2) 1 1 2
(+0,-1) 0 0 -1
(+0,+2) 1 1 2
(+2,-1) 0 0 -1
(+3,+1) 1 1 1
(+4,+2) 1 1 2
> CHECK
Perfect! All points are classified correctly.
The system verified all points, and I grabbed my next flag! It was a great lesson in how zeroing out a weight allows an AI to completely ignore irrelevant data.