re學習筆記(49)BUUCTF-re-[GUET-CTF2019]number_game

新手一枚,如有錯誤(不足)請指正,謝謝!!
個人博客:點擊進入
題目鏈接:[GUET-CTF2019]number_game

IDA64位載入,進入main函數
在這裏插入圖片描述
函數sub_4006D6()函數是驗證用戶輸入長度和字符範圍

看了一下判斷條件sub_400917()函數,明顯的5*5數獨遊戲的規則
在這裏插入圖片描述
看下sub_400881(v7)函數
在這裏插入圖片描述
在這裏插入圖片描述
將25個數中爲#號的替換爲v7中的數值
在這裏插入圖片描述
input中的十個數最終轉換爲V7中的十個數
之間經過了sub_400758()和sub_400807()兩個函數。
這兩個函數採用了遞歸,我實在看着懵逼不會寫解題腳本。。

在判斷用戶輸入這行下斷點
在這裏插入圖片描述
然後動調運行,輸入0123456789正好十個數,回車,程序被斷下來
在這裏插入圖片描述
在這裏插入圖片描述
F8單步,當執行到jz這一行時候
修改z標誌位使其可以執行下面的代碼(因爲輸入的字符範圍不對嘛)
在這裏插入圖片描述
繼續F8單步,使之執行完兩個遞歸的函數
在這裏插入圖片描述
雙擊V7。來到對應棧地址。
在這裏插入圖片描述
找到下標的對應關係。
在這裏插入圖片描述
先計算出5*5的數列
得出替換的十個數分別爲0,4,2,1,4,2,1,4,3,0

寫腳本計算flag

#include <stdio.h>
int main()
{
    char arr[] = { 48, 52, 50, 49, 52, 50, 49, 52, 51, 48,0 };
    int i,biao[] = { 7,3,8,1,9,4,0,5,2,6 };
    char input[11] = { 0 };
    for (i = 0; i < 10; i++)
        input[biao[i]] = arr[i];
    printf("flag{%s}", input);
    return 0;
}

在這裏插入圖片描述
得到flag爲flag{1134240024}

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