Showing posts with label Advice. Show all posts
Showing posts with label Advice. Show all posts

Saturday, October 11, 2025

How Computers Think: A Liars Walk Through x86 Assembly

 

                                                                                    So, yeah. The artist found out about digital art.
 
 

"To teach is to lie."

 

A few days ago I promised to talk a bit about a simple Assembly program.

And talk I shall!

First off, let's just get out of the way what that code is doing:

It takes any number of integer positive values as parameters and adds them.

So, if you run the program with ./<program_name> 40 2 (which we shall in a bit) it will print out the answer:



If this were a Python program, it would be simple as can be. But Python is withholding from you a lot of what is happening behind the scenes. And we want none of that. We want to see stuff as it is happening.

 

First of all, a couple of disclaimers:

- This code isn't as simple as it could be. It's in fact part of a series of lessons I'm going through in order to review and solidify my ASM and debugging knowledge.  They are part of a NASM tutorial (ASMtutor), which I highly advise — it's quite carefully made, without major errors (very common in basic ASM stuff) and which guides you in a smooth manner towards greater knowledge. You can find it here.
- The code I'm using can be found here.

- To create a compiled binary of this code, in particular of the files functions_v1.asm and 13_atoi.asm, you need to download those two files and run: 

nasm -f elf 13_atoi.asm

ld -m elf_i386 13_atoi.o -o atoi

 This will create an executable named atoi, which you can then run as explained before.

- You should know a bit about binary and hexadecimal. Please take a quick gander at this. Knowing how to quickly translate between them will really help to inspect the debugger.
- And speaking of which, I'll be using GDB with GEF and I advise you to do so as well. If you already rock on GDB you probably don't need it. But then again, I highly doubt you'll be reading this if you already have mastered GDB. 

As for GEF, it will make the debugger much more pleasing to the eyes, and your code easier to follow.
- To finally start the debugger (GEF) with our program, we'll run:



- My focus isn't a 'deep dive' into Assembly. I want to give you the very basic and essential tools to be able to go through this code, instruction by instruction and be able to understand how the computer is 'thinking'. In order to do that, I'll give you some basic tools.

- Speaking of which, here is a pdf with the few commands and concepts you'll refer to in order to be able to follow through the code.
- Functions in Assembly are interesting. You can call a function or jump into a function (check the PDF), but also can just enter a function because you're going through the code flow and there is no call, no jump (or there isn't a reason to jump). So, for example, in this case:

You have here a comparison and you are checking if eax is equal to 0, when you do cmp eax, 0. Then you have a jump not zero. If eax is NOT zero, then you jump elsewhere to the function divideLoop. But if eax IS in fact zero, then you just move along that grocery shopping list to the next item on the list. Therefore, you enter the function printLoop and decrease ecx by 1. 

 

On the other hand if printLoop actually had a dot behind it (.printLoop) it would be a function inside of whatever function we are in, and couldn't be called from outside of that function. If in doubt, dig a little deeper into Assembly. 

- You might also need a quick contextual/theoretical rundown, so here it goes:

Assembly is the lowest level code you can have that is still human-readable. Below it is the world of ones and zeroes, and above it the world of different programming languages and their way to read and write programs.

In assembly, we're working in the so-called User Space, but sometimes we need to give control to the Operating System through system calls. To do that, we use interrupts (Here is a link to a nice Linux system call table. If you use Windows we can't be friends, sorry). You won't really need that table in order to follow along and read the code, but it sure helps. We only use two syscalls in this code — one for writing to the terminal, and another to exit cleanly. (look up: do the registers change after the OS is done with them?).

When the syscall happens, the OS takes control of the program, and uses the stack and your registers. After that, you cannot be 100% sure of how all registers will be, so if it matters to you, like what happens in other situations, make sure you save those registers into the stack and get them back after the OS lets go of control and returns it to User space.

 

There are a couple of bitwise operations - basically XOR ('exclusive or'). To learn more about bitwise operators, check this page. And if you like computer games and are even slightly interested in electronics or logic, then take a gander at this game. It's great fun.

