DASCTF安恒三月赛re部分复现
Drinksometea
題目給了exe和一個(gè)tea.png.out(加密完生成的文件),哇這個(gè)第一題做了我一天啊。。。已知是tea就卡在不會(huì)文件讀寫是真的難受住了嗚嗚嗚嗚
邏輯是很清晰的,CreateFile,ReadFile 這些句柄可自行百度,理解是在干什么即可(但要是要像我一樣想仿著這個(gè)寫個(gè)C++腳本逆回去。。。。就各種報(bào)錯(cuò)。。。一言難盡了。。wtcl)
關(guān)鍵就在loc_4010A0的位置,但是不能F5,因?yàn)榧恿嘶ㄖ噶?br /> 哇今天最大的收獲就是k1ee師傅給一步步教的去花(感謝!!
Undefine+C(emmm早有耳聞。。。)我以為這就結(jié)束了。。
師傅說還要把jz jnz 和 db 0E8h 給nop掉,用的 010editor (長(zhǎng)見識(shí)了~
jz jnz 機(jī)器碼 74 75,還有下面用到的nop 是90,常識(shí)了
搜索 ,然后 Ctrl + R (五個(gè)都要改成 90 吖。。。
然后就可以看到正常的函數(shù)了,確實(shí)是tea,之前有見過類似的題
傳入了假的flag作密鑰,我本來以為密鑰就是flag四個(gè)字母
動(dòng)調(diào)了一下發(fā)現(xiàn)我還是太天真了(是四個(gè)一組,還要考慮大小端序,如果沒有動(dòng)調(diào),廢物就當(dāng)場(chǎng)gg了
哦對(duì),這道題動(dòng)調(diào)會(huì)秒退的。。是這個(gè)函數(shù)作怪,在這兒下斷
有個(gè)get,out!哈,這。。一步步繞唄,走右邊那條路就繞過了
ps:解密函數(shù)里delta是個(gè)負(fù)數(shù),不太好辦得看看十六進(jìn)制
拿到了這些,tea解密腳本還是好寫的。。。但是!寫入二進(jìn)制文件我是真的真的不會(huì)啊(哭泣。。。。)
這里先貼一個(gè)學(xué)長(zhǎng)寫的C#腳本叭
#include <stdio.h> #include <stdint.h> #define _CRT_SECURE_NO_WARNINGS//注意注意,本題為算數(shù)移位,不能用uint!!! //加密函數(shù) void encrypt(int* v, int* k) {int v0 = v[0], v1 = v[1], sum = 0, i; /* set up */int delta = 0x9e3779b9; /* a key schedule constant */int k0 = k[0], k1 = k[1], k2 = k[2], k3 = k[3]; /* cache key */for (i = 0; i < 32; i++) { /* basic cycle start */sum += delta;v0 += ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1);v1 += ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3);} /* end cycle */v[0] = v0; v[1] = v1; } //解密函數(shù) void decrypt(int* v, int* k) {int v0 = v[0], v1 = v[1], sum = 0xC6EF3720, i; /* set up */int delta = 0x9e3779b9; /* a key schedule constant */int k0 = k[0], k1 = k[1], k2 = k[2], k3 = k[3]; /* cache key */for (i = 0; i < 32; i++) { /* basic cycle start */v1 -= ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3);v0 -= ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1);sum -= delta;} /* end cycle */v[0] = v0; v[1] = v1; }int main() {int v[2], k[4] = { 1734437990, 1801545339, 1818648421, 2099341153 };FILE* fin = fopen("tea.png.out", "rb");//注意不是"r"!!!FILE* fout = fopen("tea.png", "wb");while (fread(v, sizeof(v), 1, fin)){//printf("%d %d\n",v[0],v[1]);decrypt(v, k);//encrypt(v,k);//printf("%d %d\n",v[0],v[1]);fwrite(v, sizeof(v), 1, fout);}fclose(fin);fclose(fout);return 0; }解完就是個(gè)圖片。。嗚嗚好丑。。真就卡我一天啊,哭死
Enjoy_it
看了一下別的師傅的wp,覺得。。。這才是簽到題吧(唉。。既然不復(fù)雜就復(fù)現(xiàn)一下了)
ida打開發(fā)現(xiàn)不對(duì)勁,是個(gè).NET程序,上dnSpy
b.b和b.c是對(duì)輸入的校驗(yàn),flag好像是取這個(gè)輸入的bytes進(jìn)行運(yùn)算生成的
關(guān)鍵是它會(huì)輸出flag!!那豈不是很友好。。(但要想辦法跳過那個(gè)Sleep
所以先看看輸入的text2是什么,base64既視感(表?yè)Q了。。。
解出輸入,驗(yàn)證正確~
到了關(guān)鍵了,怎么跳過Sleep,這要是ida就好了。。不會(huì)用dnSpy啊。。我是廢物。。。然后,去問了那個(gè)寫wp的師傅~~
師傅說動(dòng)調(diào)的時(shí)候用右鍵設(shè)置下一條語(yǔ)句,誒還有這么神奇的功能嘛
好耶!!! 學(xué)到了學(xué)到了,復(fù)現(xiàn)完成啦
總結(jié)
以上是生活随笔為你收集整理的DASCTF安恒三月赛re部分复现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 南邮Android Studio应用高德
- 下一篇: 互相关函数的实际应用