House of Orange

Ondersteun HackTricks

Basiese Inligting

Kode

Doel

  • Misbruik die malloc_printerr-funksie

Vereistes

  • Oorskryf die boonste brokkie grootte

  • Libc en heap lekke

Agtergrond

Sommige nodige agtergrond uit die kommentaar van hierdie voorbeeld:

Die saak is, in ouer weergawes van libc, toe die malloc_printerr-funksie geroep is, sou dit deur 'n lys van _IO_FILE-strukture wat in _IO_list_all gestoor is, blaai, en eintlik 'n instruksie-aanwysers in daardie struktuur uitvoer. Hierdie aanval sal 'n vals _IO_FILE-struktuur vervals wat ons na _IO_list_all sal skryf, en veroorsaak dat malloc_printerr loop. Dan sal dit uitvoer watookal adres ons in die _IO_FILE-strukture se springtafel gestoor het, en ons sal kode-uitvoering kry

Aanval

Die aanval begin deur die boonste brokkie binne die ongesorteerde bin te bestuur. Dit word bereik deur malloc te roep met 'n groter grootte as die huidige boonste brokkie grootte maar kleiner as mmp_.mmap_threshold (standaard is 128K), wat andersins mmap toekenning sou veroorsaak. Wanneer die boonste brokkie grootte gewysig word, is dit belangrik om te verseker dat die boonste brokkie + sy grootte bladsy-uitgelyn is en dat die prev_inuse-bit van die boonste brokkie altyd ingestel is.

Om die boonste brokkie binne die ongesorteerde bin te kry, allokeer 'n brokkie om die boonste brokkie te skep, verander die boonste brokkie grootte (met 'n oorvloei in die toegewysde brokkie) sodat boonste brokkie + grootte bladsy-uitgelyn is met die prev_inuse-bit wat ingestel is. Allokeer dan 'n brokkie groter as die nuwe boonste brokkie grootte. Let daarop dat free nooit geroep word om die boonste brokkie in die ongesorteerde bin te kry nie.

Die ou boonste brokkie is nou in die ongesorteerde bin. Mits ons data binne-in dit kan lees (moontlik as gevolg van 'n kwesbaarheid wat ook die oorvloei veroorsaak het), is dit moontlik om libc-adresse daaruit te lek en die adres van _IO_list_all te kry.

'n Ongeordende bin-aanval word uitgevoer deur die oorvloei te misbruik om topChunk->bk->fwd = _IO_list_all - 0x10 te skryf. Wanneer 'n nuwe brokkie toegewys word, sal die ou boonste brokkie verdeel word, en 'n aanwysing na die ongesorteerde bin sal in _IO_list_all geskryf word.

Die volgende stap behels die verkleining van die grootte van die ou boonste brokkie om in 'n klein bin te pas, spesifiek deur sy grootte na 0x61 in te stel. Dit dien twee doeleindes:

  1. Invoeging in Klein Bin 4: Wanneer malloc deur die ongesorteerde bin skandeer en hierdie brokkie sien, sal dit probeer om dit in klein bin 4 in te voeg weens sy klein grootte. Dit maak dat die brokkie aan die kop van die klein bin 4-lys beland wat die ligging van die FD-aanwyser van die brokkie van _IO_list_all is aangesien ons 'n naby adres in _IO_list_all geskryf het via die ongesorteerde bin-aanval.

  2. Aanroeping van 'n Malloc Kontrole: Hierdie brokkie grootte-manipulasie sal veroorsaak dat malloc interne kontroles uitvoer. Wanneer dit die grootte van die valse voorwaartse brokkie nagaan, wat nul sal wees, veroorsaak dit 'n fout en roep malloc_printerr aan.

Die manipulasie van die klein bin sal jou toelaat om die voorwaartse aanwyser van die brokkie te beheer. Die oorvleuel met _IO_list_all word gebruik om 'n vals _IO_FILE-struktuur te vervals. Die struktuur word sorgvuldig saamgestel om sleutelvelde soos _IO_write_base en _IO_write_ptr in te sluit wat ingestel is op waardes wat interne kontroles in libc slaag. Daarbenewens word 'n springtafel binne-in die valse struktuur geskep, waar 'n instruksie-aanwyser na die adres waar arbitrêre kode (bv., die system-funksie) uitgevoer kan word, ingestel is.

Om die res van die tegniek saam te vat:

  • Verklein die Ou Boonste Brokkie: Stel die grootte van die ou boonste brokkie in op 0x61 om dit in 'n klein bin te pas.

  • Stel die Valse _IO_FILE-Struktuur op: Oorvleuel die ou boonste brokkie met die valse _IO_FILE-struktuur en stel velde toepaslik in om beheer vloei te ontvoer.

Die volgende stap behels die vervalsing van 'n valse _IO_FILE-struktuur wat oorvleuel met die ou boonste brokkie wat tans in die ongesorteerde bin is. Die eerste bytes van hierdie struktuur word sorgvuldig saamgestel om 'n aanwyser na 'n bevel (bv., "/bin/sh") wat uitgevoer sal word, in te sluit.

Sleutelvelde in die valse _IO_FILE-struktuur, soos _IO_write_base en _IO_write_ptr, word ingestel op waardes wat interne kontroles in libc slaag. Daarbenewens word 'n springtafel binne-in die valse struktuur geskep, waar 'n instruksie-aanwyser na die adres waar arbitrêre kode uitgevoer kan word, ingestel is. Tipies sal dit die adres van die system-funksie of 'n ander funksie wees wat skelmaanwysings kan uitvoer.

Die aanval bereik 'n hoogtepunt wanneer 'n oproep na malloc die uitvoering van die kode deur die gemanipuleerde _IO_FILE-struktuur veroorsaak. Dit maak dit moontlik om arbitrêre kode uit te voer, wat tipies lei tot 'n skul of 'n ander skadelike lading wat uitgevoer word.

Opsomming van die Aanval:

  1. Stel die boonste brokkie op: Allokeer 'n brokkie en wysig die boonste brokkie grootte.

  2. Dwing die boonste brokkie in die ongesorteerde bin: Allokeer 'n groter brokkie.

  3. Lek libc-adresse: Gebruik die kwesbaarheid om uit die ongesorteerde bin te lees.

  4. Voer die ongesorteerde bin-aanval uit: Skryf na _IO_list_all deur 'n oorvloei.

  5. Verklein die ou boonste brokkie: Stel sy grootte in om in 'n klein bin te pas.

  6. Stel 'n valse _IO_FILE-struktuur op: Vervals 'n valse lêerstruktuur om beheer vloei te ontvoer.

  7. Trigger kode-uitvoering: Allokeer 'n brokkie om die aanval uit te voer en arbitrêre kode uit te voer.

Hierdie benadering maak gebruik van hoopbestuursmeganismes, libc-inligtingslekke, en hoopoorvloeie om kode-uitvoering te bereik sonder om direk free te roep. Deur die valse _IO_FILE-struktuur sorgvuldig saam te stel en dit op die regte plek te plaas, kan die aanval die beheer vloei tydens standaard geheue-toekenningsoperasies ontvoer. Dit maak die uitvoering van arbitrêre kode moontlik, wat moontlik lei tot 'n skul of ander skadelike aktiwiteite.

Verwysings

Ondersteun HackTricks

Last updated