Tweets by @buherablog
profile for buherator at IT Security Stack Exchange, Q&A for IT security professionals

A BitBetyár Blog

Túljártál a nagyokosok eszén? Küldd be a mutatványodat! (e-mail a buherator gmailkomra jöhet)

Full-Disclosure / Névjegy / Coming out


Promó

H.A.C.K.

Címkék

0day (110) adobe (87) adobe reader (21) anonymous (26) apple (60) az olvasó ír (49) blackhat (20) botnet (22) bug (200) buherablog (44) buhera sörözés (39) bukta (49) deface (38) dns (22) dos (29) esemény (82) facebook (26) firefox (64) flash (33) gondolat (31) google (59) google chrome (36) hacktivity (37) hírek (117) incidens (224) internet explorer (88) iphone (35) java (50) jog (22) kína (21) kriptográfia (68) kultúra (21) linux (24) malware (43) microsoft (142) móka (48) mozilla (23) office (26) oracle (40) os x (43) patch (197) php (20) politika (31) privacy (58) programozás (22) safari (34) sql injection (62) windows (85) xss (77) Címkefelhő

Licensz

Creative Commons Licenc

Bitvadászat: Net/OpenBSD printf para

2009.10.31. 18:40 | buherator | 18 komment

Tegnap söröztünk egy jót Aikonnal, és szóba került, hogy milyen jó is lenne, ha rámennék itt a blogon a "bitközelibb" sebezhetőségekre, pl. kernel bugokra és hasonlókra. Kivitelezési szempontból azonban van egy pár bökkenő:

  • Töredelmesen bevallom (de ez szerintem eddig is kiderült), hogy csak igen felületes ismeretekkel rendelkezem a korszerű hardverközeli exploit módszerek terén
  • Az előzővel összefügg, hogy egy-egy ilyen bug felgöngyölítése és dokumentálása általában egy tapasztalt szakembernek is igen sok idejébe kerül, nekem pedig időből egyre kevesebb van (no nem kell semmi rosszra gondolni :)

Minden esetre a dolog nem hagyott nyugodni, úgyhogy ma csak azért is nekiálltam néhány vonatkozó bugreport átnyálazásának. A próbálkozások igazolták a fenti állításokat: rendszeres posztokat ilyen témában még egy darabig biztosan nem fogok tudni produkálni. 

De! Arra gondoltam, mi lenne, ha megpróbálnánk ezeket a problémákat közös erővel megoldani? Tegyünk egy próbát:

Maksymilian Arciemowicz felfedezett egy problémát a NetBSD, az OpenBSD és még néhány gyártó printf megvalósításában, a probléma részleteit pedig viszonylag szűkszavúan dokumentálta itt. A trükkös kérdés a következő: miért kell a formátumsztringben string típust megadni, miért nem jó a float, illetve milyen más vezérlőkarakterrel képzelhető el az esi és az edi regiszterek felülírása?

A válaszokat kommentben várom, motiváció képpen az első helyes megfejtőnek felajánlok egy sört/tábla csokit, amit a következő sörözésen (vagy más eseményen ahol képviseltetem magam) behajthat!

Ja igen, egyebek mellett ez egy remek lehetőség arra, hogy buta falme-ek helyett mindenki, akinek szüksége van rá megmutassa, mennyire fasza gyerek :)

Címkék: bug buherablog openbsd netbsd az olvasó ír printf

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

P1ngW1n 2009.10.31. 20:48:05

Tényleg csak félve kérdem, hogy Xorl blogja ( ami nem is olyan rég óta ismét megy :)) nem fedi le ezt eléggé ( bár tény, hogy nem magyar ) ?

xorl.wordpress.com/

buherator · http://buhera.blog.hu 2009.11.01. 09:35:21

@P1ngW1n: A kérdést nagyrészt már meg is válaszoltad. A dolog éppen arról szól, hogy valami olyasmit szeretnék nyújtani, mint ami xorl-nél van, de ehhez kevés vagyok egyedül, viszont remélem, hogy mindig lesz valaki, aki szívesen eldebugolgat, a tapasztalatokat meg megosztja a közösséggel.

Tegnap egyébként hegesztettem az oldalsó linkeken, most már többek között xorl is ott van.

sghctoma · http://sghctoma.extra.hu 2009.11.01. 15:28:32

