reverse-for-the-holy-grail-350逆向寒假生涯(23/100)
拖進(jìn)ida
大概看了一下,一眼看上去,有嫌疑的就是兩個(gè)函數(shù)
v4 = (unsigned int)validChars((__int64)&v9);和
v5 = stringMod((__int64)&v11);validChars
這玩意主要是判斷作用,實(shí)質(zhì)性的改變這些不起作用。直接忽了
stringMod
分析
仔細(xì)看了一下代碼,主要分三部分來(lái)進(jìn)行加密的
第一部分
do{v12 = *(_BYTE *)(v2 + v3);v14[v3] = v12;if ( 3 * ((unsigned int)v3 / 3) == (_DWORD)v3 && v12 != firstchar[(unsigned __int64)((unsigned int)v3 / 3)] )v4 = -1;++v3;}while ( v3 != v1 );( 3 * ((unsigned int)v3 / 3) == (_DWORD)v3這行代碼也就是序數(shù)判斷是否是3的倍數(shù),不是三的倍數(shù)就沒(méi)有必要繼續(xù)判斷后面的。
v12 != firstchar[(unsigned __int64)也就是用來(lái)判斷序號(hào)0,3,6,9,12,15這六個(gè)是否等于firstchar數(shù)組中的元素
第二部分
v7 = 666;do{*v6 = v7 ^ *(_BYTE *)v6;v7 += v7 % 5;++v6;} if ( v11 == 2 ){if ( *v5 != thirdchar[v9] )v4 = -1;if ( v10 % *v5 != masterArray[v9] )v4 = -1;++v9;v10 = 1;v11 = 0;}這里需要結(jié)合兩處代碼來(lái)查看,當(dāng)?shù)扔?時(shí),才能進(jìn)入循環(huán)判斷*v5 != thirdchar[v9],進(jìn)去一次之后又被置位0,即+3。舉個(gè)例子,第一次進(jìn)去判斷v5數(shù)組是下標(biāo)2的位置,但是第二次進(jìn)去的話,那就是下標(biāo)5的位置。
即判斷2,5,8,11,14,17下標(biāo)值是否等于thirdchar數(shù)組元素
第三部分
do{if ( v11 == 2 ){if ( *v5 != thirdchar[v9] )v4 = -1;if ( v10 % *v5 != masterArray[v9] )v4 = -1;++v9;v10 = 1;v11 = 0;}else{v10 *= *v5;if ( ++v11 == 3 )v11 = 0;}++v8;++v5;}這里v11 == 2的意思,主要是為了構(gòu)成3個(gè)為一組,因?yàn)楫?dāng)0,和1時(shí),都在else里面執(zhí)行,即
執(zhí)行后v10是第0號(hào)和第1號(hào)的乘積值,v10 *= *v5;,
v5經(jīng)過(guò)一番變換,
v10 *= *v5;if ( ++v11 == 3 )v11 = 0;}++v8;++v5;這里最主要的是v10 *= *v5,即執(zhí)行了兩次, v10初始值是1,執(zhí)行完兩次后,v10=*v5(第0號(hào)) X *v5(第1號(hào)),那么如何得到v5數(shù)組呢?
從這里就可以看出v5數(shù)組了,已經(jīng)把flag的值分別對(duì)應(yīng)異或了一個(gè)數(shù)組,下面用代碼求出數(shù)組:
int v[18];v[0] = 666;for (int i = 1; i < 18; i++) {v[i] = v[i-1]+(v[i-1] % 5);}然后用flag分別對(duì)應(yīng)異或它之后就得到了v5數(shù)組,v5數(shù)組再用來(lái)3個(gè)一組爆破求出flag 的下標(biāo)為1,4,7,11,14,17元素值,這里可以利用爆破。
v10 % *v5 != masterArray[v9]這行代碼也就是v5[0]*v5[1]%v5[2] != masterArray[v9]
而v5數(shù)組中也就v5[1]未知,把v5[1]異或v[1]就等于flag[1]嘍。
代碼
#include <iostream> using namespace std; int main() {char unsigned firstchar[] = { 0x41,0x69,0x6e,0x45,0x6f,0x61 };int thirdchar[] = { 0x2EF,0x2C4,0x2DC,0x2C7,0x2DE,0x2FC };int masterArray[] = { 0x1D7,0x0c,0x244,0x25E,0x93,0x6C };char unsigned flag[18];int v[18];v[0] = 666;for (int i = 1; i < 18; i++) {v[i] = v[i-1]+(v[i-1] % 5);}int j = 0;for (int i = 0;i<18; i=i+3) {flag[i] = firstchar[j];j++;}j = 0;for (int i = 2;i<18 ; i = i + 3) {flag[i]= thirdchar[j] ^ v[i];j++;}int z = 0;for (int j = 1; j < 18; j=j+3) {for (char i = 32; i <= 126; i++) {if (((flag[j-1] ^ v[j-1]) * (i ^ v[j ]) % (flag[j + 1] ^ v[j + 1])) == masterArray[z]) {flag[j ] = i;z++;break;}}}for (int i = 0; i < 18; i++) {std::cout << char(flag[i]);}} AfricanOrEuropean?總結(jié)
以上是生活随笔為你收集整理的reverse-for-the-holy-grail-350逆向寒假生涯(23/100)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: crackme 逆向寒假生涯(22/1
- 下一篇: 2ex1逆向寒假生涯(24/100)