直接進入test函數:
下面的代碼進行第一步操作:
首先a1的長度應該爲19。
接下來對s2進行異或處理。
題目中給出的s2的值如下:
s2 = 0x3929531D01070A00LL;
v4 = 0x391257391F150703LL;
v5 = 0x150F;
v6 = 0x1B;
s2是int64類型,共有8個字節。由於s2、v4、v5和v6的地址是相連的,所以當從s2的起始地址開始進行19個字節的異或處理時,v4、v5和v6中的數值也會被處理。
由於s2佔據了多個字節,在存儲的過程中,一定存在着先分配的字節放在高地址還是低地址的問題。在s2中先分配的字節應該是放在了低地址處。
對s2、v4、v5和v6中的元素按順序寫出,應爲:
s2 = 0x00,0x0A,0x07,0x01,0x1D,0x53,0x29,0x39;
v4 = 0x03,0x07,0x15,0x1F,0x39,0x57,0x12,0x39;
v5 = 0x0F,0x15;
v6 = 0x1B;
然後對其進行異或處理,s2、v4、v5和v6中的元素實際對應的字母爲:
s2 = "flag{50_";
v4 = "easy_lt_";
v5 = "is";
v6 = "}";
對於之後每一步,只要挨着分析即可:
- a1前5位爲’flag{‘
- a1最後1位爲’}’
- a1第7、10、13位應該爲’_’-49,即’.’
- a1第5、6位爲’lt’
- a1第8、9位爲’is’
- ……
- 得到a1爲:
flag{lt.is.50.easy}
反思:
本題主要對於s2的異或理解上出現了問題,忘記考慮了與s2地址相連的其它變量。對於16進制的表示以及小端的特性還是不夠熟悉。