É possível recuperar o conteúdo de um script bash em execução do ram

16

Eu acidentalmente escrevi um script bash muito complexo, em que tentei implementar o escopo e a segmentação de maneira organizada

agora o mesmo script ainda está em execução, mas o arquivo não está mais, a pergunta é: É possível escanear através da memória RAM e encontrar a representação do arquivo em si?

Outro problema é: não consigo encontrar o arquivo / dev / mem ou / dev / kmem, já tentei usar o grep para o conteúdo

Para o ambiente: É um host da máquina debian / sid (vps) no vpsfx.com

root@heisenberg:~# ls -a /dev
.        kmsg   ptyp2  ptyp9  random  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
console  pts    ptyp6  ptypd  stdout  tty2   tty9   ttyp6  ttypd
fd       ptyp0  ptyp7  ptype  tty     tty3   ttyp0  ttyp7  ttype
full     ptyp1  ptyp8  ptypf  tty0    tty4   ttyp1  ttyp8  ttypf
    
por Thomas Nordquist 25.12.2013 / 16:11

3 respostas

15

Dê uma olhada em / proc / $ PID / fd. Lá você deve ter todos os descritores de arquivos abertos pelo processo, incluindo o próprio script. Apenas cat $FD > /tmp/yourscript.sh deve ser suficiente para recuperá-lo.

    
por 25.12.2013 / 22:51
14

Supondo que o OP realmente significou da RAM e não qualquer forma possível , e assumindo que o processo no qual o script foi executado tem zero de limite de arquivo principal (que é geralmente a configuração padrão, cat /proc/PID/limits ), então você precisa anexar ao processo e definir o limite do núcleo para um valor grande o suficiente para incluir a imagem do processo e usar o sinal ABRT para gerar o arquivo principal ou usar uma ferramenta como gdb que pode anexar a um processo e gerar uma imagem principal do processo a partir da RAM.

  1. Instale gdb

Em algum shell com a mesma propriedade do script em execução ou da propriedade raiz:

  1. Do ps ax para encontrar o ID do processo (PID)
  2. gdb -p PID

Observe que isso interromperá a execução do processo, mas não o removerá da tabela de processos.

  1. No gdb, emita o comando generate-core-file

O gdb deve responder com algo como Saved corefile core.15113 , supondo que o PID seja 15113.

  1. No gdb, emita o comando detach

Seu script continuará (continua) em execução.

  1. No gdb, emita o comando quit
  2. No shell, execute strings core.15113 > my_script.sh

Abra o my_script.sh em algum editor. Seu texto de script deve estar no final do arquivo antes da seção de ambiente. Use o editor para raspar as seções antes e depois do script.

Teste esta solução em outro script antes de usá-lo no seu script de prêmios. YMMV.

A sequência é assim:

yba@tavas:~$ gdb -p 15113
GNU gdb (GDB) 7.4.1-debian
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Attaching to process 15113
Reading symbols from /bin/bash...(no debugging symbols found)...done.
Reading symbols from /lib/x86_64-linux-gnu/libtinfo.so.5...(no debugging symbols found)...done.
Loaded symbols for /lib/x86_64-linux-gnu/libtinfo.so.5
Reading symbols from /lib/x86_64-linux-gnu/libdl.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib/x86_64-linux-gnu/libdl.so.2
Reading symbols from /lib/x86_64-linux-gnu/libc.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib/x86_64-linux-gnu/libc.so.6
Reading symbols from /lib64/ld-linux-x86-64.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib64/ld-linux-x86-64.so.2
0x00007feaf4b4c7be in waitpid () from /lib/x86_64-linux-gnu/libc.so.6
(gdb) generate-core-file
Saved corefile core.15113
(gdb) detach
Detaching from program: /bin/bash, process 15113
(gdb) quit
yba@tavas:~$ 
    
por 25.12.2013 / 22:43
0

dd a partição do disco rígido em blocos sobrepostos e binário do grep para partes do script. Se você tiver sorte, escreva esses pedaços no diretório temporário do RAM para salvar o seu disco rígido ou os ciclos de gravação do ssd. não, não é uma solução 'de ram'. esteja ciente do fato de que, ao ler scripts de byte de disco em byte, pode estar no formato de conjunto de caracteres utf-8 (ou similar), assim os parâmetros grep podem ter que ser também adaptados.

    
por 10.06.2018 / 16:16