Взять какой-то вывод из 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 шестнадцатеричных кодов), или я что-то пропускаю?Ответы:
05AB1E ,
3938 байтВвод в форме:
Код:
Объяснение:
Использует кодировку CP-1252 . Попробуйте онлайн! ,
источник
Bash + coreutils + xxd,
737169 байтОжидает hexdump на STDIN и start / end в качестве аргументов командной строки.
Это выводит некоторые предупреждения в STDERR, что разрешено по умолчанию.
источник
xxd
их решение!16#
на0x
?xxd
вещь, но, похоже, работает везде.0xn
шестнадцатеричные и0m
восьмеричные номера стилей из коробки: gnu.org/software/bash/manual/bash.html#Shell-Arithmetic .echo $[0x2a] $[052]
,JavaScript, 84 байта
Объяснение: Удаляет все ненужные части дампа, добавляется
\x
к каждой шестнадцатеричной паре, затем извлекает желаемую часть результата.||u
используется для преобразования нуля, полученного путем увеличения-1
параметра, вundefined
который входит магическое значение, которое приводитslice
к срезу до конца строки. 101 байт, еслиf
иt
являются строками шестнадцатеричных цифр:источник
(s,f,t,u)=>
вы можете сделатьs=>f=>t=>u=>
, чтобы сохранить несколько байтов.u
должен быть дополнительный параметр и не может быть карри.Рубин:
9089877963 байта-2 байта благодаря @addison
-8 байтов благодаря @PiersMainwaring
Смотрите тесты на repl.it: https://repl.it/Cknc/5
источник
.join
на,*""
чтобы сохранить 2 байта..map{|h|h.to_i(16)}
на,.map(&:hex)
чтобы сохранить еще 8 байтов!.hex
аргументы индивидуально!Желе ,
4844 байтаЭто предполагает, что hexdump будет единственным аргументом командной строки, а конечные и начальные точки на STDIN в этом порядке разделены переводом строки.
Попробуйте онлайн!
источник
PowerShell v2 +,
175157142133129 байтПринимает вход
$a
,$b
,$c
, с$a
либо в виде буквального перевода строки разделенных строки, или с помощью PowerShell`n
характера , разделяющей линии. Мы устанавливаем вспомогательную строку$z
как сильно обработанную$a
следующим образом:Сначала мы находимся
-split
на новых строках, затем для каждой строки|%{...}
нарезаем среднюю часть[10..48]
, используем-ne32
для удаления пробелов,-join
обратно в одну длинную строку,-split
каждые два символа (сохраняя два символа) и-ne''
для удаления пустых элементов. Это приводит к массиву двухэлементных строк, например('31','c0','b0'...)
.Затем мы разрезаем этот массив на основе
$b
приведения с шестнадцатеричным оператором до значения$c
. Мы должны использовать псевдо-троичный здесь, который объясняет,$c
есть-1
или нет. Если это так, мы выбираем.count
(т.е. конечный элемент) из$z
. В противном случае мы просто добавляем0x
шестнадцатеричный оператор$c
в строку. Обратите внимание, что это с нулевым индексом.Этот фрагмент массива имеет свои элементы,
-join
объединенные с литералом\x
для формирования одной строки. Это предваряется другим литералом,\x
и результат остается на конвейере. Печать неявная.пример
источник
Желе ,
393837 байтПопробуйте онлайн!
Теперь бьет 05AB1E! (несмотря на отсутствие встроенной функции преобразования из шестнадцатеричного числа)
Тот же формат ввода, что и у решения Денниса .
Используйте
Ɱ
, что является новой функцией (сокращение отЀ
). Без этого это заняло бы 38 байтов.источник
Perl, 114 байт
Аргументы приведены в командной строке в виде строки в кавычках, за которой следуют два числа. Числа взяты в десятичном виде (я знаю, что в примерах использовался гекс, но он не был указан в посте)
Технически работает только на входах длиной до 2 ^ 21 байт, так как метод подстроки perl глуп
источник
7
чтобыe
должны привести строку длиной 32.Python, 140 байт
https://repl.it/ClB3
Разбивает исходную строку и выводит элементы, если они меньше пяти символов, добавляет
\x
и разделяет по второму и третьему аргументам.162-байтовая версия, если нам нужно обработать другие типы вывода, не указанные в вопросе:
источник
00000030: 5858 58 XXX
так как она вытянет последнюю часть, и вы получите что-то вроде\x58\x58\x58\xXX\xX
.xxd
вместо него могут использоваться другие выходные данные. «Вот пример того, как будет выглядеть первый аргумент:»Python 2 и 3 -
164 162 150 146 134150 байтовТеперь принимает шестнадцатеричные строки для второго и третьего аргументов.
источник
Python 3.5, 125 байт
Ungolfed:
источник