Korean CTF : CSHARP Write-Up
Hi people
The typical .Net assembly icon confirm us that it is .Net
And one with the messagebox of validation (MetMet)
I will continue to the second breakpoint to see how the code look like
Starting a blogpost by reversing a .Net PE sound weird to me, but I need to start somewhere :p
This a Write Up about a Korean CTF challenge, the one is named CSHARP
It's not really hard (because of .net) but I found it interresting
MD5 : E8B0B5173B14D118FFD687D37F1A6F06
What I used :
- DIE (Detect It Easy)
- DNSpy
Part 1 :
Post analyse
The first thing to do is identify what is this PE
It’s look
like a .Net assembly (like in the title)
Before reverse anything, I like to see what the tool look like
The typical .Net assembly icon confirm us that it is .Net
Ok so a classic check, a textbox and a message box of answer
So, let's get started
It’s .Net so
I will use dnSpy to decompile it
Nothing
special, the Module entrypoint is empty, the Main entrypoint is normal and just
launch the Form1 class
So let’s
jump in the Form1 class
In imports,
we can see something interesting, the System.Reflection library is used to
manage assembly in general, so we will have
to deal with assembly manipulation.
To begin, I will check for the constructor
Something is done here 🙂
The "MetMett" function fail to be analyzed by
dnSpy, so I assume that is encrypted
By analyzing the constructor, we can see that
the raw IL instructions bytes of the "MetMett" function is stored in the bb
variable
And we see a modification applied to this
buffer, we can presume that the modifications decrypt this buffer, we will see
latter
The InitializeComponent and Form1_Load
functions doing nothing special so I will jump directly to the check button
function
So when we press the check button, the textbox
input is passed in the "MetMetMet" function, the message box answer doesn’t appear
to be here so the "MetMetMet" function do all of the check
So the "MetMetMet"
function is a little bit too tight, so I will
analyse it step by step
First thing we see is the input password
converted to base64 and stored as bytes
After the function create a Dynamic Assembly in
memory, create a class called RevKrT1 and define a function called "MetMet" in it
The function creates a second module in memory,
create a class called RevKrT2 and define a function called "MetM" in it
The method "MetM" is writed with the bb variable
seen above, so we was right 🙂
The "MetMett" function stored the encrypted
method, it is decrypted at start and stored in bb variable, and after, it is writen
in memory as the "MetM" function
After that this function is Invoked from the second
module (RevKrT2) and use the input base64 bytes in arguments.
And here we are 🙂
After the call of the decrypted function, we have the answer of the validation.
After the call of the decrypted function, we have the answer of the validation.
This means that the previous called function is
the check for the password
The crafted "MetMet" function in the first
module (RevKrT1) generate manually the IL instructions of the message box
And finally the message box function is called
from the (RevKrT1) module
So what we know from here :
We learn that the "MetMetMet" function craft two dynamic modules, one which check the password (MetM)
And one with the messagebox of validation (MetMet)
Part 2 :
Running the assembly
So now we have a good idea of what the
executable do
I’m going to put two breakpoints
One after the modules creations and "MetM"
method definition
And one after the definition of the messageBox,
to see if we are right
When the first breakpoint hit, we see the
modules in memory
I will continue to the second breakpoint to see how the code look like
I directly jump in the modules from memory
We see the code 🙂
From that we have just to reverse the check
function
The password
in base64 should be 12 characters, and like we
said before, if the array[0] is set to 1, the password is wrong
The check
is not difficult, just xor and cmp, so easy to
make a reverse script
Conclusion :
It was not difficult but it used uncommon
obfuscation techniques (create modules and store decrypted functions in this
module) this change of traditional Control Flaw Obfuscation. I found it really fun and it’s
why I made a writeup about it.
~r0da
~r0da
Commentaires
Enregistrer un commentaire