이 글은 문자열 및 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()
map(lambda x:hex(int(x,2)),['0011']) //lambda表达式
decode('hex''에 대해 언급했습니다. 이전 문자열) )
함수와 16진수로 변환하는 두 가지 다른 함수가 있습니다. 여기에 요약해 보겠습니다.내장 함수 hex()
는 10진수 정수를 16진수로만 변환할 수 있습니다. . 문자열을 변환할 수 없습니다
binascii 라이브러리 hexlify() 및 b2a_hex()
이 두 함수의 기능은 문자열을 16진수로 변환하는 것이며 해당 해독 함수는 unhexlify()
및 a2b_hex()
conversion
2진수, 8진수, 16진수를 10진수로 변환하는 것은 상대적으로 간단하며
int 함수를 직접 호출합니다.
[hex(int(x,2)) for x in ['0011']] //列表解析
의 해당 복호화 함수
map(lambda x:bin(int(x,16)),['ef'])
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}
입니다. 마지막으로 제가 직접 사용하기 위해 첨부합니다. Python으로 작성된 도구의 주요 기능은 바이너리, ASCII 또는 16진수 집합을 문자열로 변환하는 것입니다. CTF
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
Usage:🎜🎜🎜🎜Hex에서 이러한 유형의 질문을 자주 접하게 됩니다. : 6666c61677b65633862326565302d336165392d34633232312d61303132d3038616135666613762 6536377d🎜🎜🎜🎜r
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" -.-. - ..-. .-.. ... -... ..--.- -... ... .-..
위 내용은 파이썬 베이스 간 변환 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!