Przez przypadek nadpisałem bardzo skomplikowany skrypt bash, w którym próbowałem zaimplementować scoping i wątki w uporządkowany sposób.
Teraz ten sam skrypt nadal działa, ale pliku już nie ma, pytanie brzmi: czy można skanować ram i znaleźć reprezentację żądań samego pliku?
Kolejny problem: nie mogę znaleźć pliku / dev / mem lub / dev / kmem, już próbowałem go grepować dla zawartości.
Do środowiska: Hostet maszyny debian / sid (vps) na stronie vpsfx.com
root @ heisenberg: ~ # ls -a / dev . kmsg ptyp2 ptyp9 losowy tty1 tty5 ttyp2 ttyp9 urandom .. log ptyp3 ptypa shm tty10 tty6 ttyp3 ttypa xconsole .udev null ptyp4 ptypb stderr tty11 tty7 ttyp4 ttypb zero char ptmx ptyp5 ptypc stdin tty12 tty8 ttyp5 ttypc konsola pts ptyp6 ptypd stdout tty2 tty9 ttyp6 ttypd fd ptyp0 ptyp7 ptype tty tty3 ttyp0 ttyp7 ttype pełny ptyp1 ptyp8 ptypf tty0 tty4 ttyp1 ttyp8 ttypf
/proc
fs nie rezydują w pamięci RAM. W rzeczywistości, to nie ma miejsca zamieszkania w dowolnym miejscu . Zobacz unix.stackexchange.com/questions/74713/… . Chociaż możesz pobrać fd z/proc
,cat
ing odczytuje plik z fs, a nie RAM. To prawda, że usunąłeś plik, zmniejszając liczbę odwołań do i-węzłów i nikt już go nie widzi, ale tak naprawdę nie jest usuwany z fs, dopóki proces uruchamiający skrypt nie zamknie go. Zobacz stackoverflow.com/questions/2028874/… .Zakładając, że OP naprawdę znaczył z pamięci RAM, a nie w żaden możliwy sposób , i zakładając, że proces, w którym skrypt został wykonany, ma zerowy limit plików podstawowych (co zwykle jest ustawieniem domyślnym
cat /proc/PID/limits
), wtedy musisz dołączyć do procesu i albo ustaw limit rdzenia na wystarczająco dużą wartość, aby uwzględnić obraz procesu i użyj sygnału ABRT do wygenerowania pliku rdzenia, lub użyj takiego narzędzia,gdb
które może dołączyć do procesu i wygenerować obraz rdzenia procesu z pamięci RAM.gdb
W niektórych powłokach z taką samą własnością jak uruchomiony skrypt lub własność root:
ps ax
znaleźć identyfikator procesu (PID)gdb -p PID
Zauważ, że zatrzyma to kontynuowanie wykonywania procesu, ale nie usunie go z tabeli procesów.
generate-core-file
gdb powinien odpowiedzieć na coś podobnego
Saved corefile core.15113
, zakładając, że PID to 15113.detach
Twój skrypt będzie kontynuował (wznawianie) działania.
quit
strings core.15113 > my_script.sh
Otwórz
my_script.sh
w jakimś edytorze. Tekst skryptu powinien znajdować się na końcu pliku przed sekcją środowiska. Użyj edytora, aby zeskrobać sekcje przed i po skrypcie.Przetestuj to rozwiązanie na innym skrypcie, zanim użyjesz go w skrypcie nagrody. YMMV.
Sekwencja wygląda następująco:
źródło
dd partycję dysku twardego w nakładających się fragmentach i grep binary dla części skryptu. jeśli masz szczęście, wypisz te fragmenty do tymczasowego katalogu w pamięci RAM, aby się w nim zapisać i zapisać cykle zapisu na dysku twardym lub ssd. nie, to nie jest rozwiązanie „z pamięci RAM”. pamiętaj o tym, że podczas odczytu dysku bajty po bajcie skrypty mogą być w formacie zestawu znaków utf-8 (lub podobnym), więc parametry grep mogą również wymagać dostosowania.
źródło