a='656e636f64696e67206973206e6f7420656e6372797074696f6e2074686520666c61673d73696d706c65'
table=['0x'+a[i:i+2] for i in range(0,len(a),2)]
print table
table1=[]
for i in range(len(table)):
        table1.append(chr(int(table[i],16)))
flag=""
for i in range(len(table1)):
        flag+=table1[i]
print flag

예를 들어, 바이너리 파일을 읽어 Hex로 출력하는 루틴은 간단히,

 

with open(f) as ifp:

buff = ifp.read()

hlist = []

for ch in buff:

hlist.append('%02x' % ord(ch))

print 'hex out = <%s>' % ' '.join(hlist)

 

와 같이 적용할 수 있습니다.

 

그런데 그 반대가 있을 수 있습니다.

 

어떤 문자열이 있는데, Hex 문자열로 되어 있다고 가정하고, (거의 모든 인증서 데이터 등에 사용됩니다)

이것을 매 2바이트씩 끊어 목록으로 만들고 싶습니다.

 

여러 가지 방법이 존재하는데,

다음과 같은 세 가지로 구분되더군요...

 

hxstr = '123456'

 

1) [ for ... ]

 

hlist = [hxstr[i:i+2] for i in range(0,len(hxstr),2)]

 

2) re.findall

 

hlist = re.findall(r'..',hxstr)

 

3) map, zip, iter 이용

 

hlist = map(''.join, zip(*[iter(hxstr)]*2))

 

잠깐 설명해 보도록 하겠습니다.

 

iter(hxstr) 는 글자 하나씩 가져오는 이터레이터 함수라 생각하십시오.

 

[ 'a' ] * 2 는 [ 'a', 'a'] 이고,

함수 호출 시 f(['a','a'])는 목록이 넘어가지만,

f(*['a','a'])는 f('a','a') 와 동일합니다. 즉, 괄호를 벗기는 역할을 합니다.

 

그러면 결국 zip(iter(hxstr)결과, iter(hxstr)결과) 와 같은 식인데,

첫번째 패러미터와 두번째 패러미터의 값을 한번씩 호출하게 되어있습니다.

그런데 동일한 이터레이터 이므로 하나씩 꺼내게 되므로,

(('1','2'), ('3','4'),('5','6')) 의 결과가 나옵니다.

이를 각 항목에 대하여 ''.join <=> cat 을 시키니

['12','34','56'] 이 되는 것이지요~

 

정도 입니다.

(물론 함수로 줄줄이 길게 하는거 제외하구요)

 

어느게 제일 빠를지는 아주 큰 문자열로 돌려봐야 되겠지요...

(전 1을 애용하려고 합니다. 3은 이해하는데 15분 걸렸습니다... T.T)

 

 

이제는 거꾸로 파일로 출력하면...

 

with open(b,'w') as ofp:

for hstr in hlist:

ofp.write(chr(int(hstr,16)))

 

와 같이 하면 됩니다.

 

 

어느분께는 도움이 되셨기를...

'Python' 카테고리의 다른 글

python struct module  (0) 2019.11.21
[pwntools]pwnlib.util  (0) 2019.11.19
파이썬 리스트의 문자열을 int 형태로 변환  (2) 2019.02.18
Python z3 모듈  (0) 2018.12.02

+ Recent posts