日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

reverse-for-the-holy-grail-350逆向寒假生涯(23/100)

發布時間:2025/3/21 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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數組呢?

v7 = 666;do{*v6 = v7 ^ *(_BYTE *)v6;v7 += v7 % 5;++v6;}while ( &v14[18] != v6 );

從這里就可以看出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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。