Print Stack Canary
Povećanje ispisivanja stack-a
Zamislite situaciju gde program podložan prelivanju stack-a može izvršiti funkciju puts koja ukazuje na deo prelivanja stack-a. Napadač zna da je prvi bajt canary-ja nula bajt (\x00
) i da su ostali bajtovi canary-ja nasumični. Zatim, napadač može stvoriti prelivanje koje prepisuje stack sve do prvog bajta canary-ja.
Zatim, napadač poziva funkcionalnost puts na sredini payload-a koja će ispisati ceo canary (osim prvog nula bajta).
Sa ovim informacijama, napadač može kreirati i poslati novi napad znajući canary (u istoj sesiji programa).
Očigledno, ova taktika je veoma ograničena jer napadač mora biti u mogućnosti da ispisuje sadržaj svog payload-a kako bi izvukao canary, a zatim bio u mogućnosti da kreira novi payload (u istoj sesiji programa) i pošalje pravi buffer overflow.
CTF primeri:
64 bit, ASLR omogućen ali bez PIE-a, prvi korak je popuniti prelivanje sve do bajta 0x00 canary-ja, zatim pozvati puts i procuriti ga. Sa canary-jem se kreira ROP gedžet koji poziva puts da procuri adresu puts-a iz GOT-a i ROP gedžet da pozove
system('/bin/sh')
32 bit, ARM, bez relro-a, canary, nx, bez pie-a. Prelivanje sa pozivom puts-a na njega da procuri canary + ret2lib pozivanje
system
sa ROP lancem da izbaci r0 (arg/bin/sh
) i pc (adresa system-a)
Proizvoljno Čitanje
Sa proizvoljnim čitanjem kao što je ono koje omogućavaju format stringovi, moguće je procuriti canary. Proverite ovaj primer: https://ir0nstone.gitbook.io/notes/types/stack/canaries i možete pročitati o zloupotrebi format stringova za čitanje proizvoljnih memorijskih adresa u:
pageFormat StringsOvaj izazov zloupotrebljava na veoma jednostavan način format string da pročita canary sa stack-a
Last updated