megneztem a dolgot Snow Leopard-on, illetve egy live NetBSD-n (Jibbed), de meg nem jartam teljesen korbe.. erre jutottam eddig:

eloszor is, az emberke allitasa, miszerint "function getint() will be started a few times." hulyeseg (vagy marha faradt vagyok, es nagyon benezek valamit :) ).. printf talal egy csillagot a format string-ben, beolvassa a fieldwidth-et, aztan felzabalja az osszes utana kovetkezo csillagot.. viszont amikor a printf program hivja a printf fuggvenyt, akkor az az egesz format stringet megkapja parameterkent, mind az osszes csillaggal egyutt, es ezt o nem igazan szereti, jol el is szall tole..

SL-n maga a printf program nem enged tobb csillagot egymas utan a format string-ben, tehat ott igy nem lehet elohozni a hibat..

NetBSD-n nekem nem a __vprintf_unlocked-ban, hanem egyel "beljebb", a strlen-ben segfault-ol.. itt a strlen argumentuma a printf programnak megadott masodik argumentum (ha a peldanal maradunk, 666).. a strlen a 666 cimrol nem tud olvasni, ezert szall el.. a __vprintf_unlocked csak akkor hivja a strlen fuggvenyt, ha stringet akarunk megjeleniteni, ezert kell string tipus a format string-be..

hat, kb. ennyi..

synapse · http://www.synsecblog.com 2009.11.02. 14:32:07

Ha lenne idom, raneznek de jelenleg iszonyatosan el vagyok maradva. Majd jovore :)

synapse

sghctoma · http://sghctoma.extra.hu 2009.11.02. 22:43:56

ma volt idom melyebbre asni, ugyhogy telepitettem virtualis gepre egy NetBSD-t, elinditottam a SID Station-t, es nekialltam bitvadaszni :)

mint mar az elozo kommentemben is irtam, a printf fuggveny a ludas, az szall el.. tulajdonkeppen ugyanaz van vele, mint a printf programmal: nem csekkolja, hogy csillag utan csillag jon-e.. maradjunk a Maksymilian altal adott peldanal, tehat hivjuk meg igy a printf-et:

printf("%*********s", 666);

a printf-en belul meghivodik a __vfprintf_unlocked a kovetkezo parameterezessel:

__vfprintf_unlocked(fp, "%*********s", 666);

(az elso argumentum a standard out filepointere)

ez a fuggveny szepen fogja a format string-et, elmegy benne az elso csillagig (vfwprintf.c:878), veszi az argumentumlista elso elemet (666), es beallitja erre az ertekre a width-et.. ezutan fogja a format string kovetkezo karakteret, es mivel az is csillag, veszi az argumentumlista kovetkezo elemet, es megint beallitja a width-et.. a bokkeno az, hogy csak egy argumentumunk van, a 666.. szoval az a 8 felesleges csillag szepen szedegeti a stack-rol az ertekeket.. a kilencedik csillagnal mar benne jarunk a __vfprintf_unlocked-ot hivo printf stack frame-jeben, egesz pontosan a printf format string-jenek cimen vagyunk.. a kovetkezo ertek a stack-en ugye a printf-nek megadott 666..

a csillagok elfogytak, jon egy s, beolvassuk string cimnek a 666-ot.. mivel ez nem egy ervenyes cim, mikor megprobalja hasznalni a fuggveny (vfwprintf.c:1333), megkapjuk a varva vart SIGSEGV-t.. ha nem 's' szerepel a format string-ben, akkor ugye a 666-ot nem memoriacimkent hasznaljuk, ezert nem szall el..

egy megjegyzes: irtam az elozo kommentemben, hogy a live NetBSD-n a strlen-ben szallt el a program.. a tippem az, hogy a 'rendes' NetBSD-ben levo __vfprintf_unlocked-ban a strlen inline-kent van jelen, ezert az segfault-ol..

synapse · http://www.synsecblog.com 2009.11.03. 10:16:14

Nagyon jo leiras toma, koszonjuk :)

Kerestem gyorsan forrast:

cvsweb.netbsd.org/bsdweb.cgi/src/lib/libc/stdio/vfwprintf.c?annotate=1.18

Na itt 1333-on makrot fog ugye hivni. Ennek a define-jat nem talaltam meg sehol a fent emlitett oldalon, ami igy alapjaban veve eleg erdekes.

