集訓(一)-ezret

Cia1lo發表於2024-07-10

0x01 題目來源

暑期訓練題

0x02 思路

先查殼,die顯示64位無殼,丟進ida分析
image

獲取輸入flag,首先要對輸入進行檢查,格式為flag{---}(每八個字元有一個"-")

檢驗完成後進入對字元的加密過程
image
發現其中只有0-9以及A-F,中間的"-"被捨棄
(或者動調進入後觀察其中使用的暫存器,及rax以及rdx,發現為輸入的字元)
image
flag{87654321-87654321-12345678-12345678}

檢視彙編
image
將fun1與fun2輪流壓棧,對fun2壓棧時,將字元末位的一個單位元組*6,再將fun2加上其結果(由於每一條xor指令的長度為6位,所以進行乘6處理)這樣的操作進行了16次

此時r8,r9變為flag中的字元
image

進行一輪xor操作後進入fun1
image
將異或得到的值儲存低八位(即最終的reverse也只考慮低八位),將得到的值賦給r8的低八位,r8左移,將r8的高8位賦值給r9,r9左移,最終num3中儲存的即為字元末尾的一個單位元組所對映得到的16進位制數.

0x03 EXP

int main() {
    unsigned long long n1=0x8C4092BC7513844A;
    unsigned long long n2=0xB2E5322A7C1C3919;
    for (int i=0;i<16;i++) {
        int m1=n1%0x100;
        int m2=n2%0x100;
        n1=n1/0x100+m2*0x100000000000000;
        n2=n2/0x100;
        int j;
        for (j=255;j>=0;j--) {
            m1^=xor_num[j];
            if ((m1%0x100)==0) {
                break;
            }
        }
        flag[i]=j;
    }
    for (int n=15;n>=0;n--) {
        printf("%02X",(unsigned char)flag[n]);
    }
    return 0;
}

flag{760B13E9-6F5E2F44-646D6355-54AB1AED}

0x04 總結

1.做題中犯了致命的錯誤,進行xor時將對三位16進位制數進行異或,與低八位的要求不符
2.Mz1師傅也提供了新的思路,瞭解到加密為00-FF的對映關係,可以直接採用爆破獲得flag,為一種新的解題思路