Classic Passwd TryHackMe walkthrough

Introduction

Musyoka Ian
7 min readMar 29, 2021

Hello guys back again with another walkthrough this time we’ll be doing Classic Passwd from TryHackMe. Am really not great at reverse engineering but from learning buffer overflows i know my way around binary exploitation and some bit of reversing binaries to identify vulnerabilities and that’s what this walkthrough will be all about. I know there are a great number of walkthroughs are out there about solving the challenge but am really a great fan of gdb since it’s one of the main tool used in exploiting buffer overflows and i haven’t seen a walkthrough solving this specific challenge with gdb the second method which I’ll use to solve the binary is to patch it so that even if the wrong password is supplied we still get an authentication success

The first step whenever i get a binary i tried finding the most basic information about it even before trying to reverse it

First i ran the file command

file Challenge.Challenge

From that command we get really important information like the binary is a 64 bit binary also we see that the binary is not stripped meaning we can access all the symbols within the binary making our jobs much easier. We also see that the binary is dynamically linked meaning all the shared libraries are access from our very own operating systems

Next command that i always run is strings

strings Challenge.Challenge

And if you can see at least some portion of what later on will be the password but for the binary. But still it wasn’t much useful you can also try with different strings encodings and if anything useful will show up

But next i decided to load up the binary in ghidra and so some light reverse engineering. Any program gets executed from the main function and that’s where we’ll beginning analyzing the binary

We see that once the program enters the main function it jumps to the vuln function immediately

In the vuln function we see the program is asking for a username and if the username is correct is continues execution of the program by jumping to the gfl function but if the username is wring the program exit with a status code of 0 meaning we never hit the gfl function which contains the flag

Let’s execute the binary and see this happening

N/B Before running any binary from untrusted source always try finding as much information about the binary through the basic reverse engineering skills no matter how little and also utilize publicly available information like virus total to see if what you are executing is a malware

Let’s take a look at the gfl function and see if we can get some quick wins

We can see the flag yes but it’s somewhat obfuscated using hexadecimal encoding but we can use a simple online hex to dec converter to get the flag though i didn’t like this method

Exploitation

But we now have a decent idea of what the script does let’s load it in gdb and use gdb as a debugger

An using the gef extension since I’ve actually come to like it and it’s more often maintained. The first thing you usually after loading a binary in gdb is set breakpoints and looking at the stack for any useful information like memory addresses

So let’s first set a break point on main so that gdb hint it when it reaches the main function

Then let’s continue execution of the program

We’ve successfully hit our first break point sweet. But remember the function we are interested in is vuln since that’s where authentication takes place

So let’s disassemble the vuln function and set a break point where the supplied username is compared to the real function

Let’s set a break point at that memory address and continue through execution of the program

b *0x000055555555525a

After continuing though the execution of the program we directly get asked to enter a username

Let’s enter a wrong username in my case I’ll enter my name musyoka and press enter to continue execution of the program

And we again hit a break point this time in the string compare memory address and looking at the string compare memory address we have our username in pretty much clear text

Trying to use that username on the binary

And we have the flag. That’s the first way we can get the flag from the binary.

SECOND METHOD

The second way is to patch the binary by changing the flow which the binary takes even if we give it an incorrect password

To demonstrate this we’ll be using ghidra to patch the binary so let’s begin

First we need to import the binary but in a raw format

Things will look different when we open the binary in a raw format but out goal is to find the main function of the program

Depending in the result the code flow execution changes. Looking at the assembly code we see that when the “jump is not equal to zero it jumps to LAB_00001271 ” let’s invert the instruction so that jump always becomes zero

Right clicking on that instruction and selecting patch instruction

Original Instruction

Changed instruction

Now that we have successfully changed the instruction let’s save the binary by pressing o

Doing a directory listing we get another binary was created

Doing a md5sum show they are different binary

Now to show the difference I’ll split my tmux window and the upper window will have the modified binary and the lower window will have the original binary

Trying to use a wrong password on the original binary we get an authentication error

But using the wrong password on the patched binary we get authentication was successful and we even get the flag

We get the flag and it’s the same decimal value we had decoded using the online converter. And that’s it!!!! Easy right I hope you enjoyed the walkthrough if so don’t forget to clap for me down below and don’t forget to follow me so that you won’t miss any upcoming articles

--

--