User Tools

Site Tools


rev2_bp_counter

This is an old revision of the document!


Zadatak s Hacknite platforme - rev2 - rješenje korištenjem tehnike breakpoint counting

Prije nego što pročitate ovaj članak, preporuča se čitanje ovog članka:

CTF writeup - rev2-Ghidra

Programski kod u ovom programu ima “early exit”, odnosno kad detektira da je neka znamenka korisničkog unosa kriva, odmah ispisuje “Wrong password!” i završava izvršavanje programa. Zato se može zabilježiti koliko koda se izvršilo za koji korisnički unos, ili “perf” alatom, ili postavljanjem breakpointa na ulaz u do while petlju, te brojanjem koliko puta se taj dio koda izvršio.

Ovim načinom se može napraviti “pametan” bruteforce, gdje se može bruteforceati jedna po jedna znamenka korisničkog unosa, što je lagano izvedivo, jer je prostor pretraživanja u najgorem slučaju:

N(charset) * Length(input)

No pošto je poznato da je unos duljine 21 te da je unos u formatu:

CTF2025[<12 - znamenkasti broj>]

Jedini dio koji nije poznat je 12 znamenkasti broj, za koji bi prostor pretraživanja u najgorem slučaju bio:

10 (charset: znamenke 0-9) * 12 (broj nepoznatih znakova) = 120

Što je lagano rješivo.

U slučaju da program nema raniji završetak izvršavanja programa pri pronalasku prvog neispravnog znaka, ovaj način rješavanja ne bi bio moguć. Umjesto “pametnog” bruteforcea, bio bi moguć samo bruteforce gdje se odmah mora naći cijelo rješenje, za koji je prostor pretraživanja samo 12 nepoznatih znamenki:

10**12

što nije izvedivo.

Pseudokod ovog rješenja je postavljanje breakpointa na određeni dio do while petlje te isprobavanje svih mogućih unosa za prvi nepoznati znak. Onaj znak koji je uzrokovao izvršavanje više koda (što će se dogoditi samo u slučaju kada je ispravan znak), odnosno znak za koji se u izvršavanju više puta prošlo breakpointom na ulasku u petlju, je ispravan znak za tu poziciju unosa.

Za rješenje koje broji prolaske breakpointova koristi se libdebug biblioteka. Naredbe za postavljanje virtualnog okruženja za izvršavanje ove skripte su:

python -m venv .
source ./bin/activate
pip install libdebug
python BPCountSolveScript.py

Zadnja naredba pokreće skriptu.

Skripta je prikazana u nastavku:

from libdebug import debugger
import string

d = debugger("./rev2")

flag_length = 21
flag = ['#'] * flag_length
print()

def count_loops(passphrase):
    io = d.run()
    my_callback_breakpoint = d.breakpoint(0x401900, callback= True)
    d.cont()
    io.sendline(passphrase.encode())
    d.wait()
    return my_callback_breakpoint.hit_count


for i in range(flag_length):
    best_char = "#"
    best_instructions = -1

    for c in string.digits + string.ascii_letters + string.punctuation:
        test_flag = "".join(flag[:i]) + c + "#" * (flag_length - i - 1)
        instructions = count_loops(test_flag)

        if instructions > best_instructions:
            print(f"{test_flag} - {instructions}")
            best_instructions = instructions
            best_char = c

    flag[i] = best_char

    print(f"{"".join(flag)} - {best_instructions}")

Važno je da skripta u svakom pokušaju pošalje unos duljine 21, kako bi uvijek bio zadovoljen uvjet da je korisnički unos duljine 21, te nakon toga na opisani način redoslijedom pronalazi jedan po jedan znak korisničkog unosa. Onaj znak koji jednom više prođe postavljenim breakpointom nego drugi znakovi na toj poziciji je ispravan znak.

Također je važan redoslijed, da prolazi znakove redom od najmanjeg do najvećeg indeksa (prvo znak odmah nakon “CTF2025[”, pa znak nakon njega, itd.).

Adresa breakpointa je postavljena kao:

0x401900

Adresa instrukcije na kojoj je postavljen breakpoint koji se broji pri izvršavanju je prikazana slikom ispod:

Slika 1 - Adresa instrukcije s postavljenim breakpointom

Ovaj kod će se izvršiti samo ako je znamenka na toj poziciji odnosno u toj iteraciji petlje bila ispravna, pa se nije dogodio jump na ispis “Wrong password!” i exit, nego se namještaju pokazivači za ulazak u sljedeću iteraciju petlje.

Pokretanjem ove skripte dobiva se rješenje zadatka.

Slika 3 - Rješenje zadatka

rev2_bp_counter.1761927251.txt.gz · Last modified: 2025/12/01 11:40 (external edit)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki