xxd 출력을 쉘 코드로 변환


15

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 출력이고 파일 이름 이외의 인수없이 실행되었다고 가정 할 수 있습니다.

출력은 백 슬래시가 리터럴 백 슬래시 인 문자열이어야하며 이스케이프 문자로 사용되지 않습니다. "\ x65"라고 말할 때 0x65 바이트 나 "A"문자에 대해서는 이야기하지 않습니다. 코드에서는 문자열 "\ x65"가됩니다.

두 번째 인수는 xxd 출력에서 ​​쉘 코드를 시작할 위치를 지정하고 세 번째 인수는 종료해야하는 위치를 지정합니다. 세 번째 인수가이면 -1xxd 출력의 끝에서 종료됩니다. 두 번째와 세 번째 인수는 세 번째 인수가 아닌 경우를 제외하고 항상 음수가 아닙니다.-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(이 둘은 16 진수를 나타내는 문자열입니다)

산출: \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

바이트 수가 가장 적은 코드가 이깁니다. 당첨자는 2016 년 8 월 15 일에 7 일 만에 발표됩니다 (그러나 그 이후의 제출물은 여전히 ​​감사합니다).

최신 정보

@Adnan 에게 도전하여 승리를 축하합니다 !


명확히하기 위해 항목이 문자열을 반환 할 수 있습니까 아니면 인쇄해야합니까?
Jordan

함수, 람다 또는 이와 비슷한 것이면 문자열을 반환하는 것이 좋습니다 (요청한 후에 지정하도록 규칙을 업데이트했습니다).
addison

1
코드를 인쇄 할 수있을 때 일반 ASCII 코드를 반환 할 수 있습니까? 예 ~대신 \x7e. 그리고 \t대신에 돌아갈 수 \x09있습니까?
orlp

@orlp 죄송합니다. 일관된 형식이어야합니다.
addison

인수는 16 진수 여야합니까? 또한 두 번째 예를 제공 한 방식 7은 0 기반 인덱스처럼 보이고 e1 기반 인덱스 ( e-7=7그러나 출력에는 8 진수 코드가 8 개)입니까, 아니면 내가 간과하고 있습니까?
Neil

답변:


5

05AB1E , 39 38 바이트

다음과 같은 형식으로 입력하십시오.

arg2
arg3
arg1

암호:

²\|vy9F¦}40£ðK}J2ô„\xì²H>²®Qi²}£¹HF¦}J

설명:

²\                                       # Get the first two inputs and discard them.
  |                                      # Take the rest of the input as an array.
   vy         }                          # For each line...
     9F¦}                                #   Ten times, remove the first character.
         40£                             #   Only remain the substring [0:40].
            ðK                           #   Remove spaces.
               J                         # Join the string.
                2ô                       # Split into pieces of 2.
                  „\xì                   # Prepend a "\x" at each string.
                      ²H                 # Convert the second line from hex to int.
                        >                # Increment by one.
                         ²               # Push the second input again.
                          ®Qi }          # If equal to -1...
                             ²           #   Push the second input again.
                               £         # Take the substring [0:(² + 1)].
                                ¹H       # Convert the first input from hex to int.
                                  F¦}    # Remove that many characters at the beginning.
                                     J   # Join the array and implicitly output.

CP-1252 인코딩을 사용합니다 . 온라인으로 사용해보십시오! .


12

배쉬 + coreutils + xxd, 73 71 69 바이트

printf \\x%s `xxd -r|xxd -p -s0x$1 -l$[(e=1+0x$2)?e-0x$1:-1]|fold -2`

STDIN의 16 진 덤프를 예상하고 명령 행 인수로 시작 / 종료합니다.

STDERR에 일부 경고가 인쇄되며 기본적으로 허용됩니다.


1
누군가가 실제로 xxd그들의 솔루션에 사용하기 를 바랐습니다 !
addison

@ addison 시도했지만 내 언어는 명령 줄 입력에서 줄 바꿈을 지원하지 않습니다. : C
애디슨 크럼프

나는 대체 할 생각 16#으로 0x?
디지털 외상

@DigitalTrauma 나는 그것이 xxd일 이라고 생각 했지만 모든 곳에서 작동하는 것처럼 보입니다.
Dennis

1
예, bash는 gnu.org/software/bash/manual/bash.html#Shell-Arithmetic 상자에서 0xn16 진 스타일과 0m8 진 스타일 숫자를 구문 분석 합니다. . echo $[0x2a] $[052]
Digital Trauma

5

자바 스크립트, 84 바이트

(s,f,t,u)=>s.replace(/.*:|  .*\n?| /g,'').replace(/../g,'\\x$&').slice(f*4,++t*4||u)

설명 : 덤프에서 불필요한 부분을 모두 제거 \x하고 각 16 진 쌍 앞에 추가 한 다음 원하는 결과 부분을 추출합니다. ||u는 문자열의 끝으로 슬라이스 되는 마법 값인 -1매개 변수를 증가시켜 얻은 0을 변환하는 데 사용됩니다 . 및 16 진수 문자열 인 경우 101 바이트 :undefinedsliceft

(s,f,t,u)=>s.replace(/.*:|  .*\n?| /g,``).replace(/../g,`\\x$&`).slice(`0x${f}`*4,t<0?u:`0x${t}`*4+4)

대신 몇 바이트를 절약하기 위해 (s,f,t,u)=>할 수 있습니다 s=>f=>t=>u=>.
Ismael Miguel

@IsmaelMiguel 죄송합니다. 정확히 두 개의 실제 매개 변수가있는 함수에서만 작동합니다. 제 경우에는 u추가 매개 변수 여야하며 카레 할 수 없습니다.
Neil

@IsmaelMiguel 또한 실제로 더 길다.
Jakob

5

루비 : 90 89 87 79 63 바이트

@addison 덕분에 -2 바이트 @PiersMainwaring 덕분에
-8 바이트

->s,x,y{'\x'+s.scan(/(?<=.{9})\w\w(?=.* )/)[x.hex..y.hex]*'\x'}

repl.it에서 테스트를 참조하십시오 : https://repl.it/Cknc/5


당신은 대체 할 수 .join*""2 저장 바이트.
addison

당신은 대체 할 수 .map{|h|h.to_i(16)}.map(&:hex)8 개의 바이트를 저장할!
piersadrian

@PiersMainwaring 감사합니다! 잊어 버린 바보 .hex인수를 개별적 으로 호출하는 것이 더 짧아서 실제로 16을 절약했습니다 !
Jordan

4

젤리 , 48 44 바이트

ØhiЀɠ’ḅ¥®L’¤Ạ?⁴‘
ṣ⁷ṫ€⁵ḣ€40Fḟ⁶s©2ḣ¢ṫ¢[“\x”]p

이것은 16 진 덤프를 유일한 명령 행 인수로, STDIN의 끝점과 시작점은 줄 바꿈으로 구분됩니다.

온라인으로 사용해보십시오!


이에 대한 설명을보고 싶습니다.)
Conor O'Brien

나중에 하나를 추가하지만 먼저 골프를 치기 위해 노력할 것입니다. 젤리 51 바이트 대 배쉬 69 바이트는 맞지 않을 수 있습니다 ...
Dennis

3

PowerShell을 V2 +, 175 (157) 142 133 129 바이트

param($a,$b,$c)'\x'+(($z=$a-split"`n"|%{$_[10..48]-ne32-join''-split'(..)'-ne''})["0x$b"..(("0x$c",$z.count)[$c-eq-1])]-join'\x')

