Próbuję odczytać stos procesu potomnego, ale bez powodzenia. Wiem, że to możliwe ptrace
, aleptrace
interfejs pozwala na odczyt tylko jednego słowa na raz, a ja próbuję zeskanować większą część stosu.
Próbowałem również odczytać /proc/$pid/mem
z granic stosu wyodrębnionego z /proc/$pid/maps
pliku po pierwszym użyciu ptrace do dołączenia do niego (jak sugerowano tutaj ), ale odczyt nadal się nie udaje (nawet gdy działa jako root), chociaż ten sam kod kończy się powodzeniem przy próbie odczyt z różnych części procesu (np. sterty).
Co ja robię źle? Czy jest jakaś inna opcja?
waitpid
pomiędzyptrace(PTRACE_ATTACH,…)
iread
(w przeciwnym razie istnieje możliwość wyścigu)? Jaki błądread
powraca? Czy dziecko robi coś szczególnego z mapowaniem pamięci - czy możesz wypróbować kod z prostym dzieckiem, takim jaksleep
?Odpowiedzi:
Więc skorzystaj z pętli. Naprawdę nie rozumiem, z czym to stanowi problem
ptrace
, używam go cały czas do zdalnego dostępu do procesów.Używam czegoś takiego:
źródło
Oto kolejna strategia, która może wymagać ulepszenia, ale powinna być bardziej wydajna przy dużych porcjach danych. Chodzi o wykonanie wywołań systemowych w zdalnym procesie w celu pobrania zawartości stosu. Będzie wymagał określonego kodu architektury, ale jeśli kierujesz reklamy tylko na x86 / x86_64, nie powinno to być zbyt wielkim problemem.
"/tmp/fifo"
w procesie wywoływania.PTRACE_SYSCALL
polecenia krok,waitpid()
oczekiwania iPTRACE_GETREGS
/PTRACE_PEEKTEXT
lub sprawdzić aktualnie wykonywany kod operacji.open("/tmp/fifo")
,write()
zawartość stosu,close()
deskryptor.Mogą istnieć bardziej eleganckie alternatywy dla nazwanej rury, ale nie mogę teraz wymyślić żadnej. Używam tylko syscall, ponieważ zdalne wstrzykiwanie kodu jest dość niewiarygodne w nowoczesnych systemach z powodu różnych zabezpieczeń. Wadą jest to, że zawiesi się, dopóki zdalny proces nie wykona wywołania systemowego (co może stanowić problem w przypadku niektórych programów, które w większości wykonują obliczenia).
W tym pliku źródłowym można zobaczyć trochę wolnego kodu implementującego większość pracy . Informacje zwrotne na temat kodu są mile widziane!
źródło
Kolejna sugestia.
Kiedy / jeśli zostanie zaakceptowany w głównym drzewie jądra Linuksa, będziesz mógł użyć łatki Cross Memory Attach Christophera Yeoha . Zobacz na przykład dokumentację dla process_vm_readv .
źródło
Możesz łatwo odczytać stos innego procesu za pomocą systemu plików proc (w tym celu potrzebujesz dostępu do konta root). Przed arbitralnym odczytaniem z / proc / pid / mem należy zajrzeć do / proc / pid / map. Prosty odczyt w tym pliku pokazuje wiele wpisów. Interesuje nas pozycja oznaczona jako stos. Gdy to otrzymasz, musisz przeczytać dolną i górną granicę stosu. Teraz wystarczy otworzyć plik / proc / pid / mem, przejść do dolnej granicy stosu i odczytać właściwy rozmiar danych.
źródło
mems
a niemaps
? (Nie widzę żadnychmems
wpisów w moim/proc
systemie plików.) OP wspomniał już o czytaniu granic stosu/proc/$pid/maps
- co sugerujesz, że robią inaczej?Możesz spróbować lsstack . Wykorzystuje ptrace, tak jak każdy inny udany program „czytaj stos innego procesu”. Nie mogłem uruchomić programu przy użyciu / proc / $ pid / mem reading. Uważam, że nie możesz tego zrobić w ten sposób, choć logicznie powinieneś.
źródło