---
# System prepended metadata

title: TryHackMe - Reversing ELF

---

# TryHackMe - Reversing ELF

## Crackme 2


```
file crackme2
```


![](https://i.imgur.com/bGMUaoy.png)



![](https://i.imgur.com/1snYBqk.png)



```
strings crackme2
```

![](https://i.imgur.com/r4OkIOH.png)


```
./crackme2 super_secret_password
```

![](https://i.imgur.com/PoMbKmF.png)


## Crackme 3



![](https://i.imgur.com/OvyD8Om.png)


```
strings crackme3
```

![](https://i.imgur.com/b8MyQUh.png)


![](https://i.imgur.com/R1PCiYO.png)


## Crackme 4


![](https://i.imgur.com/1OCus3j.png)



![](https://i.imgur.com/FbujUda.png)


```
gdb crackme4
```

```
info functions
```


![](https://i.imgur.com/2zDPExR.png)


Hay unos cuantos nombres de funciones interesantes que destacan, entre los que se encuentran main, get_pwd y compare_pwd. Sin embargo, me interesa la función strcmp@plt basándome en el mensaje proporcionado. Podemos asumir que la contraseña introducida se compara con la contraseña correcta a través de strcmp(). Usando gdb, decidí establecer un punto de interrupción en la dirección de memoria de esta función.


N.B. En el desarrollo de software, un punto de interrupción es un lugar de parada o pausa intencional en un programa, colocado con fines de depuración y para ayudar a adquirir conocimientos sobre un programa durante su ejecución.

```
(gdb) b *0x0000000000400520
```


![](https://i.imgur.com/qGlMaJr.png)



Con el punto de interrupción establecido, ahora puedo ejecutar el binario en gdb con alguna entrada de prueba

```
run test
```

![](https://i.imgur.com/DUzfbGx.png)


El binario se ejecuta hasta que llega al punto de ruptura como se ve en la imagen de arriba. A continuación, puedo ver el estado actual de los registros con gdb.

N.B. Los registros son esencialmente pequeñas áreas de almacenamiento en su procesador que pueden ser utilizadas para almacenar cualquier cosa que pueda ser representada con ocho bytes o menos.


```
(gdb) info registers
```


![](https://i.imgur.com/5nYsUWQ.png)



Mirando la salida de arriba puedo ver el nombre del registro, el valor de los registros en formato hexadecimal y el valor de los registros en el formato que gdb considera más apropiado (hex para los punteros, decimal para los demás). Puedo ver que los registros de propósito general rax y rdx tienen valores de direcciones de memoria. Puedo usar gdb para imprimir las cadenas en estas direcciones.


```
(gdb) x/s 0x7fffffffe2a0
```


![](https://i.imgur.com/rj3K3Rv.png)



Esto me muestra tanto la cadena que proporcioné como entrada al ejecutar el binario como la contraseña/bandera utilizada para comparar con mi entrada.


```
(gdb) x/s 0x7fffffffe67c
```

![](https://i.imgur.com/8B7K8H2.png)


![](https://i.imgur.com/t5Wly1n.png)



## Crackme 5





