But, again, you don't have to jump into bitwise operations to read this code. Just do a mental substitution. Whenever you see, for example xor eax, eax it's basically the same as taking zero and placing it in the register eax or, in other words, doing mov eax, 0

Learn boolean logic, bitwise operations, and everything else because you want to and because its fun. :) 

 

What is a register? What is the Stack? You probably heard about those two terms before. Here's a very quick and dirty analogy:

Imagine you're sitting at a desk and I'm telling you to remember things, like a name, then a number, then an address, then another name. Sure, you can do it for a while. Your short term memory will be able to memorize some stuff before it's too much stuff to handle. Those places where you're storing this easy-to-remember, short-term memory stuff are the registers. Registers are temporary containers for fast memory access. Incredibly fast memory access. A bit like short-term variables on steroids.

But what if I start giving you too much stuff to remember? Then you are allowed to write whatever information I tell you on small pieces of paper, as long as you store them properly on a receipt-spike (also known as an order-spike). You've seen them before in restaurants. Something like this:
 

                          Analogies R Us: each strip of paper a memory location, an integer, etc
 
This stack, or this order-spike, uses a LIFO system, meaning Last In First Out. Whatever last piece of paper with information you have pushed into that pile, is the last one you can pop out and examine.

Neat, no? So, you can store x amount of things for very quick access inside those registers, and you can push whatever you can't hold in quick access memory into that pile, and then you can take it our and again place it in a register if you so wish (actually, you push copies of those values — the originals remain in registers unless you clear them).

All that I've said so far is to be taken with a pinch of salt. Not only because these last bits are an analogy, but because, like I said in the beginning, to teach is to lie. I have to omit stuff in order to let you do some progress.

Imagine us teaching Math in class and instead of telling kids all over the world that you can't divide by zero, we instead said, there are several instances in mathematics where dividing by zero is perfectly sensible, and then described said instances. Can you imagine the faces of those 7th graders? Nothing would be retained.

By lying to them, they learn a useful rule and important aspect of mathematics, and when they advance in their mathematical careers, they get to learn at least of one way to actually divide by zero.

It's the same here. I'm skimming a lot of fat in order to draw an understandable picture, and to let you (if you so wish) take your first steps in Assembly, which I truly love.

