/ / Pamięć wiersza poleceń Perla - perl, przepełnienie stosu

Perl - pamięć linii poleceń - perl, over-stack

Próbuję przekazać argument wiersza poleceń do programu „notesearch.c” w celu przepełnienia bufora i przepisania adresu powrotu na 0x00007fff9e89b2e7 w formacie little endian za pomocą polecenia:

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

Jednak wartość przechowywana w argv [1] to:

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 ......

Zera nie są przechowywane! Tak więc rzeczywisty 64-bitowy nadpisany adres zwrotny może być dowolną permutacją niezerowych cyfr szesnastkowych. Jak przechowywać również zera?

Odpowiedzi:

2 dla odpowiedzi № 1

W systemie uniksopodobnym nie jest możliwe przekazanie argumentów zawierających postacie.

Perl jest w stanie drukować „s, a niektóre powłoki mogą być w stanie zachować je w wewnętrznej reprezentacji wiersza poleceń, ale gdy powłoka uruchomi inny program, zrobi to za pomocą execve syscall (wszystkie procedury wykonywania wyższego poziomu są zbudowane na wierzchu execve). Format pliku argv przeszedł do execve jest tablicą zakończoną NULL zakończone łańcuchy.

To jest jądro ABI do wykonywania programu; nie ma sposobu na obejście tego prawie reimplement execve w przestrzeni użytkownika z własnym parserem ELF, ale tylko jądro może dać ci eskalację przywilejów bitów id-set, a jądro robi to tylko wtedy, gdy dzwonisz execve.