xxdからいくつかの出力を取得し、手動で使用可能なシェルコードに変換するのは面白くないので、あなたの仕事はプロセスを自動化することです。
ルール
あなたの提出物は、関数、ラムダ、スクリプト、またはそれらの合理的な同等物です。結果を印刷するか、提出物が関数/ラムダである場合、それを返すこともできます。
プログラムは3つの引数を取る必要があります。最初の引数は、次のように、ファイル名以外の引数なしで実行されたxxdの出力を含む文字列ですxxd some_file
。最初の引数がどのように見えるかの例を次に示します。
00000000: 31c0 b046 31db 31c9 cd80 eb16 5b31 c088 1..F1.1.....[1..
00000010: 4307 895b 0889 430c b00b 8d4b 088d 530c C..[..C....K..S.
00000020: cd80 e8e5 ffff ff2f 6269 6e2f 7368 4e58 ......./bin/shNX
00000030: 5858 5859 5959 59 XXXYYYY
バイトを含む中央セクション(の後の最初の8列:
)を取得し、空白を削除してシェルコードに変換し、\x
各バイトの前にaを置く必要があります。
上記の入力に対する出力は次のとおりです(他の引数は無視します):
\x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\xeb\x16\x5b\x31\xc0\x88\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d\x53\x0c\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x4e\x58\x58\x58\x58\x59\x59\x59\x59
最初の引数は常に有効なxxd出力であり、ファイル名以外の引数なしで実行されると想定できます。
また、出力は、バックスラッシュがエスケープ文字として使用されないリテラルのバックスラッシュである文字列である必要があります。したがって、「\ x65」と言うとき、バイト0x65についても、文字「A」についても話していません。コードでは、文字列「\ x65」になります。
2番目の引数は、xxd出力のシェルコードの開始位置を指定し、3番目の引数は終了位置を指定します。3番目の引数がの場合、-1
xxd出力の最後で終了します。2番目と3番目の引数も常に負ではありませんが、3番目が-1
以下にテストケースを示します。
引数1:
00000000: 31c0 b046 31db 31c9 cd80 eb16 5b31 c088 1..F1.1.....[1..
00000010: 4307 895b 0889 430c b00b 8d4b 088d 530c C..[..C....K..S.
00000020: cd80 e8e5 ffff ff2f 6269 6e2f 7368 4e58 ......./bin/shNX
00000030: 5858 5859 5959 59 XXXYYYY
引数2 7
:、引数3:(e
これらは両方とも16進数を表す文字列です)
出力: \xc9\xcd\x80\xeb\x16\x5b\x31\xc0
引数1:
00000000: 31c0 b046 31db 31c9 cd80 eb16 5b31 c088 1..F1.1.....[1..
00000010: 4307 895b 0889 430c b00b 8d4b 088d 530c C..[..C....K..S.
00000020: cd80 e8e5 ffff ff2f 6269 6e2f 7368 4e58 ......./bin/shNX
00000030: 5858 5859 5959 59 XXXYYYY
引数2 0
:、引数3:2e
出力: \x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\xeb\x16\x5b\x31\xc0\x88\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d\x53\x0c\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x4e
引数1:
00000000: 31c0 b046 31db 31c9 cd80 eb16 5b31 c088 1..F1.1.....[1..
00000010: 4307 895b 0889 430c b00b 8d4b 088d 530c C..[..C....K..S.
00000020: cd80 e8e5 ffff ff2f 6269 6e2f 7368 4e58 ......./bin/shNX
00000030: 5858 5859 5959 59 XXXYYYY
引数2 a
:、引数3:-1
出力: \xeb\x16\x5b\x31\xc0\x88\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d\x53\x0c\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x4e\x58\x58\x58\x58\x59\x59\x59\x59
最小バイトのコードが優先されます。受賞者は、2016年8月15日の7日間で発表されます(ただし、それ以降の提出は大歓迎です)。
更新
@Adnan、おめでとうございます!
~
代わりに\x7e
。そして、\t
代わりに戻ることができ\x09
ますか?
7
、ゼロベースのインデックスのように見えe
、1ベースのインデックスです(e-7=7
ただし、出力には8つの16進コードがあります)か、何かを見落としていますか?