입력 취하고 $a, $b, $c,와 $a같은 개행 문자로 구분 된 문자열 중, 또는 파워 쉘과 `n라인 분리 자. 헬퍼 문자열 을 다음과 같이 $z크게 처리 된 $a것으로 설정합니다.

먼저 우리는 -split줄 바꿈에, 다음, 각 라인을 위해 |%{...}, 우리는 중간 부분을 슬라이스 [10..48]의 사용 -ne32공간을 제거하고, -join그것을 다시 함께 하나의 긴 문자열로, -split그것은 (두 문자를 유지) 매 2 개 문자 및 -ne''빈 요소를 제거 할 수 있습니다. 결과는 다음과 같이 두 개의 요소로 구성된 문자열 배열이됩니다 ('31','c0','b0'...).

그런 다음 $b16 진수 연산자로 캐스팅 한 값을 기준으로 해당 배열로 분할 $c합니다. 우리는 여부에 대한 계정 것으로 여기 의사 원을 사용할 필요가 $c있다 -1여부. 그렇다면의 .count(즉, 끝 요소)를 선택 $z합니다. 그렇지 않으면, 우리는 0x16 진 연산자를 $c문자열 앞에 붙 입니다. 이 인덱스는 0입니다.

이 배열 슬라이스에는 하나의 문자열을 형성하기 위해 -join리터럴과 함께 요소가 \x있습니다. 그것은 다른 리터럴이 앞에 붙어 있으며 \x결과는 파이프 라인에 남습니다. 인쇄는 암시 적입니다.

PS C:\Tools\Scripts\golfing> .\xxd-output.ps1 "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" a -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

이 언어로 쉘에 액세스 할 수 있습니까?
Addison Crump

@VTCAKAVSMoACE 이론상, 새로운 Linux 용 Windows Subsystem이 제공 되면 명령 줄을 통해 함께 파이프를 연결하거나 매개 변수를 전달할 수 있어야합니다. 구현은 독자를위한 연습으로 남아 있습니다. ;-)
AdmBorkBork

2

젤리 , 39 38 37 바이트

ØhiⱮɠ’ḅ¥ȷ9Ṃ?⁴‘
Ỵṫ€⁵ḣ€40Fḟ⁶s2ṭ€⁾\xḣ¢ṫ¢

온라인으로 사용해보십시오!

이제 05AB1E를 이겼습니다! ( "16 진수 변환"내장 기능이 부족하더라도)

Dennis 솔루션 과 동일한 입력 형식 .

새로운 기능인을 사용하십시오 (의 줄임말 Ѐ). 그렇지 않으면 38 바이트가 걸립니다.


len이 1e9까지 인 입력에만 작동합니다.
user202729

그러나 FAT32 (입력 크기가 최대 2GB 인 경우)이면 충분합니다.
user202729 2016 년

1

펄, 114 바이트

($_,$a,$b)=@ARGV;s/^.*:|\S*$|\s//gm;@_=(m/../g);for(@_){s/^/\\x/}$"='';say substr"@_",4*$a,$b!=-1?4*($a+$b):2<<20;

명령 행에서 따옴표로 묶은 문자열 뒤에 두 개의 숫자가 제공되는 인수. 숫자는 십진수로 표시됩니다 (예에서는 16 진수가 사용되었지만 게시물에 지정되지 않았습니다)

Perl의 서브 스트링 방법은 어리석기 때문에 기술적으로 최대 2 ^ 21 바이트의 입력에서만 작동합니다.


분명히 범위는 포괄적이므로, 예 7를 들어 e길이가 32 인 문자열이되어야합니다.
Neil

1

파이썬, 140 바이트

lambda O,a,b:''.join(sum([['\\x'+x[:2],('','\\x')[len(x)>2]+x[2:]]for x in O.split()if len(x)<5],[])[int(a,16):(int(b,16)+1,None)[b=='-1']])

https://repl.it/ClB3

원래 문자열을 분할하고 요소가 5 자 미만인 경우 요소를 앞에 추가 \x하고 두 번째 및 세 번째 인수로 슬라이스합니다.

질문에 의해 지정되지 않은 다른 유형의 출력을 처리 해야하는 경우 162 바이트 버전 :

import re
J=''.join
def f(x,a,b):r=J(J(re.findall(':(.*?)  ',x)).split());print J(['\\x'+i+j for i,j in zip(r,r[1:])][::2][int(a,16):(int(b,16)+1,None)[b=='-1']])

예를 들어 마지막 줄이 00000030: 5858 58 XXX마지막 부분을 뽑아서 비슷한 것을 얻는 다면 작동하지 않습니다 \x58\x58\x58\xXX\xX.
AdmBorkBork

@ TimmyD 나는 그 사건을 처리해야한다고 생각하지 않았고 도전의 사양을 벗어났습니다.
atlasologist

주어진 첫 번째 인수는 단지 예이므로 도전을 읽었으므로 xxd대신 다른 출력이 인수로 사용될 수 있습니다 . "첫 번째 인수의 예는 다음과 같습니다."
AdmBorkBork

0

파이썬 2와 3- 164 162 150 146 134 150 바이트

이제 두 번째 및 세 번째 인수에 16 진 문자열을 허용합니다.

j=''.join
def f(a,b,c):s=j(x[10:49].replace(' ','')for x in a.split('\n'));print(j('\\x'+s[i:i+2]for i in range(int(b,16)*2,1+2*int(c,16)%len(s),2))

0

파이썬 3.5, 125 바이트

import re
lambda s,b,e:re.sub(r'(\w\w)',r'\\x\1',re.sub(r'^.*?:|  .*$|\s','',s,0,8)[2*int(b,16):[2*int(e,16)+2,None][e<'0']])

언 골프 드 :

def f(s,b,e):
    b = 2*int(b,16)
    e = [2*int(e,16)+2,None][e<'0']
    x = re.sub(r'''(?v)   # verbose (not in golfed version)
            ^.*?:     # match begining of line to the ':'
           |  .*$     # or match '  ' to end of line
           |\s        # or match whitespace
           ''',
           '',        # replacement
           s,
           0,         # replace all matches 
           re.M       # multiline mode
           )
    y = re.sub(r'(\w\w)', # match pairs of 'word' characters
           r'\\x\1',  # insert \x
            x[b:e])
    return y
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.