A summary of python's implementation of each base conversion
- 2020-06-07 04:42:33
- OfStack
preface
When playing ctf, I often encounter the problem of base conversion, so I just make a summary of the base conversion and share it for your reference and study. Let's start with 1 and have a look at the detailed introduction:
Convert string to base 106
For example, Baidu ctf's first misc in The second game in December
666C61677B65633862326565302D336165392D346332312D613031322D3038616135666137626536377D
The simpler one is to call the string directly
.decode('hex')
Decrypt it, but how would you solve it without using this function?
The first idea is to solve the ascii value of each group in two groups, and then merge the strings to get the specific code as follows
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}
I said string
decode('hex')
The function, and then there are two other functions that rotate hexadecimal, so I'm going to summarize them both here by 1
The built-in function hex()
You can only convert decimal integers to decimal 106. You cannot convert strings
hexlify() and b2a_hex() of the binascii library
The function of these two functions is to convert the string to base 106, and the corresponding decryption function is respectively
unhexlify()
and
a2b_hex()
Hexadecimal transfers
2 base, 8 base, 106 to 10 base is relatively simple, direct call
int function
int(str,base) // return 10 Hexadecimal integer , But notice what happens here 1 The parameters are strings
The corresponding decryption functions are
bin() //10 Turn into the system 2 Into the system
oct() //10 Turn into the system 8 Into the system
hex() //10 Turn into the system 106 Into the system
But if you go straight from base 2 to hexadecimal, you'll have to take an extra step, using int to go straight to base 10
hex()
The function converts base 10 to base 106
map(lambda x:hex(int(x,2)),['0011']) //lambda expression
Or is it
[hex(int(x,2)) for x in ['0011']] // List of analytical
The corresponding decryption function is
map(lambda x:bin(int(x,16)),['ef'])
Finally, I attached a hexadecimal conversion widget written by python, whose main function is to convert a group of 2, ascii, or 106 into a string. Presumably, this type of question is often encountered on ctf
# make by jiang 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) # batch 2 Turn into the system 10 Into the system
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
Usage:
Hexadecimal string:
666C61677B65633862326565302D336165392D346332312D613031322D3038616135666137626536377D
bintostr.py -x "666C61677B65633862326565302D336165392D346332312D613031322D3038616135666137626536377D"
flag{ec8b2ee0-3ae9-4c21-a012-08aa5fa7be67}
Hexadecimal string:
It can have Spaces or no Spaces
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
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
ascii turns strings
It can be a space delimiter, or it can be a space delimiter
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'
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}
0
The above examples are all from some ctf questions
conclusion