啊呀,第一次寫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 ,多多包涵,肯定有解釋有誤的地方或者是不到位的地方,希望諒解!!!如有不正確的地方,也歡迎指出!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/24511.html
標籤:其他
上一篇:金九銀十首戰告捷!憑借這份Alibaba爆款“面試寶典”成功斬獲美團Offer
下一篇:列置換密碼