Got any questions? Stuff you don't understand? Stuff you'd like to see? Shoot them in my general direction. Search on Google, use an LLM ("gulp, LLMs?! But aren't they the devil?". Look, I was here when Wikipedia first came up and academia was having a fit over it. I also survived using AltaVista back in the 90s. You'll do fine with LLMs and live to tell the tale).

As I've shown in one of the pictures above, we'll be using our program to add 40 to 2 and to find out the Answer to the Ultimate Question of Life, the Universe, and Everything.

I won't go through the whole code. It would serve little purpose and, besides, you need to walk the walk.


                                                     Ah, Jayne... you look young.
 

 So, back to business!

 

You need to:

- download the two .asm files;

- compile them into a binary file;

- install GEF (GDB probably already installed);

- download the PDF with some information;

- Run GDB and check what happens to the Registers and to the Stack as you step into the program.

 

And that's it! We got a party going.

 

Ok, let's pretend anyone is actually reading this and actually is inspecting the program with the debugger. You run the code in terminal to open the debugger, then when it opens, you write start and press enter.
What might you be seeing at this point in time? Something like this:


                                        Already regretting your very recent life decisions? Don't! This stuff is fascinating.


What a bloody mess! I know. Don't worry. The first time I started looking at this I was pretty confused as well. But let's first try to get some 'unhelpful' information out of the way (ahem, teaching is lying) and focus on the meat of this and at what we'll be focusing on exclusively. So, clean-up time!

 

                                       Some breathing room, at last!
 

Aha, so what do we have here?

We have 3 different screens:

- Registers

- Stack

- Code

 

Lucky us! Because that's exactly what we want to follow as we're moving along our code. Let's start with the registers. If you've looked at your PDF, you'll see the stars of our show there. 

Register Screen:

esp is the stack pointer and it is always pointing to the top of the stack. It's not holding the value at the top of the stack, which is the value 3, but it's holding the value 0xffffd0f0.

Huh.. interesting. If you look at the menu below, you'll see that that's the exact stack address of its topmost value. Memory position 0xffffd0f0 is the topmost piece of paper (like its identifier) and in it we have written the value 3 (more on why 3 later). Everything else we care about is (apparently) 0 for now, so let's move on.

Stack Screen:

Remember that pile of papers stuck at the order-spike? This is it.
 Here's an example of one of these lines:

0xffffd0f8│+0x0008: 0xffffd2e0  →  0x32003034 ("40"?)

Let me explain it to you. 

0xffffd0f8  memory location in the Stack. This is represented in 4 byte intervals, since we're in a 32 bit program

+0x0008  Memory offset from the top of the stack. This means that we're in a position 8 bytes above the position of the top of the stack (0xffffd0f0). As we add stuff to the stack the memory values go down. This is an important quirk that you would do good in remembering. Also note that while this has the stack facing upwards, sometimes you'll see it upside down (which makes the memory values 'growing' down appear to be a bit less strange).

0xffffd2e0  What is stored in that stack position (our piece of paper). In this case it is a pointer to a string. That string is '40'. So, in other words, there is a location in memory that is storing the string '40' and in this stack there is a pointer pointing to the first character of that string, or '4'. Read on, it will be made somewhat clearer. You don't need to know in depth what are pointers, etc to be able to read this program, but knowing these things de-mystifies them plenty and makes your life easier and more enjoyable. 

(bonus cookie points for you if you can explain why, as you go up in the stack you go from  0xffffd2e3 to 0xffffd2e0, a small 3 byte jump, and then follow with a big big jump from 0xffffd2e0 to 0xffffd2a5 a 59 byte-sized jump)

0x32003034  Well, I see a 40 and the beginning of a 2. :) Let me explain:

As 40 and 2 were used as arguments in our program, they were added to the stack. But they weren't added as integers. In fact, they were added as ASCII characters. 


 We're working with hexadecimal characters and we're looking for the value 40, right?

So, 0x32003034. You'd possibly expect to read from left to right, but we're working in little-endian here, so in fact our number will be presented right to left. And if we look at that table, we would be reading (now reversed) 4, 0, NUL, 2. That NUL is the null byte which marks the end of that string. And I'd bet you my breeches that after that 32 there will be immediately to its left another 00, since these strings are being stored next to each other. If you're paying attention, you'll know I was cheating and you won't want to bet against me as you read the next value in the stack 0x48530032 and see, in black and white that '00 32', which translates to the number 2 (in decimal). You might be tempted to continue translating that line and read 'SH..'. Interesting, no? But I'll leave it to you to find out more.

But you might be asking, why is the Stack in this initial state? And that is a perfectly valid question. As we load up our program and enter its two parameters 40 and 2, we have automatically added 4 things to the stack, in this order (from bottom to top):

- a pointer to the last parameter (our third argument, or argv[2]);

- a pointer to the first parameter (our second argument, or argv[1]);

- a pointer to the program itself, its full path, in fact (our first argument, or argv[0]);

- the number of arguments  (argc).

As you start reading the program and debugging it, you'll see the stack add more items and remove them. 

Code Screen:

This is where you follow your code. the green arrow and green letters shows you where you're at in the code, and the red dot tells you that there's a breakpoint here. If you're into learning more about GDB (please do) then you can try this link as well. This line of code is the next to be executed. And as you press si ('step into') you'll move along the code, Assembly line by Assembly line.

 

So, let's do just that and run si some 4 times, until we get to that compare (cmp). How will that code look like? That Stack, will it change? And the Registers?  Let's see:


 So, what happened? We started by popping the value on the top of the stack and placing it in ecx. So, in that next step you'll see that ecx = 3. Then we do the same and place that value, a pointer to the function name, in edx, removing it from the top of the stack. Finally, we decrease ecx, basically subtracting 1 to the value within and we xor edx, edx which is basically the same as doing mov edx, 0. ecx is holding the number of variables used in our Math and edx is emptied for future use. See how that works? If we push, we take the value in the register and copy it into the stack, and if we pop we remove the value from the stack and place it in the designated variable.