Viszont ami mindenkepp erdekelne, hogy miert van szerinted koze az inline -kent valo forditasnak ahhoz, hogy a segfault mashol jon elo.

synapse

sghctoma · http://sghctoma.extra.hu 2009.11.03. 10:45:17

orulok, hogy tetszett :)

ott van az a definicio, a 74. sorban..

ha a strlen inline-kent van jelen, akkor nem tortenik fuggvenyhivas, mert ugye a strlen kodja direktben ott van a __vfprintf_unlocked-ban.. szoval ugyananugy a strlen kodjan segfault-ol, csak csak ez a kod nem kulon fuggvenyben van..

synapse · http://www.synsecblog.com 2009.11.03. 11:44:10

Ahaha es tenyleg ott van, nagyonjo mert a gugli nem talalta meg :D

Erre gondoltam en is, persze ez a bug termeszeten semmit nem valtoztat, csak a gdb irja ki hogy ott meg van egy extra fgv hivas (meg egy elhanyagolhato prolog es epilog).

Anyway, nice work :)

buhera: Amugy a kezdemenyezesnek igencsak latom ertelmet, ha lenyugodtak nalam a kedelyek akkor majd esetleg betudok segiteni de nem igerek semmit a kozeljovoben. Ha ennek ellenere postolsz, azert ra probalok nezni.

synapse

buherator · http://buhera.blog.hu 2009.11.03. 16:38:57

Ezzazzzz! Erre gondoltam, kösz sghctoma, volt egy tippem, hogy az első megfejtők között leszel ;) Na, én belelkesedtem, jön még folytatás, hajrá!

Ja, és a sör természetesen behajtható!

sghctoma · http://sghctoma.extra.hu 2009.11.03. 21:41:54

@synapse:
ctrl+f csodakra kepes :P

persze, nem valtoztat semmit, csak azert irtam le, mert az elso hozzaszolasban mondtam, hogy mashol szall el, es tisztazni akartam a dolgot..

@buherator:
egyetertek synapse-szal, jo a kezdemenyezes, nagyon.. raadasul keves oram van, es jelenleg melo sincs, szoval fogok tudni idot szakitani ilyesmire..

a sort nem, de a tabla csokit behajtom :) nem iszom alkoholt.. ha meg nehanapjan megis, az tuti nem sor..

amugy most en is belelkesedtem, ez izgalmasabb, mint crackme-ket oldogatni..

buherator · http://buhera.blog.hu 2009.11.03. 21:45:49

@sghctoma: Ahh, sztrétedzshardkór, csak vigyázz el ne hízz! ;D

sghctoma · http://sghctoma.extra.hu 2009.11.03. 22:01:50

haaat, a sztretedzs azert messze all tolem; sose volt X a kezemen, meg imadom a jo kavet :) az elhizas mar reg bekovetkezett, az a csoki mar nem oszt, nem szoroz.. kulonben is, nem szerepelt az oszibarackle, mint opcio, kenytelen voltam csokit valasztani :P

sghctoma · http://sghctoma.extra.hu 2009.11.04. 08:22:11

@buherator: OK, akkor kovetkezto buhera sorozesen targyalunk..

synapse · http://www.synsecblog.com 2009.11.04. 09:25:01

"ctrl+f csodakra kepes :P"

kicsit napirajzosan: fassegondoltavolna :D

synapse

sghctoma · http://sghctoma.extra.hu 2009.11.04. 13:52:17

@synapse: ha' latod, minden egyes nap tanul valamit aember :D

conscience 2009.11.15. 22:59:55

Szép volt, srácok :)
Ezt a posztot khm... imádom. Izgatottan várom a folytatást. Nem mellékesen, ez két buherator szobrot ér. Egyet az interaktív fejtörőért, egyet pedig a low-level témáért.

Mellékes kérdésként felvetem (bár valószínűleg feltevésem csak zsibbadtságomból adódik), hogy vajon ez a hiba képessé teszi-e kihasználóját az IP manipulálására?

Most jól magatokrahagylak, mert rendesen rámfér egy KV.

Utószó gyanánt még szeretném ismét megköszönni ezt a remek posztot. Csak így tovább :)

conscience 2009.12.16. 07:14:44

@conscience: IP alatt jelen esetben, természetesen az instruction pointerre gondolok. :)