Tomar algo de salida de xxd y convertirlo en un código de shell utilizable a mano no es divertido, por lo que su trabajo es automatizar el proceso.
Reglas
Su envío puede ser una función, lambda, script o cualquier equivalente razonable de esos. Puede imprimir el resultado, o si su envío es una función / lambda, también puede devolverlo.
Usted programa debe tomar tres argumentos, el primero en ser una cadena que contiene la salida de xxd, corrió sin argumentos distintos de un nombre de archivo, como esto: xxd some_file. Aquí hay un ejemplo de cómo se verá el primer 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
Debe tomar esa sección del medio que contiene los bytes (las primeras 8 columnas después de la :) y convertirla en shellcode eliminando cualquier espacio en blanco, luego colocando un \xantes de cada byte.
Esto es lo que debería ser la salida para la entrada anterior (ignorando cualquier otro argumento):
\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
Puede suponer que el primer argumento siempre será una salida xxd válida, ejecutada sin otros argumentos que el nombre del archivo.
Su salida también debe ser una cadena donde las barras diagonales inversas son barras diagonales inversas, no utilizadas como caracteres de escape. Entonces, cuando digo "\ x65", no estoy hablando del byte 0x65, ni siquiera de la letra "A". En código, sería la cadena "\ x65".
El segundo argumento especifica en qué parte de la salida xxd debe comenzar el shellcode, y el tercero especifica dónde debe terminar. Si el tercer argumento es -1, terminará al final de la salida xxd. El segundo y tercer argumento también siempre serán no negativos, excepto cuando el tercero sea-1
Aquí hay algunos casos de prueba:
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: 7Argumento 3: e(ambas son cadenas que representan números hexadecimales)
Salida: \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: 0Argumento 3:2e
Salida: \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: aArgumento 3:-1
Salida: \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
El código con la menor cantidad de bytes gana. El ganador se anunciará en siete días, el 15 de agosto de 2016 (pero aún se agradecen las presentaciones posteriores).
Actualizar
¡Felicidades a @Adnan por ganar el desafío!
fuente

~lugar de\x7e. ¿Y podemos volver en\tlugar de\x09?7parece un índice basado en cero yees un índice basado en uno (e-7=7pero hay 8 códigos hexadecimales en su salida), ¿o estoy pasando por alto algo?Respuestas:
05AB1E ,
3938 bytesEntrada en el formulario:
Código:
Explicación:
Utiliza la codificación CP-1252 . Pruébalo en línea! .
fuente
Bash + coreutils + xxd,
737169 bytesEspera el hexdump en STDIN y start / end como argumentos de línea de comandos.
Esto imprime algunas advertencias en STDERR, que está permitido de forma predeterminada.
fuente
xxden su solución!16#con0x?xxdcosa, pero parece funcionar en todas partes.0xnestilo hexadecimal y de estilo0moctal listos para usar : gnu.org/software/bash/manual/bash.html#Shell-Arithmetic .echo $[0x2a] $[052].JavaScript, 84 bytes
Explicación: Elimina todas las partes no deseadas del volcado, antepone
\xa cada par hexadecimal y luego extrae la parte deseada del resultado.||use usa para convertir el cero obtenido al incrementar el-1parámetro en elundefinedque se encuentra un valor mágico que hacesliceque se corte al final de la cadena. 101 bytes sifytson cadenas de dígitos hexadecimales:fuente
(s,f,t,u)=>hacerlos=>f=>t=>u=>, puede guardar algunos bytes.udebe ser un parámetro adicional y no se puede curry.Rubí:
9089877963 bytes-2 bytes gracias a @addison
-8 bytes gracias a @PiersMainwaring
Vea las pruebas en repl.it: https://repl.it/Cknc/5
fuente
.joincon*""para guardar 2 bytes..map{|h|h.to_i(16)}con.map(&:hex)para ahorrar 8 bytes más!.hexa los argumentos individualmente!Jalea ,
4844 bytesEsto espera que el hexdump sea el único argumento de línea de comandos, y los puntos final e inicial en STDIN, en ese orden, separados por un salto de línea.
Pruébalo en línea!
fuente
PowerShell v2 +,
175157142133129 bytesToma de entrada
$a,$b,$c, con$aya sea como una cadena de nueva línea separada por literal, o con el PowerShell`ncarácter que separa las líneas. Establecemos la cadena auxiliar$zcomo la muy procesada de la$asiguiente manera:Primero,
-spliten las líneas nuevas, luego, para cada línea|%{...}, cortamos la sección del medio[10..48], usamos-ne32para eliminar espacios,-joinvolver a unirlos en una cadena larga,-splitcada dos caracteres (manteniendo los dos caracteres) y-ne''eliminar los elementos vacíos. Esto da como resultado una matriz de cadenas de dos elementos, como('31','c0','b0'...).Luego cortamos en esa matriz en función de
$bfundido con el operador hexadecimal hasta el valor de$c. Necesitamos usar un pseudoternario aquí que explique si$ces-1o no. Si es así, elegimos el.count(es decir, el elemento final) de$z. De lo contrario, simplemente anteponemos el0xoperador hexadecimal con$cuna cadena. Tenga en cuenta que esto está indexado a cero.Ese segmento de matriz tiene sus elementos
-joined junto con un literal\xpara formar una cadena. Eso se antepone a otro literal\xy el resultado se deja en la tubería. La impresión es implícita.Ejemplo
fuente
Gelatina ,
393837 bytesPruébalo en línea!
Ahora supera 05AB1E! (a pesar de la falta de "convertir de hexadecimal" incorporado)
Mismo formato de entrada que la solución de Dennis .
Uso
Ɱ, que es una nueva característica (abreviatura deЀ). Sin él, esto tomaría 38 bytes.fuente
Perl, 114 bytes
Argumentos dados en la línea de comando como una cadena entre comillas seguida de dos números. Los números se toman en decimal (sé que hexadecimal se usó en los ejemplos pero no se especificó en la publicación)
Técnicamente solo funciona en entradas con hasta 2 ^ 21 bytes ya que el método de subcadena de perl es tonto
fuente
7queedebe dar lugar a una cadena de longitud 32.Python, 140 bytes
https://repl.it/ClB3
Divide la cadena original y volca los elementos si tienen menos de cinco caracteres, antepone
\xy corta el segundo y el tercer argumento.Versión de 162 bytes si necesitamos manejar otros tipos de salida no especificados por la pregunta:
fuente
00000030: 5858 58 XXXya que extraerá la última parte y obtendrá algo así\x58\x58\x58\xXX\xX.xxdsalida utilizada como argumento. "Aquí hay un ejemplo de cómo se verá el primer argumento:"Python 2 y 3 -
164 162 150 146 134150 bytesAhora acepta cadenas hexadecimales para los argumentos segundo y tercero.
fuente
Python 3.5, 125 bytes
Sin golf:
fuente