<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: James Kabingu</title>
    <description>The latest articles on DEV Community by James Kabingu (@james-kabingu).</description>
    <link>https://dev.to/james-kabingu</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3935876%2F397a3190-d386-4435-96f3-399778abcc32.jpeg</url>
      <title>DEV Community: James Kabingu</title>
      <link>https://dev.to/james-kabingu</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/james-kabingu"/>
    <language>en</language>
    <item>
      <title>PicoCTF General Skills - 5 Challenge Walkthrough (Beginner Friendly)</title>
      <dc:creator>James Kabingu</dc:creator>
      <pubDate>Sun, 17 May 2026 08:16:27 +0000</pubDate>
      <link>https://dev.to/james-kabingu/picoctf-general-skills-5-challenge-walkthrough-beginner-friendly-23cb</link>
      <guid>https://dev.to/james-kabingu/picoctf-general-skills-5-challenge-walkthrough-beginner-friendly-23cb</guid>
      <description>&lt;p&gt;I've been working through PicoCTF challenges as part of building my cyber-security foundation. These are my notes from the General Skills category, five challenges that cover the core terminal skills every CTF player needs. I'll show exactly what I ran, what came back, and what it means.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Nice netcat:
The server sends back a wall of numbers, one per line:
112
105
99
111&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;My first instinct was to look them up one by one in an ASCII table. That works, but there's a faster way. Each number is a decimal ASCII value. 112 is p, 105 is i, 99 is c, 111 is o. Once I saw the pattern I piped the output straight through Python:&lt;/p&gt;

&lt;p&gt;nc -w 2 wily-courier.picoctf.net 53619 | python3 -c "import sys; print(''.join(chr(int(n)) for n in sys.stdin.read().split()))"&lt;/p&gt;

&lt;p&gt;The -w 2 flag tells netcat (nc) to close after 2 seconds of silence, which lets the pipe complete. chr(int(n)) converts each decimal to its character. Flag prints immediately.&lt;/p&gt;

&lt;p&gt;What I learned: when a server returns a list of numbers, assume ASCII first. Three anchor points worth memorising: 48 is 0, 65 is A, 97 is a.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Magikarp Ground Mission:
SSH into a server, navigate between directories, and collect three parts of a flag. The instructions are literally in the files themselves.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;ssh &lt;a href="mailto:ctf-player@wily-courier.picoctf.net"&gt;ctf-player@wily-courier.picoctf.net&lt;/a&gt; -p 55070&lt;br&gt;
ls&lt;br&gt;
cat 1of3.flag.txt&lt;br&gt;
cat instructions-to-2of3.txt&lt;br&gt;
cd /&lt;br&gt;
cat 2of3.flag.txt&lt;br&gt;
cat instructions-to-3of3.txt&lt;br&gt;
cd ~&lt;br&gt;
cat 3of3.flag.txt&lt;/p&gt;

&lt;p&gt;The three files contain picoCTF{xxsh_, then 0ut_0f_//4t3r_, then 0b24fc4f}. Put together: picoCTF{xxsh_0ut_0f_//4t3r_0b24fc4f}&lt;br&gt;
What I learned: cd / is root, cd ~ is home. Flags are sometimes split across locations deliberately to teach navigation.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;First Find:
An archive with a file called uber-secret.txt buried somewhere inside. The directory tree is deep and one of the folders is hidden.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;wget &lt;a href="https://artifacts.picoctf.net/c/502/files.zip" rel="noopener noreferrer"&gt;https://artifacts.picoctf.net/c/502/files.zip&lt;/a&gt;&lt;br&gt;
unzip files.zip&lt;br&gt;
find . -name "uber-secret.txt"&lt;/p&gt;

&lt;p&gt;output: ./files/adequate_books/more_books/.secret/deeper_secrets/deepest_secrets/uber-secret.txt&lt;/p&gt;

&lt;p&gt;cat ./files/adequate_books/more_books/.secret/deeper_secrets/deepest_secrets/uber-secret.txt&lt;/p&gt;

&lt;p&gt;Flag: picoCTF{f1nd_15_f457_ab443fd1}&lt;/p&gt;

&lt;p&gt;What I learned: find . -name searches recursively and goes into hidden directories that ls won't show you. Get comfortable with this command.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Static ain't always noise:
A binary file and a bash script called ltdis.sh. I read the script before running it. It does two things: disassembles the binary with objdump and extracts readable text with strings.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;chmod +x ltdis.sh&lt;br&gt;
./ltdis.sh static&lt;br&gt;
grep "picoCTF" static.ltdis.strings.txt&lt;/p&gt;

&lt;p&gt;Output:&lt;br&gt;
3020 picoCTF{d15a5m_t34s3r_20335e41}&lt;/p&gt;

&lt;p&gt;What I learned: binaries often contain embedded readable strings. strings extracts them all. grep finds the one you want. This combination comes up constantly in reverse engineering.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Plumbing:
The server floods you with output. The flag is somewhere in there.
bash nc fickle-tempest.picoctf.net 49418 | grep "picoCTF"
Flag prints immediately: picoCTF{digital_plumb3r_A01Bc3eC}
What I learned: the pipe operator passes one command's output directly into another without saving anything to disk. command | grep "pattern" is probably the most used one-liner in CTF general skills challenges.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Tools used across these five challenges&lt;br&gt;
nc, python3, ssh, find, strings, grep, and the pipe operator&lt;/p&gt;

&lt;p&gt;I'm continuing through PicoCTF. Next up is the Cryptography category. Follow if you want the writeups as they come.&lt;/p&gt;

</description>
      <category>security</category>
      <category>ctf</category>
      <category>beginners</category>
      <category>linux</category>
    </item>
  </channel>
</rss>
