新手一枚,如有錯誤(不足)請指正,謝謝!!
個人博客:點擊進入
題目的git倉庫鏈接:點擊進入
題目分析:
IDA載入,
shift+F12查找字符串
雙擊跟隨到其所在的內存地址,摁’x’鍵交叉引用,找到調用此字符串的指令,來到關鍵代碼。
F5查看僞代碼
先分析sub_4014DC(v2)函數,雙擊進入分析
再分析sub_40156A(v2, &unk_405020)函數
查看一下內存中存儲的數據
發現是每四個字節有一個數據,所以改一下數據類型更方便查看
將他聲明成一個數組,之後就好看多了
也就是每次的*4是乘以的類型長度。數組的類型長度爲4字節,也就是int……
看一下sub_4017D1(&unk_405020)函數,由三個函數組成
sub_40173A(a1)函數
大致功能爲將內存中數據看做9*9的矩陣,遍歷每行,檢測每行是不是都含有1~9這9個數。
sub_4016A3(a1)函數:檢測每列是不是含有1~9這九個數
sub_4015C9(a1)函數,有點難看。
將代碼拷貝下來,自己添加一個長度爲81的數組,寫一個輸出遍歷元素的代碼,看看遍歷的規律。
可以看到他將81個元素分成了9個小方塊,檢測每個小方塊裏是不是都含有1~9
代碼
#include <stdio.h>
int main()
{
int a1[81] = { 0,1,2,3,4,5,6,7,8,
9,10,11,12,13,14,15,16,17,
18,19,20,21,22,23,24,25,26,
27,28,29,30,31,32,33,34,35,
36,37,38,39,40,41,42,43,44,
45,46,47,48,49,50,51,52,53,
54,55,56,57,58,59,60,61,62,
63,64,65,66,67,68,69,70,71,
72,73,74,75,76,77,78,79,80 };
int result;
int l; // [esp+28h] [ebp-20h]
int v4; // [esp+2Ch] [ebp-1Ch]
int v5; // [esp+30h] [ebp-18h]
int k; // [esp+34h] [ebp-14h]
int j; // [esp+38h] [ebp-10h]
int i; // [esp+3Ch] [ebp-Ch]
v5 = 0;
v4 = 0;
for (i = 0; i < 9; i++)
{
for (j = 0; j < 9; j++)
printf("%d\t", a1[i * 9 +j]);
printf("\n");
}
printf("\n");
for (i = 0; i <= 8; ++i)
{
for (j = v5; ; ++j)
{
result = v5 + 2;
if (j > v5 + 2)
break;
for (k = v4; k <= v4 + 2; ++k)
printf("%d ", a1[j * 9 + k]); // 變量j控制行,k控制列
}
printf("\n");
if (v4 == 6)
{
v5 += 3;
v4 = 0;
}
else
{
v4 += 3;
}
}
}
這樣對函數的功能就分析透徹了
結合題目game,這正好是數獨遊戲的規則呀
程序流程:
將用戶輸入的從’a’到’j’的字符轉換爲1到10,
然後遍歷內存中的數據,如果內存中的數據爲0,則將用戶輸入的字符填上去一個。
填完後,滿足數獨遊戲的規則。
開始解題:
先將內存裏的數據提取出來
搜索一個解數獨遊戲的在線網站,填入數據
將填入的數字取出來,然後加上96轉換爲字符
得到最終的flag爲flag{cgadcgifdfacdfibfg}