ctf經(jīng)常遇到進(jìn)制轉(zhuǎn)換的問題,就正好做一個(gè)進(jìn)制轉(zhuǎn)換總結(jié),分享出來供大家參考學(xué)習(xí),下面來一起看看詳細(xì)的介紹:
創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括黃龍網(wǎng)站建設(shè)、黃龍網(wǎng)站制作、黃龍網(wǎng)頁制作以及黃龍網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,黃龍網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到黃龍省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
字符串與十六進(jìn)制轉(zhuǎn)換
例如百度ctf 12月的第二場第一個(gè)misc
?
1
666C61677B65633862326565302D336165392D346332312D613031322D3038616135666137626536377D
比較簡單的一種做法就是直接調(diào)用字符串的.decode('hex')解密即可, 但如果不用這個(gè)函數(shù)你會(huì)怎么解呢?
一種思路就是先2個(gè)分組,解出每組的ascii值,合并下字符串即可得到,具體代碼如下
?
1234567
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}
前面說了字符串的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庫的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)制比較簡單,直接調(diào)用
int函數(shù)
?
1
int(str,base) //返回十進(jìn)制整數(shù),但注意此時(shí)第一個(gè)參數(shù)為字符串
對(duì)應(yīng)的解密函數(shù)分別是
?
12345
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)制,比較精簡的寫法是
?
1
map(lambda x:hex(int(x,2)),['0011']) //lambda表達(dá)式
或者是
?
1
[hex(int(x,2)) for x in ['0011']] //列表解析
對(duì)應(yīng)的解密函數(shù)就是
?
1
map(lambda x:bin(int(x,16)),['ef'])
最后在附上自己用python寫的一個(gè)進(jìn)制轉(zhuǎn)換小工具,主要功能是對(duì)一組二進(jìn)制,或者ascii,或十六進(jìn)制轉(zhuǎn)換成字符串,想必ctf上也經(jīng)常會(huì)遇到這類題型吧
?
1234567891011121314151617181920212223242526272829303132333435363738394041424344
# 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
用法:
十六進(jìn)制轉(zhuǎn)字符串:
666C61677B65633862326565302D336165392D346332312D613031322D3038616135666137626536377D
?
12
bintostr.py -x "666C61677B65633862326565302D336165392D346332312D613031322D3038616135666137626536377D"flag{ec8b2ee0-3ae9-4c21-a012-08aa5fa7be67}
二進(jìn)制轉(zhuǎn)字符串:
可以有空格,也可以無空格
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
?
12
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轉(zhuǎn)字符串
可以是空格分隔,也可以是,分隔
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'
?
12
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"-.-. - ..-. .-.. ... -... ..--.- -... ... .-..
以上實(shí)例均來自某些ctf賽題
總結(jié)
序列密碼又稱流密碼,原理是明文流和密鑰流按順序逐位異或運(yùn)算,從而產(chǎn)出密文流,序列密碼屬于對(duì)合運(yùn)算。
以下是典型的序列密碼RC4的加解密算法實(shí)現(xiàn)。其中秘鑰流產(chǎn)生算法由RSA和PRGA兩個(gè)核心子算法組成。
其中引用了FrankTools模塊中的ItoB, XOR, StoB, BtoS, swap函數(shù),F(xiàn)rankTools模塊中將常用函數(shù)打包以便調(diào)用,展示如下:
水平和精力所限,疏漏之處難免,歡迎各位多多不吝賜教!
f@tacgib.club
首先來看一個(gè)函數(shù)間的調(diào)用
類方法:
執(zhí)行結(jié)果:
metaclass能有什么用處,先來個(gè)感性的認(rèn)識(shí):
1.1 在wiki上面,metaclass是這樣定義的:In object-oriented programming,
a metaclass is a class whose instances are classes.
Just as an ordinary class defines the behavior of certain objects,
a metaclass defines the behavior of certain classes and their instances.
也就是說metaclass的實(shí)例化結(jié)果是類,而class實(shí)例化的結(jié)果是instance。我是這么理解的:
metaclass是類似創(chuàng)建類的模板,所有的類都是通過他來create的(調(diào)用 new ),這使得你可以自由的控制
創(chuàng)建類的那個(gè)過程,實(shí)現(xiàn)你所需要的功能。
當(dāng)然你也可以用函數(shù)的方式(下文會(huì)講)
4.1 用類的形式
4.1.1 類繼承于type, 例如: class Meta(type):pass
4.1.2 將需要使用metaclass來構(gòu)建class的類的 metaclass 屬性(不需要顯示聲明,直接有的了)賦值為Meta(繼承于type的類)
4.2 用函數(shù)的形式
4.2.1 構(gòu)建一個(gè)函數(shù),例如叫metaclass_new, 需要3個(gè)參數(shù):name, bases, attrs,
name: 類的名字
bases: 基類,通常是tuple類型
attrs: dict類型,就是類的屬性或者函數(shù)
4.2.2 將需要使用metaclass來構(gòu)建class的類的 metaclass 屬性(不需要顯示聲明,直接有的了)賦值為函數(shù)metaclas_new
5.1 basic
metaclass的原理其實(shí)是這樣的:當(dāng)定義好類之后,創(chuàng)建類的時(shí)候其實(shí)是調(diào)用了type的 new 方法為這個(gè)類分配內(nèi)存空間,創(chuàng)建
好了之后再調(diào)用type的 init 方法初始化(做一些賦值等)。所以metaclass的所有magic其實(shí)就在于這個(gè) new 方法里面了。
說說這個(gè)方法: new (cls, name, bases, attrs)
cls: 將要?jiǎng)?chuàng)建的類,類似與self,但是self指向的是instance,而這里cls指向的是class
name: 類的名字,也就是我們通常用類名. name 獲取的。
bases: 基類
attrs: 屬性的dict。dict的內(nèi)容可以是變量(類屬性),也可以是函數(shù)(類方法)。
所以在創(chuàng)建類的過程,我們可以在這個(gè)函數(shù)里面修改name,bases,attrs的值來自由的達(dá)到我們的功能。這里常用的配合方法是
getattr和setattr(just an advice)
下面實(shí)現(xiàn)python中在一個(gè)類中調(diào)用另一個(gè)類的函數(shù)方法
或者下面來一個(gè)號(hào)理解的例子
執(zhí)行結(jié)果:
先來介紹內(nèi)部類與外部類是什么?
看源碼解析:
內(nèi)部類調(diào)用外部類的類屬性和類方法
參考文獻(xiàn)1
參考文獻(xiàn)2
參考文獻(xiàn)3
#深入看看python的這個(gè)庫
import hashlib
#簡單的測試一個(gè)字符串的MD5值
src = 'abc'
print (hashlib.md5(src).hexdigest().upper())