Python이 다양한 16진수 변환을 구현하는 방법에 대한 요약

黄舟
풀어 주다: 2017-06-18 11:00:53
원래의
2209명이 탐색했습니다.

이 글은 문자열 및 16진수 변환, 내장 함수hex() 및 기본 변환 등을 포함하여 다양한 기본 변환을 구현하기 위해 Python에 대한 관련 정보를 주로 요약합니다. 도움이 필요한 친구들은 참고할 수 있습니다. 아래를 살펴보세요.

머리말

CTF를 플레이할 때 염기 변환 문제를 자주 접하게 되어, 그냥 염기 변환 요약을 만들어 모두가 참고하고 공부할 수 있도록 공유했습니다. 자세한 소개를 살펴보겠습니다.

문자 문자열 및 16진수 변환

예를 들어 12월 Baidu ctf 두 번째 세션의 첫 번째 기타


666C61677B65633862326565302D336165392D346332312D613031322D3038616135666137626536377D
로그인 후 복사

더 간단한 방법은 문자열의 .decode(' hex ')를 복호화할 수 있는데, 이 기능을 사용하지 않는다면 어떻게 복호화할 수 있을까요? .decode('hex')解密即可, 但如果不用这个函数你会怎么解呢?

一种思路就是先2个分组,解出每组的ascii值,合并下字符串即可得到,具体代码如下


import re
s='666C61677B65633862326565302D336165392D346332312D613031322D3038616135666137626536377D'
s = re.findall(r'.{2}',s)
s = map(lambda x:chr(int(x,16)),s)
print ''.join(s)
>>>
flag{ec8b2ee0-3ae9-4c21-a012-08aa5fa7be67}
로그인 후 복사

前面说了字符串的decode('hex')函数,另外还有两个转16进制的函数,这里都总结一下

内置函数hex()

只能转换10进制整数为十六进制,不能转字符串

binascii库的hexlify()和b2a_hex()

这两个函数的功能是将字符串转换成十六进制,对应的解密函数分别为 unhexlify()a2b_hex()

进制互转

二进制,八进制,十六进制转10进制比较简单,直接调用

int函数


int(str,base) //返回十进制整数,但注意此时第一个参数为字符串
로그인 후 복사

对应的解密函数分别是


bin() //10进制转二进制

oct() //十进制转八进制

hex() //十进制转十六进制
로그인 후 복사

但二进制直接转16进制就需要多走一步了,先用int转十进制,在用上面提到的hex()

한 가지 아이디어는 그룹 2 먼저

각 그룹의 ASCII 값을 풀고 문자를 병합하는 것입니다. 구체적인 코드는 다음과 같습니다.

map(lambda x:hex(int(x,2)),['0011']) //lambda表达式
로그인 후 복사

앞서 문자열의 decode('hex') 함수를 언급했는데, 16진수로 변환하는 함수도 2가지가 있습니다. , 여기에 요약되어 있습니다. 살펴보세요

내장 함수 hex()


는 10진수를 16진수로만 변환할 수 있으며 문자열은 변환할 수 없습니다


binascii 라이브러리 hexlify() 및 b2a_hex()

이 두 함수의 기능은 문자열을 16진수로 변환하는 것입니다. 해당 복호화 함수는 unhexlify()a2b_hex()


16진수 변환


를 2진수, 8진수, 16진수로 변환하는 것은 상대적으로 간단합니다.

int 함수

[hex(int(x,2)) for x in ['0011']] //列表解析
로그인 후 복사

를 직접 호출하면 해당 해독 함수는


map(lambda x:bin(int(x,16)),['ef'])
로그인 후 복사

이지만 16진수는 한 단계 더 필요합니다. 먼저 int를 사용하여 10진수로 변환한 다음 위에서 언급한 hex() 함수를 사용하여 10진수를 16진수로 변환하는 것이 더 간단합니다.

해당 복호화 함수는

# make by 江sir
#coding:utf-8
import re
import argparse
 
