啊呀,第一次寫writeup!!!一個小嘗試!
本道題針對於xctf攻防世界的新手逆向題re1
首先,我們把附件下載下來,發現是一個可執行程序。呃,其實最開始是要查有沒有殼的,但是把這個拖入IDA后,發現可以找到main函數,也就知道它沒有殼啦,不過謹慎點,可以用PEID來進行有無殼的判斷。
先直接運行一下下載來的可執行文件,發現
然后,拖入IDA(32)后,F5反編譯找到main主體函數
在這里,我們可以大概看一下主程序的執行過程,一開始看到這個main里的內容的時候,其實腦子一片空白,后來使用Shift+F12查看字符串
發現有個關鍵字flag get,於是我們點進去
就可以知道執行到unk_413E90處,那么flag就獲得成功啦,再去看下主函數,發現,只要后一個if里v3=0,就可以啦
然后再繼續往上想,v3怎樣才能=0呢,我們來仔細分析下過程(把源碼放這啦)
*************************************************************************************************************
_mm_storeu_si128((__m128i *)&v5, _mm_loadu_si128((const __m128i *)&xmmword_413E34));
v7 = 0;
v6 = qword_413E44;
v8 = 0;
printf(&byte_413E4C);
printf(&byte_413E60);
printf(&byte_413E80);
scanf("%s", &v9);
v3 = strcmp((const char *)&v5, &v9);
if ( v3 )
v3 = -(v3 < 0) | 1;
if ( v3 )
printf(aFlag);
else
printf((const char *)&unk_413E90);
*************************************************************************************************************
在這里出現了_mm_storeu_si128()與 _mm_loadu_si128()
前者的函數原型:void _mm_store_si128 ( __m128i *p, __m128i a);
功能就是把__m128i 變量a的值存儲到p所指定的變量中去;
后者的函數原型:
__m128i _mm_loadu_si128(__128i *p)
功能就是返回P變量中的值
所以_mm_storeu_si128((__m128i *)&v5, _mm_loadu_si128((const __m128i *)&xmmword_413E34))指令就是把xmmword_413E34的值賦給v5
之后,我們要特別注意‘|’這個二進制按位操作符,也就是說進行或運算,但由於v3 = -(v3 < 0) | 1 ,故只要v3=strcmp((const char *)&v5, &v9)的值不是0,那么無論v3是否小於0大於0,進行或運算的結果都不會是0,因此,可以直接忽略這個,於是我們就知道了,只要字符串v5和我們輸入的字符串v9完全相同,那么就會有printf((const char *)&unk_413E90);,故我們就知道flag其實也就是字符串v5。
進去xmmword_413E34
我們可以發現xmmword的值就是3074656D30633165577B465443545544h(h代表是用16進制表示),然而其實它的值還不是這個,放入16進制轉ASCII,發現得到0tem0c1eW{FTCTUD,呀,這個一看就很奇怪,發現它倒着讀DUTCTF{We1c0met0還差不多,不過確實是這樣的,因為涉及到了大小端順序的轉換,呃,為什么會有大端小端的問題,我其實也不大懂,我只知道網絡字節序是大端(高位字節排放在內存低地址端,低位字節排放在內存高地址端),主機字節序是小端(與大端相反)。
一開始我以為輸入這個,flag 就會出現,后來我發現我錯了,還是顯示錯誤,之后,我又嘗試了許久,發現,我漏掉了qword_413E44 dq 7D465443545544h !!! 把它再進行轉換后,}FTCTUD,反過來也就是DUTCTF},啊啊啊,這才看着像答案!!!
然后我們把DUTCTF{We1c0met0DUTCTF}放入可執行文件試試
Oh!!!我的天哪,看來它就是我們心心念念的flag啦
提交flag 后,我看了其他人寫的writeup ,發現有一個好有用的小技巧哦!
那就是:
在相應16進制數處按R鍵可以自動轉化為字符,有了它,就不用去在線轉字符啦
還有就是用記事本打開的話,就直接能找到flag,噢,如此簡單直接。這道題自己花了一個多小時做出來,雖然它好像很簡單,但我,好開心!!!!!!!!!!!!!因為這是自己第一次獨立解出的逆向題!!!!!
這道題還能用OllyDebug來解,步驟更簡單,當然,我是看了大佬的writeup啦
第一次寫writeup ,多多包涵,肯定有解釋有誤的地方或者是不到位的地方,希望諒解!!!如有不正確的地方,也歡迎指出!!!