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 \x
antes 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: 7
Argumento 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: 0
Argumento 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: a
Argumento 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\t
lugar de\x09
?7
parece un índice basado en cero ye
es un índice basado en uno (e-7=7
pero 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
xxd
en su solución!16#
con0x
?xxd
cosa, pero parece funcionar en todas partes.0xn
estilo hexadecimal y de estilo0m
octal 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
\x
a cada par hexadecimal y luego extrae la parte deseada del resultado.||u
se usa para convertir el cero obtenido al incrementar el-1
parámetro en elundefined
que se encuentra un valor mágico que haceslice
que se corte al final de la cadena. 101 bytes sif
yt
son cadenas de dígitos hexadecimales:fuente
(s,f,t,u)=>
hacerlos=>f=>t=>u=>
, puede guardar algunos bytes.u
debe 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
.join
con*""
para guardar 2 bytes..map{|h|h.to_i(16)}
con.map(&:hex)
para ahorrar 8 bytes más!.hex
a 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$a
ya sea como una cadena de nueva línea separada por literal, o con el PowerShell`n
carácter que separa las líneas. Establecemos la cadena auxiliar$z
como la muy procesada de la$a
siguiente manera:Primero,
-split
en las líneas nuevas, luego, para cada línea|%{...}
, cortamos la sección del medio[10..48]
, usamos-ne32
para eliminar espacios,-join
volver a unirlos en una cadena larga,-split
cada 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
$b
fundido con el operador hexadecimal hasta el valor de$c
. Necesitamos usar un pseudoternario aquí que explique si$c
es-1
o no. Si es así, elegimos el.count
(es decir, el elemento final) de$z
. De lo contrario, simplemente anteponemos el0x
operador hexadecimal con$c
una cadena. Tenga en cuenta que esto está indexado a cero.Ese segmento de matriz tiene sus elementos
-join
ed junto con un literal\x
para formar una cadena. Eso se antepone a otro literal\x
y 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
7
quee
debe 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
\x
y 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 XXX
ya que extraerá la última parte y obtendrá algo así\x58\x58\x58\xXX\xX
.xxd
salida 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