re學習筆記(10)BUUCTF-re-Youngter-drive

新手一枚,如有錯誤(不足)請指正,謝謝!!
題目鏈接:Youngter-drive
參考資料:
1. IDA sp-analysis failed 不能F5的 解決方案之(一)-『軟件逆向』-看雪安全論壇
2. IDA sp-analysis failed 不能F5的 解決方案之(二)-『軟件逆向』-看雪安全論壇
3. ReleaseMutex 百度百科
4. WaitForSingleObject 百度百科
直接拖入IDA32,提示警告……
在這裏插入圖片描述
在這裏插入圖片描述
首先函數就倆,,,在UPX1,僞代碼第一句是pusha,保存所有寄存器
而最上面的條也沒被讀取出來,顯示灰色
在這裏插入圖片描述
exe文件,使用官網下載的upx進行脫殼進行脫殼
UPX-3.95-win64
在這裏插入圖片描述
脫殼之後成功加載
在這裏插入圖片描述
然後跳轉到_main_0查看
F5僞代碼
在這裏插入圖片描述
簡單分析一下

在sub_411190()函數中
在這裏插入圖片描述
發現source存的和off_418004進行了一個比較
進入off_418004查看,可以看到裏面存的啥
在這裏插入圖片描述
題不可能這麼簡單,所以source肯定經過處理了
點擊source,x鍵進入交叉引用
在這裏插入圖片描述
挨個進去查看,發現第二個是對source進行處理的,也就是對main_0函數裏的StartAddress函數進行分析
在這裏插入圖片描述

WaitForSingleObject
WaitForSingleObject是一種Windows API函數,當等待仍在掛起狀態時,句柄被關閉,那麼函數行爲是未定義的。該句柄必須具有 SYNCHRONIZE 訪問權限。
WaitForSingleObject函數用來檢測hHandle事件的信號狀態,在某一線程中調用該函數時,線程暫時掛起,如果在掛起的dwMilliseconds毫秒內,線程所等待的對象變爲有信號狀態,則該函數立即返回;如果超時時間已經到達dwMilliseconds毫秒,但hHandle所指向的對象還沒有變成有信號狀態,函數照樣返回。
ReleaseMutex
ReleaseMutex是一種線性指令,具有釋放線程擁有的互斥體的控制權。

線程也能告訴系統,它不想在某個時間段內被調度。這是通過調用Sleep函數來實現的:
VOID Sleep(DWORD dwMilliseconds);
該函數可使線程暫停自己的運行,直到dwMilliseconds過去爲止。

另一個進程是sub_41119F
而這裏面是沒有操作的。
在這裏插入圖片描述
結合這兩個進程,可以得到

當第一個進程執行到第10行時候,該線程被凍結,轉向執行另一個線程,也就是函數sub_41119F,也就是說,dword_418008=29,執行循環,在第9行自減一,dword_418008=28 然後執行第十行sleep,線程被凍結,另一個函數sub_41119F開始執行,然後執行到sleep再凍結,再執行第一個進程(因爲WaitForSingleObject函數在等着)
大概是這種變化……
在這裏插入圖片描述
可以發現,dword_418008=29,28,26,24,22的時候對字符串進行了處理,也就是說,當dword_418008爲奇數的時候,對字符串進行處理。當下標爲偶數的時候不進行處理。
然後進入線程1的sub_41112C()函數
在這裏插入圖片描述
提示了這個錯誤。。
然後查看參考資料1和2
先在菜單欄的Options→General,然後勾選stack pointer在這裏插入圖片描述
然後找到出問題的411A04
在View窗口裏查看他的彙編代碼
在這裏插入圖片描述
根據參考資料,我猜想是這裏的跳轉出現了問題
選中跳轉那一行,然後Edit→
在這裏插入圖片描述
然後將其改成jmp跳轉

然後F5試一下……
發現可以進行反編譯了!
在這裏插入圖片描述
在這裏插入圖片描述
好了都分析清楚開始寫代碼

#include <stdio.h>
int main(void)
{
    char off1[] = "TOiZiZtOrYaToUwPnToBsOaOapsyS";
    char off2[] = "QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm";
    char flag[30]={0};
    int i,j;
    for(i=28;i>-1;i--)
    {
        if(i%2==0)
        {
            flag[i] = off1[i];
            continue;
        }
        for(j=0;j<52;j++)
        {
            if(off1[i] == off2[j])
            {
                flag[i] = j+38;
                if(!(flag[i]>=65 &&flag[i]<=90))
                    flag[i] = j+96;
                break;
            }
        }
    }
    puts(flag);
    return 0;
}

輸出
在這裏插入圖片描述
因爲比較的時候最後一位沒有比較,試了半天最後一位爲E
所以最終的flag爲flag{ThisisthreadofwindowshahaIsESE}

往期回顧

小白學習筆記(0) CG-CTF-re-3 py交易
小白學習筆記(1) BUUCTF-re xor
小白學習筆記(2)BUUCTF-re-新年快樂
小白學習筆記(3) CG-CT re ReadAsm2
小白學習筆記(4)BUUCTF-re-reverse_1
小白學習筆記(5)BUUCTF-re-內涵軟件
小白學習筆記(6)BUUCTF-re-SimpleRev
小白學習筆記(7)BUUCTF-re-rsa
小白學習筆記(8)BUUCTF-re-CrackRTF
小白學習筆記(9)BUUCTF-re-刮開有獎

發佈了50 篇原創文章 · 獲贊 7 · 訪問量 3543
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章