Modificando um byte com bash, dd não está funcionando

0

Estou tentando modificar um byte com bash,

Então eu escreverei os bytes antes do deslocamento, depois o byte a ser modificado e o resto do arquivo.

Mas o script a seguir não funciona como esperado

Alguém por favor dê uma olhada? Não foi possível descobrir qual parte está errada

#!/bin/bash

file=/etc/passwd
out=passwd.mod
offset=0x5

dd if="$file" of="$out" conv=notrunc bs=1 count=$(($offset - 1))
printf '\x41' | dd of="$out" conv=notrunc bs=1 seek=$(($offset))
dd if="$file" of="$out" conv=notrunc bs=1 skip=$(($offset + 1))
    
por daisy 13.04.2016 / 05:14

3 respostas

1

Se eu entendi corretamente, acredito que isso funcionará para você:

#!/bin/bash

file=passwd.orig
out=passwd.mod
offset=0x5

dd if="$file" of="$out" conv=notrunc bs=1 count=$(($offset))
printf '\x41' | dd of="$out" conv=notrunc bs=1 seek=$(($offset))
dd if="$file" of="$out" conv=notrunc bs=1 seek=$((offset+1)) skip=$(($offset + 1))

Você precisa de ambos os seek para colocar a "cabeça de gravação" na posição correta e skip para evitar que esses bytes sejam gravados (novamente) na saída.

Melhor

Se tudo que você precisa fazer é alterar (substituir) um byte, você pode fazer isso diretamente em uma cópia do arquivo, como este simples par de comandos (e POSIX) fará:

#!/bin/sh

file=passwd.orig      out=passwd.mod         offset=0x05

cp "$file" "$out"
printf '\x41' | dd of="$out" conv=notrunc bs=1 seek=$(($offset))

Se você quiser "inserir" um byte, precisará dos comandos acima, mas com algumas alterações nos deslocamentos. Por favor, pergunte se é isso que você precisa.

    
por 13.04.2016 / 05:31
1

Você perdeu o seek no último comando:

dd if="$file" of="$out"  \
  conv=notrunc           \
  bs=1                   \
  skip="$((offset + 1))" \
  seek="$((offset + 1))"

skip=n ignora o bloco de entrada do arquivo de entrada antes de copiar, seek=n ignora o bloco de entrada do arquivo de saída antes de copiar. Você precisa dos dois para corrigir corretamente o offset.

    
por 13.04.2016 / 05:31
1

Dois problemas:

1) dd if="$file" of="$out" parece sobrescrever $ out em algum momento.
2) Mesmo permitindo isso, o count = , skip = , & A lógica seek = perde    um byte em algum lugar lá.

Em vez disso, tente algo assim:

file=/etc/passwd
out=passwd.mod
offset=0x5

dd if="$file" of="$out" conv=notrunc bs=1 count=$offset
printf '\x41' >> $out
dd if="$file"  conv=notrunc bs=1 skip=$(($offset + 1)) >> $out

Ajuste $ offset para dar ou receber alguns, conforme necessário - já que foi desativado antes que seja apenas o meu palpite.

    
por 13.04.2016 / 05:58

Tags