이 글은 문자열 및 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()
각 그룹의 ASCII 값을 풀고 문자를 병합하는 것입니다. 구체적인 코드는 다음과 같습니다.
map(lambda x:hex(int(x,2)),['0011']) //lambda表达式
앞서 문자열의 decode('hex')
함수를 언급했는데, 16진수로 변환하는 함수도 2가지가 있습니다. , 여기에 요약되어 있습니다. 살펴보세요
이 두 함수의 기능은 문자열을 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'])
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
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" -.-. - ..-. .-.. ... -... ..--.- -... ... .-..
위 내용은 Python이 다양한 16진수 변환을 구현하는 방법에 대한 요약의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!