쉘 스크립트를 사용하여 바이너리 파일을 바이트 배열이나 16비트 또는 32비트로 읽습니다.

쉘 스크립트를 사용하여 바이너리 파일을 바이트 배열이나 16비트 또는 32비트로 읽습니다.

저는 ARM 기반 모뎀 Linux 호스트에서 작업 중이며 bin 파일을 8, 16 또는 32비트 배열로 읽어야 합니다. 기본적으로 문제의 파일을 암호화해야 하며 비트를 XOR하기 위해 임의의 비트 시퀀스를 사용할 생각입니다(매우 복잡한 시스템은 필요하지 않습니다). Linux 호스트에는 C 또는 PERL 모듈이 없어 사용할 수 없으므로 이를 수행하려면 쉘 스크립트를 사용해야 합니다. 누구든지 이 작업을 수행하는 방법에 대한 조언을 줄 수 있습니까?

답변1

사용 tr(여기서는 rot128):

LC_ALL=C tr '\0-\377' '\200-\377\0-\177' < infile > outfile

XOR 123의 경우 해당 행을 계산해야 합니다 tr.

LC_ALL=C tr '\0-\377' '\173\172\171\170\177\176\175\174\163\162\161\160\167\166\165\164\153\152\151\150\157\156\155\154\143\142\141\140\147\146\145\144\133\132\131\130\137\136\135\134\123\122\121\120\127\126\125\124\113\112\111\110\117\116\115\114\103\102\101\100\107\106\105\104\73\72\71\70\77\76\75\74\63\62\61\60\67\66\65\64\53\52\51\50\57\56\55\54\43\42\41\40\47\46\45\44\33\32\31\30\37\36\35\34\23\22\21\20\27\26\25\24\13\12\11\10\17\16\15\14\3\2\1\0\7\6\5\4\373\372\371\370\377\376\375\374\363\362\361\360\367\366\365\364\353\352\351\350\357\356\355\354\343\342\341\340\347\346\345\344\333\332\331\330\337\336\335\334\323\322\321\320\327\326\325\324\313\312\311\310\317\316\315\314\303\302\301\300\307\306\305\304\273\272\271\270\277\276\275\274\263\262\261\260\267\266\265\264\253\252\251\250\257\256\255\254\243\242\241\240\247\246\245\244\233\232\231\230\237\236\235\234\223\222\221\220\227\226\225\224\213\212\211\210\217\216\215\214\203\202\201\200\207\206\205\204'

보다 일반적으로 질문에 대답하려면 표준 명령을 통해 셸에서 사용할 수 있도록 파일을 숫자 배열로 변환하세요.

set -- $(od -An -vtu1 < infile)

그런 다음 필요한 변환을 적용하고 awks를 사용하여 파일 로 다시 변환할 수 있습니다 printf("%c").

그러나 이는 매우 비효율적입니다.

좋다:

for i in $(od -An -vtu1 < infile); do
  echo "$(($i ^ 123))"
done | awk '{printf "%c", $0}' > outfile

,를 사용하여 16비트 숫자를 얻을 수 있지만 od -An -vtu2기본 바이트 순서이므로 문자로 다시 변환할 때 이를 고려해야 합니다.

답변2

대부분의 쉘 변수에서는 널 종결자를 사용할 수 없습니다(아니면 가능하지만 일반적으로 저장되는 방식이기 때문에 종결됩니다). 따라서 이는 바이너리 읽기에 대한 매우 중요한 경고입니다.

당신이 가지고 있다면 xxd:

xxd -b | awk '{ for(i=2 ; i<=NF-1 ; i++) { print $i } }'

예를 들어:

echo -n mayonnaise | xxd -b | awk '{ for(i=2 ; i<=NF-1 ; i++) { print $i } }'
01101101
01100001
01111001
01101111
01101110
01101110
01100001
01101001
01110011
01100101

답변3

나는 이 매우 조잡한 함수를 두 개의 128바이트 파일을 XOR하는 데 사용합니다.

one_time_pad() {
    asrc="$1"
    bsrc="$2"
    dst="$3"

    atmp="`mktemp`"
    btmp="`mktemp`"

    hexdump -v -e '1/1 "%02x" " "' "$asrc" > "$atmp"
    hexdump -v -e '1/1 "%02x" " "' "$bsrc" > "$btmp"

    rm "$dst"
    touch "$dst"

    for i in `seq 1 128`
    do
        a=`awk '{print $'$i';}' < "$atmp"`
        b=`awk '{print $'$i';}' < "$btmp"`

        echo -n -e '\x'`printf "%x" $((0x$a^0x$b))` >> "$dst"
    done
}

one_time_pad in1 in2 out

성능 관점에서 이것은 끔찍합니다(각 바이트에 대해 awk를 두 번 호출합니다!). 제가 아는 한 성능은 전혀 문제가 되지 않습니다. 나는 당신이 더 나은 방법을 찾을 수 있다고 확신합니다.

관련 정보