BF Forked & Threaded Stack Canaries
Ako se suočavate sa binarnim fajlom zaštićenim kanarincem i PIE-om (Position Independent Executable), verovatno ćete morati da pronađete način da ih zaobiđete.
Imajte na umu da checksec
možda neće otkriti da je binarni fajl zaštićen kanarincem ako je statički kompajliran i nije u mogućnosti da identifikuje funkciju.
Međutim, to možete ručno primetiti ako primetite da se vrednost čuva na steku na početku poziva funkcije i da se ta vrednost proverava pre izlaska.
Brute force kanarinca
Najbolji način zaobići jednostavan kanarinac je ako je binarni program forkovanje dječijih procesa svaki put kada uspostavite novu vezu sa njim (mrežna usluga), jer će se svaki put kada se povežete sa njim koristiti isti kanarinac.
Zatim, najbolji način zaobići kanarinca je jednostavno brute-force-ovati ga karakter po karakter, i možete saznati da li je pretpostavljeno bajt kanarinca tačan proverom da li je program pao ili nastavlja svoj redovan tok. U ovom primeru funkcija brute-force-uje 8 bajtova kanarinca (x64) i razlikuje između tačno pretpostavljenog bajta i lošeg bajta samo proverom da li je odgovor poslat od strane servera (drugi način u drugim situacijama mogao bi biti korišćenje try/except):
Primer 1
Ovaj primer je implementiran za 64 bita, ali se lako može implementirati za 32 bita.
Primer 2
Ovo je implementirano za 32 bita, ali se lako može promeniti na 64 bita. Takođe, obratite pažnju da za ovaj primer program očekuje prvo bajt koji označava veličinu unosa i samog payload-a.
Niti
Niti istog procesa će takođe deliti isti canary token, stoga će biti moguće bruteforcovati canary ako binarni fajl pokrene novu nit svaki put kada se desi napad.
Osim toga, prekoračenje bafera u niti funkcije zaštićenoj canary-jem može se koristiti za modifikaciju glavnog canary-ja koji je smešten u TLS-u. To je zato što bi bilo moguće dostići memorijsku poziciju gde je smešten TLS (a time i canary) putem bof-a na steku niti. Kao rezultat, zaštita je beskorisna jer se provera vrši sa dva canary-ja koji su isti (iako modifikovani). Ovaj napad je izvršen u writeup-u: http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads
Pogledajte takođe prezentaciju https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015 koja pominje da se obično TLS čuva pomoću mmap
i kada se kreira stek niti, takođe se generiše pomoću mmap
prema ovome, što bi moglo omogućiti prekoračenje kao što je prikazano u prethodnom writeup-u.
Ostali primeri & reference
64 bita, bez PIE-a, nx, BF canary, upisivanje u neku memoriju ROP-a za pozivanje
execve
i skakanje tamo.
Last updated