I'm stopping here with the guided code lesson. I'm leaving it up to you. You do have all the tools that you need to do so.

Remember tidbits like: if you call a function, you jump to that function, instead of continuing down the lines of code, but you place the line of code right after the call on top of the stack (the return address is pushed onto the stack). When you hit the instruction ret, on the other hand, you pop whatever value is on top of the stack and go directly to the line that is referenced in that value (a pointer to a memory value). 

GEF will be kind enough to tell you when a jump instruction isn't fulfilled (which means that instead of jumping into a function you continue reading the code below that jump).

Pay also attention to the name of the function and on how far you are away from its start. For example, in this case, I'm inside the inner function .multiplyLoop, inside the function atoi:

 


 

Here's some more stuff you might want to get into:
 

- what is the register eip doing?

-  What's with bl, BYTE PTR [esi+ecx*1]? Can you guess what's happening there?

- Pay attention to where you're going and what's happening when you run a ret instruction.

- Perhaps write down all the commands in a piece of paper and try to 'guess' how the flow should work until the very last operation. Then compare to what you see on GDB. Does it match?

And that's it! You're now ready to start discovering more and more about this wonderful world, or you're thinking that anyone that likes this must be a bit crazy.



Either way, you cannot unsee it now. 
Have fun and hack away!

Friday, March 21, 2025

Securing Your Website (Part 2): Cloudflare Tunnels, WAF Traps, and More Hands-On Security

 

            So it goes...

 

 

After setting up my website with Cloudflare Tunnels to bypass ISP restrictions and adding some basic WAF rules, I kept hounding up Cloudflare's security features. It turns out there's a whole world out there, and there's much more you can do. So, be advised, this blogpost won't even touch upon 1% of what you can really pull given enough time and effort.

Let me be clear—I’m no expert. I’m just learning by doing, breaking stuff, re-making the configs, fixing what can be fixed, and documenting most things as I go along. You can too. This is not a deep technical dive, it’s a hands-on log of things I found fun and useful. YMMV.

📌 Step 1: Making Sure the Tunnel Survives Reboots

If you recall, in the last post, I set up a Cloudflare Tunnel to keep my server accessible and bypass my ISP blocking inbound traffic. But the tunnel was running manually. If the machine rebooted, the tunnel wouldn’t come back up unless I started it again.

That’s where systemd comes in.

With a systemd service, we can make sure the tunnel starts automatically when the machine boots, and even gets restarted if it crashes.

Here’s the basic idea:

  • We create a service file that tells the system how to run cloudflared

  • We point it to the tunnel config and credentials file

  • We enable the service so it runs at startup

     

                Ain't much, but it's enough.

It’s fairly straightforward, really. If you haven’t used systemd before, it’s just a way for Linux to manage long-running background tasks. And a whole can of worms if you're, say, over 30 years old or so.

Now, every time my server restarts, the tunnel comes back automatically. No more downtime.

📌 Step 2: WAF Traps and Custom Blocks

I started testing different WAF rules to create little security tripwires—fake URLs and suspicious patterns that only bots or scanners would trigger.

Honeypot Rule: I created a fake path (/admin-panel) that doesn’t actually exist on my site. Then I wrote a rule:

(http.request.uri.path eq "/admin-panel")

Action: Block

Any legit user would have little reason to visit that URL. If something does, it’s (likely) a scanner or a bot poking around for admin panels. This gets blocked, and the event is logged in Cloudflare for review. Nifty!


 Blocking curl POSTs to /submit. Because why not?

(http.request.method eq "POST" and http.request.uri.path eq "/submit")

Action: Block

This is another tripwire. I can still use GET on that path, but any POST—especially from a script—is blocked. I tested this with curl -X POST and saw the request get blocked. 


Country WAF Rule vs. Tor: I also blocked a specific country and then tested the rule using Tor Browser. Guess what? Tor got through. This was a cool discovery because it shows how Tor exit nodes might evade country-based blocking unless you explicitly block Tor IPs using Cloudflare’s $tor variable (aaand, you totally can do just that). So, while regular Proxy sites were getting Captcha challenged (and failing), Tor got through squeeky clean.





 
                Nope. And Bot Protection will not let you verify. Go figure.

                   Yup.


📌 Step 3: Cloudflare Logs and Visibility

Cloudflare gives you a lot of visibility into what’s hitting your site:

  • What paths are being accessed

  • Whether the traffic was challenged, blocked, or allowed

  • Which rule triggered

  • What country, ASN, and IP the request came from

You can see all this under Security → EventsI reviewed the logs and noticed traffic from VPNs, proxies, and scrapers. I had seen this before, over one year ago, when my website actually existed. At that time, I hashed an impromptu firewall and logging system and was totally amazed at the amount of automatic attempts at entering my website, or specific pages of it.

As for Cloudflare, you have that and a lot other tools, like Cloudflare API or GraphQL queries to pull logs automatically, and which I totally need to get into as soon as I get the time.

📌 Step 4: You Don’t Have to Be an Expert

If there’s one thing I want you to take from this, is that we're all ignorant, or at least we start ignorant, and we just keep on learning and learning.

Back when I was an acting teacher, I was asked about being an actor, and how to become good. My answer then is the same I have for you today: "You fall in love with what you do. You do it every day, whenever you have the time, and little by little you become good."

📌 Step 5: Secure Remote Access with Tailscale (or WireGuard)

When you’re running your site from your own machine (or a Raspberry Pi), you probably want a way to connect to it remotely and securely.

As far as I know, you can do it with Cloudflare Enterprise (Zero Thrust), but I haven't explored that (yet). 

Another way is Tailscale, or tunneling from your router, with Admiral, for example. The one I picked is Wireguard.

