1. 程式人生 > 其它 >4G模擬量採集模組_4AI+4AO+1RS485

4G模擬量採集模組_4AI+4AO+1RS485

傳送門:[網鼎杯 2020 青龍組]jocker

不會做嗚嗚,看了別人 wp 才做出來的,求師傅帶帶

無殼,扔進 IDA,f5 發現不能反編譯,原因是堆疊不平衡,先進行棧指標修改

options->general->勾選stack pointer

快捷鍵 alt+k,在 call 的位置修改值改為 0

修改後長這樣

f5 發現還是報錯,繼續修改下一個 call 的位置的值為 0

修改後如下

然後就可以順利反彙編了,主函式如下

不是非常複雜,首先可以得到輸入內容長度為 24,然後有三個關鍵函式 wrong(), omg(), encrypt(),分別進入看一下

首先 wrong 函式如下

是對我們的輸入內容進行了一個簡單的加密,先不管繼續看看 omg 函式

這個函式是將加密過後的輸入內容與 unk_4030C0 進行對比

把 unk_4030C0 的值搞出來,根據 wrong 函式的思路逆向寫個指令碼就可以得到應當輸入的內容是什麼

#include <bits/stdc++.h>
using namespace std;
int a[] = {102, 107, 99, 100, 127, 97, 103, 100, 59, 86, 107, 97, 123, 38, 59, 80, 99, 95, 77, 90, 113, 12, 55, 102}; 
int main() {
  for (int i = 0; i < 24; i++) {
    if (i & 1) a[i] += i;
    else a[i] ^= i;
  }
  for (int i = 0; i < 24; i++) 
    cout << (char)a[i];
  return 0;
}

得到輸入內容:flag{fak3_alw35_sp_me!!},很明顯是個假 flag

繼續往下看第三個關鍵函式 encrypt(),但發現 encrpy 不能反編譯

這裡的 for 迴圈其實是把程式里加殼的部分給脫殼,所以動態除錯

藉助中文搜尋引擎定位到主函式部分後,可以看到如下圖這一部分應該對應著上面所說的 for 迴圈

而根據 IDA 中的程式碼中函式呼叫的位置可以得到,下面的那個 call 就是所謂的 encrypt 函式

在這裡下斷點執行過去,F7 單步進入,這個函式就長這樣

然後 olldump 脫殼,儲存到新的 exe

新程式拖入 IDA 分析,找到 start 函式,看到如下

就是將輸入的內容與 aHahahahaDoYouF 進行異或(注意只異或了19個位元組),然後和 unk_403040 比較,aHahahahaDoYouF 的值如下

所以搞出 unk_403040 的值並寫出指令碼還原一下

#include <bits/stdc++.h>
using namespace std;
int a[] = {14, 13, 9, 6, 19, 5, 88, 86, 62, 6, 12, 60, 31, 87, 20, 107, 87, 89, 13};
string s = "hahahaha_do_you_find_me?"; 
int main() {
  for (int i = 0; i < 19; i++)
    cout << (char)(s[i] ^ a[i]);
  return 0;
}

得到:flag{d07abccf8a410c

少了一部分,於是再四處瞅瞅,還能發現一個函式

這函式多少有些離譜,於是開始猜謎時刻

由於 flag 結尾一定是 "}",所以盲猜 v3 與某個數異或得到剩下的 flag

然後 v3 最後一位是 ":" 也就是 58,58 ^ '}' = 71,大膽猜測每一位都與 71 異或

#include <bits/stdc++.h>
using namespace std;
string s = "%tp&:"; 
int main() {
  for (int i = 0; i < 5; i++)
    cout << (char)(s[i] ^ 71);
  return 0;
}

得到 b37a}

拼接後得到完整 flag:flag{d07abccf8a410cb37a}

離譜