前言
玩ctf經(jīng)常遇到進(jìn)制轉(zhuǎn)換的問(wèn)題,就正好做一個(gè)進(jìn)制轉(zhuǎn)換總結(jié),分享出來(lái)供大家參考學(xué)習(xí),下面來(lái)一起看看詳細(xì)的介紹:
字符串與十六進(jìn)制轉(zhuǎn)換
例如百度ctf 12月的第二場(chǎng)第一個(gè)misc
666C61677B65633862326565302D336165392D346332312D613031322D3038616135666137626536377D
比較簡(jiǎn)單的一種做法就是直接調(diào)用字符串的.decode('hex')解密即可, 但如果不用這個(gè)函數(shù)你會(huì)怎么解呢?
一種思路就是先2個(gè)分組,解出每組的ascii值,合并下字符串即可得到,具體代碼如下
import res='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}前面說(shuō)了字符串的decode('hex')函數(shù),另外還有兩個(gè)轉(zhuǎn)16進(jìn)制的函數(shù),這里都總結(jié)一下
內(nèi)置函數(shù)hex()
只能轉(zhuǎn)換10進(jìn)制整數(shù)為十六進(jìn)制,不能轉(zhuǎn)字符串
binascii庫(kù)的hexlify()和b2a_hex()
這兩個(gè)函數(shù)的功能是將字符串轉(zhuǎn)換成十六進(jìn)制,對(duì)應(yīng)的解密函數(shù)分別為 unhexlify()和a2b_hex()
進(jìn)制互轉(zhuǎn)
二進(jìn)制,八進(jìn)制,十六進(jìn)制轉(zhuǎn)10進(jìn)制比較簡(jiǎn)單,直接調(diào)用
int函數(shù)
int(str,base) //返回十進(jìn)制整數(shù),但注意此時(shí)第一個(gè)參數(shù)為字符串
對(duì)應(yīng)的解密函數(shù)分別是
bin() //10進(jìn)制轉(zhuǎn)二進(jìn)制oct() //十進(jìn)制轉(zhuǎn)八進(jìn)制hex() //十進(jìn)制轉(zhuǎn)十六進(jìn)制
但二進(jìn)制直接轉(zhuǎn)16進(jìn)制就需要多走一步了,先用int轉(zhuǎn)十進(jìn)制,在用上面提到的hex()函數(shù)將十進(jìn)制轉(zhuǎn)換成十六進(jìn)制,比較精簡(jiǎn)的寫(xiě)法是
map(lambda x:hex(int(x,2)),['0011']) //lambda表達(dá)式
或者是
[hex(int(x,2)) for x in ['0011']] //列表解析
對(duì)應(yīng)的解密函數(shù)就是
map(lambda x:bin(int(x,16)),['ef'])
最后在附上自己用python寫(xiě)的一個(gè)進(jìn)制轉(zhuǎn)換小工具,主要功能是對(duì)一組二進(jìn)制,或者ascii,或十六進(jìn)制轉(zhuǎn)換成字符串,想必ctf上也經(jīng)常會(huì)遇到這類題型吧
# make by 江sir#coding:utf-8import reimport argparse def bintostr(text): text = text.replace(' ','') text = re.findall(r'.{8}',text) s = map(lambda x:chr(int(x,2)),text) #批量二進(jìn)制轉(zhuǎn)十進(jìn)制 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            
新聞熱點(diǎn)
疑難解答
圖片精選