re學習筆記(44)[ACTF2020]game

新手一枚,如有錯誤(不足)請指正,謝謝!!
個人博客:點擊進入
題目的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}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章