集训(一)-ezret
0x01 题目来源
暑期训练题
0x02 思路
先查壳,die显示64位无壳,丢进ida分析
获取输入flag,首先要对输入进行检查,格式为flag{---}(每八个字符有一个"-")
检验完成后进入对字符的加密过程
发现其中只有0-9以及A-F,中间的"-"被舍弃
(或者动调进入后观察其中使用的寄存器,及rax以及rdx,发现为输入的字符)
flag{87654321-87654321-12345678-12345678}
查看汇编
将fun1与fun2轮流压栈,对fun2压栈时,将字符末位的一个单字节*6,再将fun2加上其结果(由于每一条xor指令的长度为6位,所以进行乘6处理)这样的操作进行了16次
此时r8,r9变为flag中的字符
进行一轮xor操作后进入fun1
将异或得到的值保存低八位(即最终的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,为一种新的解题思路