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!
~
lugar de \x7e
. ¿Y podemos volver en \t
lugar de \x09
?
7
parece un índice basado en cero y e
es un índice basado en uno ( e-7=7
pero hay 8 códigos hexadecimales en su salida), ¿o estoy pasando por alto algo?