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 |