/ / Perl úložisko pamäte príkazového riadku - perl, pretečenie zásobníka

Perl skladovanie pamäte príkazového riadku - Perl, stoh-pretečenie

Snažím sa odovzdať argument príkazového riadku do programu „notesearch.c“, aby som preplnil vyrovnávaciu pamäť a prepísal spiatočnú adresu na 0x00007fff9e89b2e7 v malom formáte endian pomocou príkazu:

./notesearch $ (perl -e „print“ xe7xb2x89x9exffx7fx00x00 "x 20 ")

Hodnota uložená v argv[1] je však:

0x7fff9cd441cc: 0xe7 0xb2 0x89 0x9e 0xff 0x7f 0xe7 0xb2

0x7fff9cd441d4: 0x89 0x9e 0xff 0x7f 0xe7 0xb2 0x89 0x9e

0x7fff9cd441dc: 0xff 0x7f 0xe7 0xb2 0x89 0x9e 0xff 0x7f ......

Nuly nie sú uložené! Takže skutočná 64-bitová prepísaná návratová adresa môže byť akoukoľvek permutáciou nenulových hexadecimálnych číslic. Ako uložím aj nuly?

odpovede:

2 pre odpoveď č. 1

Na unixovom systéme nie je možné odovzdať argumenty obsahujúce znaky.

Perl je schopný tlačiť "s a niektoré shelly môžu byť schopné ponechať ich v internej reprezentácii príkazového riadku, ale keď shell spustí iný program, urobí to s execve syscall (všetky rutiny vykonávania programov vyššej úrovne sú postavené na execve). Formát súboru argv prešiel na execve je pole ukončené NULL - ukončené reťazce.

Toto je jadro ABI na vykonávanie programu; nedá sa to obísť. Mohol by si takmer reimplementácia execve v užívateľskom priestore s vaším vlastným analyzátorom ELF, ale iba jadro vám môže poskytnúť eskaláciu privilégií bitov set-id a jadro to urobí iba vtedy, keď zavoláte execve.