Salut,
Această provocare nu este chiar grea, dar este destul de confuză. Ca să o rezolvi foarte repede, tot ce trebuie să faci este să o modifici (patch) în 2 locuri și apoi să o rulezi cu argumente diferite până când încep să fie scoase flag-urile.
Iată un script exemplu care rulează binarul de 100 de ori, cu argumente de la 1 la 100
[code language=”bash”]
printf ‘start\n’
for i in {1..100}
do
printf “$i ”
./program “$i” | xxd -r -p
printf ‘\n’
done
printf ‘\nend\n’
[/code]
Miezul provocării este să observi că există o funcție ascunsă. Dacă modifici fluxul de execuție către acea funcție, vei vedea că un șir din secțiunea de date este combinat prin XOR cu un număr aleator sau cu argv[1], dacă este furnizat.
Binarul verifică dacă fișierul /tmp/secret există, îl citește și compară ce a citit cu 0xde 0xad 0xbe 0xef. Ca să sari peste modificarea acestui salt, poți folosi:
echo -n -e '\xde\xad\xbe\xef' > /tmp/secret
Când modifici apelul către funcția ascunsă, asigură-te că transmiți argv[1] ca parametru, atât. Hacking plăcut!
PS: Binarul folosește unele tehnici anti-debugging. Am observat două apeluri ptrace.
Unul se află în ultimul apel de funcție din main. Dacă îl rulezi fără debugger, binarul va scoate un flag și îți va spune că este greșit. Dacă îl rulezi cu debugger, nu îți va mai spune că flag-ul nu este cel corect.
Al doilea apel este făcut în funcția ascunsă. Aceasta verifică dacă debuggerul este activ și, dacă este, iese din program.