Взять какой-то вывод из xxd и превратить его в пригодный для использования шелл-код вручную неинтересно, поэтому ваша задача - автоматизировать процесс.
правила
Ваше представление может быть функцией, лямбда-выражением, сценарием или любым разумным эквивалентом. Вы можете распечатать результат, или если ваше представление является функцией / лямбда-выражением, вы также можете вернуть его.
Вы программа должна принимать три аргумента, первый из которых строка , содержащая вывод 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
перед каждым байтом.
Вот что должен быть вывод для ввода выше (игнорируя любые другие аргументы):
\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-выводом, без аргументов, кроме имени файла.
Ваш вывод также должен быть строкой, в которой обратные косые черты являются буквальными обратными косыми чертами, а не используются в качестве escape-символов. Поэтому, когда я говорю «\ x65», я не говорю о байте 0x65 или даже о букве «A». В коде это будет строка "\ x65".
Второй аргумент указывает, где в выводе xxd должен начинаться шелл-код, а третий указывает, где он должен заканчиваться. Если третий аргумент есть -1
, он закончится в конце вывода xxd. Второй и третий аргументы также всегда будут неотрицательными, кроме случаев, когда третий-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
(обе строки представляют шестнадцатеричные числа)
Выход: \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
Код с наименьшим количеством байтов выигрывает. Победитель будет объявлен через семь дней, 15 августа 2016 г. (но заявки после этого по-прежнему приветствуются).
Обновить
Поздравляю @Adnan, чтобы выиграть вызов!
~
вместо \x7e
. И можем ли мы вернуться \t
вместо \x09
?
7
выглядит как индекс , начинающийся с нуля, и e
является индексом, основанным на единицах ( e-7=7
но в вашем выводе есть 8 шестнадцатеричных кодов), или я что-то пропускаю?