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,為一種新的解題思路