---
# System prepended metadata

title: Reversing

---

# Reversing

## WIDE - Matixx22

Open binary in hydra, find a key in plaintext and use it to decrypt a flag.

Key: `sup3rs3cr3tw1d3`
Flag: `HTB{str1ngs_4r3nt_4lw4ys_4sc11}`

* * *

## Without\_a\_trace - 0x244

> The challenge can be solved by using `ltrace` and `gdb`.

The name of the challenge instantly reminded me of the `ltrace` or `strace` tool.

So i ran `ltrace ./without_a_trace` and received the following output:

```
puts("[+] Primary Mothership Tracking "...[+] Primary Mothership Tracking Panel
)                                                                                                       = 38
puts("[X] Unusual activity detected"[X] Unusual activity detected
)                                                                                                             = 30
puts(" |-------] Unrecognised login lo"... |-------] Unrecognised login location: Earth
)                                                                                                       = 46
printf("[X] Please verify your identity "...)                                                                                                     = 60
fgets([X] Please verify your identity by entering your password > 
```

I entered some dummy data (`test` as the password) and received the following response:

```
fgets([X] Please verify your identity by entering your password > test
"test\n", 64, 0x7f0e5f2089a0)                                                                                                               = 0x7ffd1881bec0
strchr("test\n", '\n')                                                                                                                            = "\n"
ptrace(0, 0, 0, 0)                                                                                                                                = -1
strcmp("test", "IUCzus5b2^l2^tq^c5^t^f1f1|")                                                                                                      = 43
printf("[X] Intruder detected - dispatch"...)                                                                                                     = 52
```

Due to the second argument in the `strcmp()` function I knew that `IUCzus5b2^l2^tq^c5^t^f1f1|` has to be the correct password:

> In case you don't know `strcmp()` compares two strings. If the two strings are the same the function returns **0**, else not. The first string will be compared with the second one.

```
puts("[+] Primary Mothership Tracking "...[+] Primary Mothership Tracking Panel
)                                                                                                       = 38
puts("[X] Unusual activity detected"[X] Unusual activity detected
)                                                                                                             = 30
puts(" |-------] Unrecognised login lo"... |-------] Unrecognised login location: Earth
)                                                                                                       = 46
printf("[X] Please verify your identity "...)                                                                                                     = 60
fgets([X] Please verify your identity by entering your password > IUCzus5b2^l2^tq^c5^t^f1f1|           
"IUCzus5b2^l2^tq^c5^t^f1f1|\n", 64, 0x7f96977819a0)                                                                                         = 0x7ffd768ef8a0
strchr("IUCzus5b2^l2^tq^c5^t^f1f1|\n", '\n')                                                                                                      = "\n"
ptrace(0, 0, 0, 0)                                                                                                                                = -1
strcmp("IUCzus5b2^l2^tq^c5^t^f1f1|", "IUCzus5b2^l2^tq^c5^t^f1f1|")                                                                                = 0
puts("[+] Identity Verified"[+] Identity Verified
)                                                                                                                     = 22
puts("[+] Fetching fleet locations..."[+] Fetching fleet locations...
)                                                                                                           = 32
+++ exited (status 0) +++

```

I ran the program again in `gdb` (with same dummy data) and found out, that the password string was **xored** (look for **xor** at `R12`):

```
 RAX  0xffffffff
 RBX  0x555555400a40 (__libc_csu_init) ◂— push   r15
*RCX  0x0
 RDX  0x0
 RDI  0x0
 RSI  0x555555400bb8 ◂— pop    rbx /* '[X] Intruder detected - dispatching security systems' */
 R8   0xffffffff
 R9   0x7ffff7f9ac00 (main_arena+96) —▸ 0x555555602ab0 ◂— 0x0
 R10  0x555555400bb8 ◂— pop    rbx /* '[X] Intruder detected - dispatching security systems' */
 R11  0x286
 R12  0x555555400750 (_start) ◂— xor    ebp, ebp
 R13  0x0
 R14  0x0
 R15  0x0
 RBP  0x7fffffffdb60 ◂— 0x0
 RSP  0x7fffffffdb10 ◂— 0x74736574 /* 'test' */
*RIP  0x555555400a32 (main+266) ◂— je     0x555555400a39

```

Python and pwn are your best friends, when it comes to reverse xor :):

```python
#!/usr/bin/env python3
import pwn

for i in range(10):
    if b'HTB' in pwn.xor(b'IUCzus5b2^l2^tq^c5^t^f1f1|', i):
        pwn.xor(b'IUCzus5b2^l2^tq^c5^t^f1f1|', i).decode()

# Output: HTB{tr4c3_m3_up_b4_u_g0g0} 
```
