Tomar alguma saída do xxd e transformá-lo em código de shell utilizável manualmente não é divertido, portanto, seu trabalho é automatizar o processo.
Regras
Seu envio pode ser uma função, lambda, script ou qualquer equivalente razoável deles. Você pode imprimir o resultado ou, se o seu envio for uma função / lambda, também poderá devolvê-lo.
Você programa deverá ter três argumentos, o primeiro sendo uma string contendo a saída de xxd, correu com nenhum outro do que um nome de arquivo argumentos, como este: xxd some_file
. Aqui está um exemplo de como será o primeiro argumento:
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
Você precisa pegar a seção do meio que contém os bytes (as 8 primeiras colunas após a :
) e transformá-la em código de shell removendo qualquer espaço em branco e colocando um \x
antes de cada byte.
Aqui está o que a saída deve ser para a entrada acima (ignorando quaisquer outros argumentos):
\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
Você pode assumir que o primeiro argumento sempre será uma saída xxd válida, executada sem nenhum argumento além do nome do arquivo.
Sua saída também deve ser uma sequência em que as barras invertidas são barras invertidas literais, não usadas como caracteres de escape. Então, quando digo "\ x65", não estou falando do byte 0x65 ou mesmo da letra "A". No código, seria a string "\ x65".
O segundo argumento especifica onde na saída xxd o código do shell deve iniciar e o terceiro especifica onde deve terminar. Se o terceiro argumento for -1
, ele terminará no final da saída xxd. O segundo e o terceiro argumento também sempre serão não negativos, exceto quando o terceiro for-1
Aqui estão alguns casos de teste:
Argumento 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
Argumento 2:, 7
Argumento 3: e
(ambas são cadeias que representam números hexadecimais)
Resultado: \xc9\xcd\x80\xeb\x16\x5b\x31\xc0
Argumento 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
Argumento 2:, 0
Argumento 3:2e
Resultado: \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
Argumento 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
Argumento 2:, a
Argumento 3:-1
Resultado: \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
O código com menos bytes vence. O vencedor será anunciado em sete dias, em 15 de agosto de 2016 (mas as inscrições depois disso ainda serão apreciadas).
Atualizar
Parabéns a @Adnan por vencer o desafio!
~
vez de \x7e
. E podemos voltar em \t
vez de \x09
?
7
parece um índice baseado em zero e e
é um índice baseado em um ( e-7=7
mas há 8 códigos hexadecimais em sua saída), ou estou ignorando alguma coisa?