reverse-for-the-holy-grail-350逆向寒假生涯(23/100)
拖進ida
大概看了一下,一眼看上去,有嫌疑的就是兩個函數
v4 = (unsigned int)validChars((__int64)&v9);和
v5 = stringMod((__int64)&v11);validChars
這玩意主要是判斷作用,實質性的改變這些不起作用。直接忽了
stringMod
分析
仔細看了一下代碼,主要分三部分來進行加密的
第一部分
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這行代碼也就是序數判斷是否是3的倍數,不是三的倍數就沒有必要繼續判斷后面的。
v12 != firstchar[(unsigned __int64)也就是用來判斷序號0,3,6,9,12,15這六個是否等于firstchar數組中的元素
第二部分
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;}這里需要結合兩處代碼來查看,當等于2時,才能進入循環判斷*v5 != thirdchar[v9],進去一次之后又被置位0,即+3。舉個例子,第一次進去判斷v5數組是下標2的位置,但是第二次進去的話,那就是下標5的位置。
即判斷2,5,8,11,14,17下標值是否等于thirdchar數組元素
第三部分
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的意思,主要是為了構成3個為一組,因為當0,和1時,都在else里面執行,即
執行后v10是第0號和第1號的乘積值,v10 *= *v5;,
v5經過一番變換,
v10 *= *v5;if ( ++v11 == 3 )v11 = 0;}++v8;++v5;這里最主要的是v10 *= *v5,即執行了兩次, v10初始值是1,執行完兩次后,v10=*v5(第0號) X *v5(第1號),那么如何得到v5數組呢?
從這里就可以看出v5數組了,已經把flag的值分別對應異或了一個數組,下面用代碼求出數組:
int v[18];v[0] = 666;for (int i = 1; i < 18; i++) {v[i] = v[i-1]+(v[i-1] % 5);}然后用flag分別對應異或它之后就得到了v5數組,v5數組再用來3個一組爆破求出flag 的下標為1,4,7,11,14,17元素值,這里可以利用爆破。
v10 % *v5 != masterArray[v9]這行代碼也就是v5[0]*v5[1]%v5[2] != masterArray[v9]
而v5數組中也就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?總結
以上是生活随笔為你收集整理的reverse-for-the-holy-grail-350逆向寒假生涯(23/100)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: crackme 逆向寒假生涯(22/1
- 下一篇: 2ex1逆向寒假生涯(24/100)