MacOS-X 내장명령어로 ip2cc 라는 귀여운(?) 명령이 있다. ip 를 country code로 변환해주는 유틸리티인데, 굳이 이런 신기한 펄 스크립트가 있다.


https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/ip2cc5.16.1.html



저작자 표시 동일 조건 변경 허락
신고
지난 번에 이어서 이번에는 Base64로 된 것을 바로 풀어 봅시다.
$ cat x
64u57Iug7J2AIOuCmOuKlCDrsJTrs7TsnoXri4jri6QK7J6Q7KG07IusIOuVjOusuOyXkArsiKDq
s7wg7JO0IOuLtOuwsOyXsOq4sOuhnCDrp53qsIDsp4Dqs6Ag7J6I7KOgCuuLueyLoOydgCDrgpjr
ipQg67CU67O07J6F64uI64ukCuyVhOyngSDsgqzrnpHtlZjquLDsl5Ag7ZWY66OoIOyiheydvCDt
jpHtjpEg7Jq46rOg66eMIOyeiOyjoArqt7jrjIDrj4Qg64KY64+EIOuqqOuRkCDrsJTrs7Tsspjr
n7wK
요렇게 되어 있는 파일을 decoding 하려면,
perl -mMIME::Base64 -e 'while(<>){print MIME::Base64::decode_base64($_)}'
-m 으로 Module을 불러 들이고, 그 모듈안에 있는 decode_base64를 불러주는 것으로 땡...

너무 쉬웠나..


신고
16진수 문자열을
$ cat x
eb 8b b9 ec 8b a0 ec 9d 80 20 eb 82 98 eb 8a 94
20 eb b0 94 eb b3 b4 ec 9e 85 eb 8b 88 eb 8b a4
0a ec 9e 90 ec a1 b4 ec 8b ac 20 eb 95 8c eb ac
b8 ec 97 90 0a ec 88 a0 ea b3 bc 20 ec 93 b4 20
eb 8b b4 eb b0 b0 ec 97 b0 ea b8 b0 eb a1 9c 20
eb a7 9d ea b0 80 ec a7 80 ea b3 a0 20 ec 9e 88
ec a3 a0 0a eb 8b b9 ec 8b a0 ec 9d 80 20 eb 82
98 eb 8a 94 20 eb b0 94 eb b3 b4 ec 9e 85 eb 8b
88 eb 8b a4 0a ec 95 84 ec a7 81 20 ec 82 ac eb
9e 91 ed 95 98 ea b8 b0 ec 97 90 20 ed 95 98 eb
a3 a8 20 ec a2 85 ec 9d bc 20 ed 8e 91 ed 8e 91
20 ec 9a b8 ea b3 a0 eb a7 8c 20 ec 9e 88 ec a3
a0 0a ea b7 b8 eb 8c 80 eb 8f 84 20 eb 82 98 eb
8f 84 20 eb aa a8 eb 91 90 20 eb b0 94 eb b3 b4
ec b2 98 eb 9f bc 0a
hex dump 해도 같은 결과가 나오는 바이너리 y 로 만드는 펄 코드를 살펴봅시다.
$ od -tx1 y
0000000 eb 8b b9 ec 8b a0 ec 9d 80 20 eb 82 98 eb 8a 94
0000020 20 eb b0 94 eb b3 b4 ec 9e 85 eb 8b 88 eb 8b a4
0000040 0a ec 9e 90 ec a1 b4 ec 8b ac 20 eb 95 8c eb ac
0000060 b8 ec 97 90 0a ec 88 a0 ea b3 bc 20 ec 93 b4 20
0000100 eb 8b b4 eb b0 b0 ec 97 b0 ea b8 b0 eb a1 9c 20
0000120 eb a7 9d ea b0 80 ec a7 80 ea b3 a0 20 ec 9e 88
0000140 ec a3 a0 0a eb 8b b9 ec 8b a0 ec 9d 80 20 eb 82
0000160 98 eb 8a 94 20 eb b0 94 eb b3 b4 ec 9e 85 eb 8b
0000200 88 eb 8b a4 0a ec 95 84 ec a7 81 20 ec 82 ac eb
0000220 9e 91 ed 95 98 ea b8 b0 ec 97 90 20 ed 95 98 eb
0000240 a3 a8 20 ec a2 85 ec 9d bc 20 ed 8e 91 ed 8e 91
0000260 20 ec 9a b8 ea b3 a0 eb a7 8c 20 ec 9e 88 ec a3
0000300 a0 0a ea b7 b8 eb 8c 80 eb 8f 84 20 eb 82 98 eb
0000320 8f 84 20 eb aa a8 eb 91 90 20 eb b0 94 eb b3 b4
0000340 ec b2 98 eb 9f bc 0a
0000347
자, 저 y 파일을 어떻게 만들것이냐..

cat x | perl -e "while(<>){ print pack 'C*', map hex, split }" > y
간단히 해석을 하자면,
cat x : x를 한 줄씩 출력하고,
| : 그결과를 perl 의 입력으로 넣은다음
perl -e : 뒤 에 있는 스크립트로 해석하여 출력하되,
> y: y 에 넣어달라는 것인데,
while(<>) {...} : 표준입력을 $_ 라는 변수에 한줄씩 넣어서
split : $_를 공백으로 구분하여  리스트를 만든 뒤
map hex: 각 리스트를 16진수로 해석하여 정수 리스트로 바꾸어 만들어 내고
pack 'C*': 정수 리스트의 각 값들을 아스키코드(부호없는 char)로 해석하여 하나의 스트링으로 패킹하여
print : 출력해달라
는 것입니다.

이렇게 써놓고도 마치 몇년전에 한 번 글을 쓴 것 같은 기분이 드는 것은 왠일일까요.
신고
  1. J.Parker 2007.08.22 12:53 신고

    바이너리 코드를 보자마자 갑자기 브루스 형님이 주연하신 '머큐리' 영화가 생각나는 것은 왜일까요...^^

    • 최호진 2007.08.22 16:39 신고

      브루스 형님 잘 계시죠? 언제 한번 찾아 뵈어야하는데.

  2. tolkien 2007.08.22 21:00 신고

    perl의 저런 면은 싫어요.

+ Recent posts