This blogpost has been long enough. So here’s the basic idea:

  • Install WireGuard on both your server and client devices to generate the necessary private and public key pairs.
  • Set up the client config to ensure secure connections through the VPN.
  • Access SSH through the WireGuard VPN by connecting to the server’s internal VPN IP address.
  • Like I said, you don't lack options on how to configure and access you server. You just need to pick one, understand why it works and use it.

    📌 What’s Next?

    Heck if I know. I'm just here for the ride.


    Happy Father's Day.

    Sunday, March 16, 2025

    Securing Your Website: Cloudflare Tunnels, WAF, and Bypassing ISP Restrictions

     

     

                *Poo-Tee-Weet?*



     

    Following some really great advice from someone who was kind enough to give it, I decided to devote some time to Web Application Firewalls (WAF), IP masking, and network security, particularly using Cloudflare’s free tier.


    Over a year ago, as part of my course's challenge at ATEC, I launched my own website: www.kernelcoredive.org (don’t rush to open this link—it's still under construction). It was a small space where I documented low-level programming concepts, mostly focusing on Assembly and computer architecture.

    As time went on, I got caught up in my internship and stopped updating the site, shifting my focus to both LinkedIn and this blog.
    But as this challenge came up, I went ahead and renewed my domain name on Namecheap.

    This post (and the next one) will document my process, some issues I found and the subsequent solutions. If you’ve ever wanted to host your own website, this should help you get started. It’s surprisingly easy, costs about €15/year, and might introduce you to essential networking and security concepts.


    📌 Step 1: Registering a Domain

    First things first—you will need a domain name. This was done through a domain registrar. You can pick one from providers like GoDaddy, Namecheap, or the Cloudflare Registrar.

    Once you choose a name and pay a small yearly fee, the domain is yours (and will be as long as you pay up). Now, we need a web server to actually host the website.


    📌 Step 2: Setting Up an Apache Server

    I set up an Apache web server on my machine to host the website. Since I don’t want to clutter this post with step-by-step Apache setup instructions, I'll just point you to an excellent guide: Server World.

    Follow that documentation, and you’ll have Apache running locally in no time.
    And do take a look at the site. I found it really helpful a year ago during my Linux classes.


    📌 Step 3: Connecting My Domain to Cloudflare

    Next, I signed up for a free Cloudflare account. This gives me access to DDoS protection, caching, and security tools.

    Adding my domain was pretty simple—you just have to follow Cloudflare’s setup guide, and it will automatically scan your DNS records.

    At this stage, I also updated my domain registrar’s DNS settings to use Cloudflare’s nameservers (again, follow the instructions set up by Cloudflare). This ensures all traffic is routed through Cloudflare before reaching my server.


    🫢 Step 4: Issue: My ISP Blocks All Inbound Traffic

    This is where I got to metaphorically bang my head against a wall and was failing at reaching my server.

    I needed to link my public IP address to my domain—something I had done in the past without issues. But this time, no matter how hard I tried, I couldn’t access my public IP.

    After testing with nmap and other tools, I confirmed that my ISP was blocking all inbound traffic. My router was not allowing requests to reach my server, no matter what ports I used.

     I also couldn’t simply port-forward my way out of this. After carefully checking my ISP router settings, I found that port forwarding wasn’t available at all.

    A possible solution? Creating a Cloudflare Tunnel.


    📌 Step 4: Setting Up a Cloudflare Tunnel

    A Cloudflare Tunnel allows outbound connections from my server to Cloudflare, bypassing ISP restrictions entirely.

    I installed it with:

    curl -fsSL https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 -o cloudflared chmod +x cloudflared sudo mv cloudflared /usr/local/bin/ cloudflared tunnel login

    However, I ran into a DNS conflict issue. While cloudflare had created a couple of A records for my server, I needed in fact a CNAME record instead. While A records point towards an IP, a CNAME record would allow for cloudflare to route traffic through the tunnel. So, I deleted the A records and created the necessary CNAME record.

    This is all done under the DNS tab on cloudflare, btw.


    📌 Step 5: Enabling HTTPS with Free SSL

    With my tunnel working, my website was now accessible over HTTP. But I wanted encryption (HTTPS), so I added a free SSL certificate from Let’s Encrypt. I had done this a year ago, and it was as simple as it was before.

    Again, I won’t bore you with the step-by-step setup—Let’s Encrypt is easy to install, free, and a game-changer for web security.

    Then, I went to Cloudflare > SSL/TLS > Edge Certificates and enabled:
    Always Use HTTPS
    Full (Strict) SSL mode

     


    📌 Step 6: Configuring Apache & Cloudflare

    Cloudflare was now handling HTTPS redirection, so I had to disable Apache’s HTTPS redirect to prevent a redirect loop.

    I edited /etc/apache2/sites-available/kernelcoredive.conf and commented out these lines:

    RewriteEngine On RewriteCond %{HTTPS} !=on RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

    And restarted Apache.

    Note that these lines might not be exactly like this in your setup. Look for any lines handling redirection in your configuration file and comment them out to avoid conflicts with Cloudflare’s HTTPS enforcement.

    Now, my website was fully accessible, bypassing my ISP’s filtering.


    🔒 Step 7: Adding Security – WAF & Bot Protection

    With my site running through Cloudflare, I started testing Web Application Firewall (WAF) rules.

    I created two rules:
    1️⃣ Blocking a specific country (e.g., blocking all traffic from a particular region).
    2️⃣ Configured a CAPTCHA challenge for any requests using the python-requests User-Agent.

    I tested this out with:

    curl -A "python-requests" https://kernelcoredive.org

    You might be a bit more refined in your tastes, and have a test that actually addresses the Captcha part. Either way, and as you can see, the logs can show us these failed communication attempts.

    I also enabled Cloudflare’s basic bot fight mode, which is included in the Free Tier: 




    📌 Step 8: Next Steps

    Right now, the Cloudflare Tunnel is running manually, meaning if my machine reboots, or if I close the service, the tunnel stops.

    Tomorrow, I’ll create a systemd service to keep my tunnel online 24/7 on a Raspberry Pi.
    I'm also going to subscribe to the pro tier, in order to practice with these and other concepts for the next month. This stuff is fun, and gives us a ton of flexibility on what and how many tiers of protection we want to implement.I also want to explore the Cloudflare API to see what kind of automation and security controls I can implement.


    Fun! There's more tomorrow.


    Thursday, March 6, 2025

    I Dislike Soft Skills Talk—So Hear Me Out on Soft Skills.

     

                        "Where be yer low level ramblings, ye heathen?"


    技 (Waza) technique, skill, or ability

    Lacking the time to properly organize my thoughts on malware and cybersecurity (or whatever strikes my fancy), I might as well put forth something else that's been dangling in my mind, persistently nagging to come out and play: the importance of soft skills in IT in general (cybersecurity included).

    Being a techie myself, loving all (yeah, right) most things technical, and truly an introvert at heart, I can say without hesitation that I don't really appreciate the constant call for newcomers in both IT and cyber to focus hard on the "soft" side of their skills.

    We're led to believe that these skills are oh-so-fundamental, to the point where instead of drilling into the technical basics and particulars of each profession, we get video after video, article after article, and mouthpiece after mouthpiece telling us to prioritize social aspects. I've even seen cybersecurity folks claim that if they could redo their path to cyber mastery (or whatevs), they'd go back to college and focus much more on networking (the human kind) while paying less attention to the technical side.

    I take a hard stance against this.

    • Our fields are highly technical in nature.

    • We DO have a significant technical knowledge gap.

    • Most of this knowledge takes years to grasp, master, and apply.

    • These so-called soft skills are actually quite easy to learn and deploy.

    Sure! You won’t become a master speaker or the next Shakespeare in a couple of months, but you don’t need to be. You just have to be able to communicate clearly—enough that those less technically inclined can understand you.

     


    Where am I coming from with all this certainty about these much-hyped social skillsthe so-called golden key to a successful tech career? Well, before diving into IT, even before working in math, I worked as an actor, director, screenplay writer, and acting teacher for over 15 years. So I might know a thing or two about speaking before a live audience, presenting oneself, and communicating effectively.

     

    I don’t claim to be the greatest expert—far from it. But I’ve walked the walk and talked the talk, and now that I’m in IT, I can tell you: the two are not even remotely comparable.

    My long-term goals in 'IT' are harsh, to put it mildly. Heck, I must have been very drunk when my brain decided that low-level code, reverse engineering, and poking at weird malware was the greatest invention since sliced bread. But even just talking about mastering the basics needed to apply with any real confidence to cyber positions—the often-mentioned triad of programming, systems, and networking—takes serious effort. To actually understand these fields, to feel comfortable discussing them, to even recognize what’s being said in a conversation? Believe me, acting is easier. Speaking in public, presenting your thoughts in a structured manner—these things are much easier.

    Now, granted, you might not want to do it. You might be shy, socially averse, or a bloody introvert like me. But that doesn’t make it difficult. It just makes it uncomfortable.

    So, is this blog post just an excuse to ramble against soft skills?

    No, not really. Just because I dislike something—or the exaggerated emphasis placed on it—doesn’t mean it’s wrong. Quite the contrary.


    Soft skills are, in fact, useful. Knowing how to write, speak, present yourself—in one word, communicate—is undeniably important.

     

    Just recently, I had to coordinate a troubleshooting session remotely, where instructions had to be relayed to a team that wasn’t entirely familiar with the technical process—and let’s just say that language barriers didn’t help. Communication isn’t just about simplifying tech for upper management. Sometimes, it’s about conveying precise, critical steps to people who need to act on them immediately, without confusion.

    In the end, it worked. But it was quite the ride, and I found myself pivoting, adapting and adjusting, in order to get the troubleshooting steps through and carry on with what we were doing.

    So, yeah. There’s that too. Communication takes many forms, and you’ll need it sooner rather than later. Don’t just ignore it. And, to re-iterate some good and bad news: it’s much easier to learn and quicker to grasp than you might think—but that doesn’t mean you’ll enjoy it.

     

    Enjoy the ride, though. If at all possible.

     

    A former acting colleague once said: life is just the backstage intermezzo you take between being on stage.

     

    I don’t like that statement. But he might be right.



    Thursday, February 6, 2025

    Wherein We Forsake: Farewell and Godspeed







    棄 - 'to forsake', 'to discard', 'to renounce'

    My friends are leaving.

    Some were close friends; others were simply colleagues. But if you think about it, we spend so much time with our workmates that they become more than just faces we see at work—they’re part of our daily lives. For many of us, we see our colleagues more often than our families.

    I sleep very little, which gives me some extra home time, but still, the reality is that I spend most of my waking hours surrounded by these people. And now, a significant number of them are gone.

    I feel sorry for them and for us. I liked many of them, and from what I saw and heard, most were incredibly skilled at what they did. Their departure wasn’t their fault.

    So today’s post is a tribute to them.


    It’s been a month since I’ve written here. In that time, I’ve made a diagonal move in my career (up and to the side) into the role of network specialist. With this role comes a fair amount of autonomy to decide how to implement and secure systems. My onboarding is still ongoing, but I feel the itch to write and return to one of my passions: reverse engineering (RE).

    Not today, though. My focus lately has been squarely on network security, and I’ve been wrestling with a thought that might resonate with some of you network addicts:


    Network Protection vs. User Accessibility

    How do you strike the right balance between keeping a network secure and ensuring it’s user-friendly?


    The Freeloader Debate

    When managing a network—especially one shared by multiple teams or even public users—you’re forced to ask yourself a tough question:

    Do you lock it down, leave it open, or what?


    Option 1: Lock It Down?

    You could go full-on security mode and control every possible access point. Some options include:

    • Blocking unapproved MAC addresses.
    • Whitelisting only specific devices.
    • Creating VLANs to isolate users and devices.

    This approach keeps freeloaders and unauthorized devices off your network. But at what cost?

    • Your IT team faces a constant workload managing requests and ensuring critical devices aren’t accidentally blocked.
    • Field teams and guests are often frustrated when they can’t connect because their devices are blocked by default, leading to complaints and delays.


    Option 2: Leave It Open?

    You could take the laissez-faire approach. Just let everyone connect. No restrictions. No extra work.

    But this comes with its own set of risks:

    • An overloaded network, with too many devices competing for bandwidth and impacting performance for critical systems.
    • A wider attack surface, as bad actors could exploit this openness to gain unauthorized access.
    • Difficulty in tracing network activity, making it harder to identify devices or users when issues arise.

    As a wise Jedi once said, “Only Sith deal in absolutes.” Neither extreme is sustainable. A locked-down network might keep freeloaders out, but it also hampers legitimate users from getting their work done. On the flip side, an open network exposes you to security risks and performance issues.

    Without going into the nitty-gritty of it all, here are some alternative strategies:

    1. Set Up a Guest Network
      A dedicated guest network with bandwidth throttling and basic isolation ensures that guests can connect without overwhelming critical systems.

    2. Implement Role-Based Access
      Integrate with RADIUS or Active Directory to dynamically assign permissions based on roles.

    3. Use Time-Based Access Policies
      Temporary users (e.g., guests or contractors) can be assigned access that automatically expires after a set period, preventing long-term freeloaders.

    4. Monitor and Audit Regularly
      NetFlow or your router’s built-in logging can track activity. This helps detect anomalies before they become bigger issues.


    This isn’t just about blocking bad actors—it’s about enabling legitimate users while minimizing risk. It’s a game of checks and balances, not unlike managing resources in an economy or a strategy game.

    I can’t go into much detail for obvious reasons, but I wanted to share this small glimpse into a different side of cybersecurity—one that’s as much about people as it is about technology.
    I know, I know, too basic: and you're right. Besides, the fun is in the little details, and the clever choices you make. Right? But today is not the day for that.


    To My Friends

    So, to my friends who weren’t freeloaders, who worked hard, and who I’ll miss:

    Stay strong in the trenches, stay inspired, stay healthy, and remember—every system, like every farewell, brings its own challenges and opportunities.

    Roger and out.



    SUDO INIT 6: Rebooting Your C Journey

                                                                      Yeah, let's do just that. So grab some popcorn and lean back.   I'...