def bintostr(text):
 text = text.replace(' ','')
 text = re.findall(r'.{8}',text)
 s = map(lambda x:chr(int(x,2)),text) #批量二进制转十进制
 flag = ''.join(s)
 return flag
 
def asciitostr(text):
 if ' ' in text:
 text = text.split(' ')
 elif ',' in text:
 text = text.split(',')
 s = map(lambda x:chr(int(x)),text)
 flag = ''.join(s)
 return flag
 
def hextostr(text):
 text = re.findall(r'.{2}',text)
 #print text
 s = map(lambda x:chr(int(x,16)),text)
 #print s
 flag = ''.join(s)
 return flag
 
 
if name == 'main':
 parser = argparse.ArgumentParser()
 parser.add_argument("-b")
 parser.add_argument("-a")
 parser.add_argument("-x")
 argv = parser.parse_args()
 #print argv
 if argv.b:
 res = bintostr(argv.b)
 elif argv.a:
 res = asciitostr(argv.a)
 elif argv.x:
 res = hextostr(argv.x)
 print res
로그인 후 복사

또는

bintostr.py -x "666C61677B65633862326565302D336165392D346332312D613031322D3038616135666137626536377D"
flag{ec8b2ee0-3ae9-4c21-a012-08aa5fa7be67}
로그인 후 복사

bintostr.py -b "00101111 01100110 00110110 00110111 00110011 00110010 00110100 00110001 00110000 01100001 01100001 01100100 01100011 00110000 00110011 00110111 01100110 01100010 00110000 01100011 01100010 01100001 01100001 00110000 00110000 01100011 00110111 00110101 00110011 00110001 00110011 00110111 00110011 00101110 01110100 01111000 01110100"
/f6732410aadc037fb0cbaa00c7531373.txt
로그인 후 복사
입니다. 마지막으로 Python으로 직접 작성한 작은 16진수 변환 도구를 첨부합니다. 주요 기능은 바이너리 세트 또는 ASCII를 변환하거나 16진수를 문자열로 변환하는 것입니다. CTF

🎜🎜
bintostr.py -a "45 46 45 46 32 45 32 46 46 45 46 32 46 45 46 46 32 46 46 46 32 45 46 46 46 32 46 46 45 45 46 45 32 45 46 46 46 32 46 46 46 32 46 45 46 46 32"
-.-. - ..-. .-.. ... -... ..--.- -... ... .-..
로그인 후 복사
🎜🎜Usage:🎜🎜🎜🎜Hex to string:🎜🎜🎜🎜666C61677B65633862326565302D33616 5392D346332에서 이런 유형의 질문을 자주 접하게 됩니다. 312D613031322D3038616135666137626536377D🎜🎜 🎜🎜rrreee🎜🎜바이너리에서 문자열로: 🎜🎜🎜🎜 공백을 가질 수 있습니다. 또는 공백 없음🎜🎜00101111 01100110 00110110 00110111 00110011 00110010 00110100 00110001 00110000 01100001 01100001 01100100 0110 0011 00110000 00110011 00110111 01100110 01100010 00110000 01100011 0110001 0 01100001 01100001 00110000 00110000 01100011 0 0110111 00110101 00110011 00110001 00110011 00110111 00110011 00101110 01110100 01111000 01110100🎜🎜🎜🎜rrreee🎜 🎜 ASCII를 문자열로 🎜🎜🎜🎜은 공백으로 구분하거나 🎜🎜s='45 46 45 46 32 45 32 46 46 45 46 32 46 45 46 46 32 46 46 46 32 45 46 46 46 32 46 46 45 45 46 45 32 45 46 46 46 32 46 46 46 32 46 45 46 46 32'🎜rrreee 🎜위 예시는 모두 일부 CTF 대회에서 나온 것입니다. 질문🎜🎜🎜🎜요약🎜🎜🎜

위 내용은 Python이 다양한 16진수 변환을 구현하는 방법에 대한 요약의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