hacktricks/reversing-and-exploiting/linux-exploiting-basic-esp/format-strings
2024-03-29 21:15:52 +00:00
..
format-strings-template.md Translated ['README.md', 'backdoors/salseo.md', 'cryptography/certificat 2024-03-29 21:15:52 +00:00
README.md Translated ['README.md', 'backdoors/salseo.md', 'cryptography/certificat 2024-03-29 21:15:52 +00:00

Formaat Strings

Leer AWS hak vanaf nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Basiese Inligting

In C is printf 'n funksie wat gebruik kan word om 'n string af te druk. Die eerste parameter wat hierdie funksie verwag, is die rou teks met die formateerders. Die volgende parameters wat verwag word, is die waardes om die formateerders van die rou teks te vervang.

Die kwesbaarheid verskyn wanneer 'n aanvallersteks as die eerste argument aan hierdie funksie voorsien word. Die aanvaller sal in staat wees om 'n spesiale inset te skep wat die printf-formaatstring-vermoëns misbruik om enige data in enige adres te skryf. Deur dit op hierdie manier te doen, kan hulle willekeurige kode uitvoer.

Formateerders:

%08x —> 8 hex bytes
%d —> Entire
%u —> Unsigned
%s —> String
%n —> Number of written bytes
%hn —> Occupies 2 bytes instead of 4
<n>$X —> Direct access, Example: ("%3$d", var1, var2, var3) —> Access to var3

%n skryf die aantal geskryfde bytes in die aangeduide adres. Om enige data te skryf, skryf soveel bytes as die heksadesimale nommer wat ons moet skryf.

AAAA%.6000d%4\$n —> Write 6004 in the address indicated by the 4º param
AAAA.%500\$08x —> Param at offset 500

Uitbuitingsvloei

Soos voorheen verduidelik, maak hierdie kwesbaarheid dit moontlik om enigiets in enige adres te skryf (arbitrêre skryf).

Die doel sal wees om die adres van 'n funksie in die GOT-tabel te oorskryf wat later geroep sal word. Ideaal gesproke kan ons die adres instel op 'n shell-kode wat in 'n uitvoerbare gedeelte geleë is, maar dit is baie waarskynlik dat jy nie 'n shell-kode in 'n uitvoerbare gedeelte kan skryf nie.
Dus 'n ander opsie is om 'n funksie te oorskryf wat sy argumente van die gebruiker ontvang en dit te rig na die system-funksie.

Om die adres te skryf, word gewoonlik 2 stappe gedoen: Jy skryf eers 2 grepe van die adres en dan die ander 2. Om dit te doen word $hn gebruik.

HOB word geroep vir die 2 hoër grepe van die adres
LOB word geroep vir die 2 laer grepe van die adres

Dus, as gevolg van hoe die formaatstring werk, moet jy eerstens die kleinste van [HOB, LOB] skryf en dan die ander een.

As HOB < LOB
[adres+2][adres]%.[HOB-8]x%[offset]\$hn%.[LOB-HOB]x%[offset+1]

As HOB > LOB
[adres+2][adres]%.[LOB-8]x%[offset+1]\$hn%.[HOB-LOB]x%[offset]

HOB LOB HOB_shell-kode-8 NºParam_dir_HOB LOB_shell-HOB_shell NºParam_dir_LOB

`python -c 'print "\x26\x97\x04\x08"+"\x24\x97\x04\x08"+ "%.49143x" + "%4$hn" + "%.15408x" + "%5$hn"'`

Pwntools-sjabloon

Jy kan 'n sjabloon vind om 'n uitbuiting vir hierdie soort kwesbaarheid voor te berei in:

{% content-ref url="format-strings-template.md" %} format-strings-template.md {% endcontent-ref %}

Leer AWS-hacking vanaf nul tot held met htARTE (HackTricks AWS Red Team Expert)!