網(wǎng)站上的充值鏈接怎么做的整站seo怎么做
查殼,32bit,丟進(jìn)ida32中進(jìn)行反編譯,簡單的不多說,直接進(jìn)main分析
簡單分析,打上注釋,沒啥好看的,就一個(gè)加密函數(shù),加密完后和一個(gè)字符串進(jìn)行比較,由此可以逆推出加密前的字符串,也就是flag了,直接進(jìn)入加密函數(shù)進(jìn)行查看
小小base64加密,但其中還有兩個(gè)加密函數(shù),第一個(gè)函數(shù)是對碼表進(jìn)行了變化,第二個(gè)則是將大小寫轉(zhuǎn)換了一下,第二個(gè)我相信在看的各位都能看懂,我著重講一下第一個(gè)加密函數(shù)(我也是理解了好一會兒)
這邊看著似乎很簡單,就是簡單的換值,將字符串a(chǎn)開頭的第六位往后九位和字符串k開頭的第六位往后九位字符進(jìn)行交換,這邊有一個(gè)點(diǎn),這兩個(gè)字符串其實(shí)就是一個(gè)地址連在一塊兒的大字符串也就是字符串ABCDEF GHIJKLMNO PQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
這邊看似是兩個(gè)字符串的相互操作,其實(shí)就是這個(gè)字符串的內(nèi)部操作,可以寫如下代碼
/*
#include<iostream>
using namespace std;
int main()
{char str2[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";char v1;for (int result = 6; result < 15; result++){v1 = str2[result + 10];str2[result + 10] = str2[result];str2[result] = v1;}puts(str2);return 0;
}*/
運(yùn)行出的結(jié)果就是變化后的碼表,這是第一種理解方式,還有第二種理解方式,但是這個(gè)較為麻煩,但應(yīng)該很多人第一時(shí)間都會以第二種方式去理解,所以我詳細(xì)講一下,你們可能會寫出如下代碼
/*
#include<iostream>
using namespace std;
int main()
{char v1;char str1[] = "ABCDEF GHIJKLMNO PQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";char str2[] = "KLMNOP QRSTUVWXY Zabcdefghijklmnopqrstuvwxyz0123456789+/";for (int result = 6; result < 15; result++){v1 = str2[result ];str2[result ] = str1[result];str1[result] = v1;}puts(str1);return 0;
}*/
但是這么寫就錯(cuò)了,因?yàn)榇颂庪m然是兩個(gè)字符串在操作,實(shí)際上確是對一個(gè)字符串進(jìn)行操作,因?yàn)閟tr2是str1的一部分,但這樣硬寫也能寫出來,如下圖
我們將兩個(gè)數(shù)組單拿出來,首先是前六位不變,這個(gè)沒有異議吧,接下來從第七位開始,往后九個(gè)字符被替換成了QRSTUVWXY,這個(gè)也沒有問題吧,但接下來問題來了,我們看到數(shù)組2,是以字符k為開頭的,在數(shù)組中KLMNO已經(jīng)被替換成了UVWXY,但是還有個(gè)p沒有被替換,那就把p加上去,這邊直接看數(shù)組2,不看數(shù)組1了,為什么呢?因?yàn)?#xff0c;第一點(diǎn),數(shù)組2本身就是數(shù)組1的一部分,第二點(diǎn),數(shù)組2已經(jīng)被改變了,但是數(shù)組1中的數(shù)組2部分并沒有被改變,所以看數(shù)組1就沒有意義了,看數(shù)組2即可,數(shù)組2的P后面九位被替換成了GHIJKLMNO,剩余的照抄,你就會發(fā)現(xiàn),和代碼1運(yùn)行的結(jié)果是一樣的,這個(gè)確實(shí)難理解,我也想了好一會兒,建議反復(fù)斟酌斟酌,最后嘛,也就沒什么操作了,這邊已經(jīng)得到了變碼表,然后把要比對的那個(gè)字符串,如下圖
給他大小寫轉(zhuǎn)換一下,最后找個(gè)變碼base64在線解密的網(wǎng)站,輸入,即可得到flag
這道題,看似簡單,實(shí)則簡單,就當(dāng)是多學(xué)了個(gè)知識點(diǎn),若是兩個(gè)相鄰的字符串在互相操作,直接把他變成一個(gè)大字符串,然后在他的內(nèi)部操作就行,注意偏移量即可,其他沒啥了