集训(一)-ezret

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,为一种新的解题思路

posted @ 2024-07-10 17:46  Cia1lo  阅读(64)  评论(0编辑  收藏  举报