實驗吧whatamitoyou writeup
根據題目和前期出現的字串,可以搜尋到一首歌My Best Friends InThe World(What Am I To You?)。對比這首歌可以看出我們得到的歌詞順序是亂序。
一大堆賦值結束後,在0x401890處把第一句歌詞的記憶體地址放到了[rbp-0x8]的位置,0x00007ffd54ce2290(為了書寫方便,之後不寫7ffd54ce了)。
取了輸入的第一個字元,存到了[rbp-0x11],比較是否為0
從0x004018db到0x4018f1,根據[輸入的第一個字元-65+32]得到了下一句歌詞。下一句歌詞的地址是儲存在記憶體地址rax+rdx*0x8處的。[rbp-0x8]儲存的是第一句歌詞的地址,這裡有一個mov rax,[rbp-0x8]的操作,把第一句歌詞的地址給了rax。rax=0x2290
根據搜尋到的歌曲,得到下一句歌詞是“I should have just told you”,檢視它所在位置。從下圖中可以看到,0x1b70處儲存的是這句歌詞,而儲存這個地址的記憶體有兩個,一個是0x2268另一個是0x23a0。也就是說rax+rdx*0x8=0x2268 or 0x23a0,而已知rax=0x2290,因此rax+rdx*0x8=0x23a0,由此推斷出rdx=0x22=34。
rdx=輸入-65+32,因此輸入的第一個字元是67=‘C’。
若輸入的第一個字元為A,則得到0x2390->what I lost
若輸入的第一個字元為B,則得到0x2398->what am I to you
若輸入的第一個字元為D,則得到0x23a8->Am I a joke,your knight,oryou brother?
根據下一句歌詞所在的位置可以推斷出相應的輸入。
第三句歌詞是What I lost... was a piece of your hair!在Ishould have just told you下方有四句歌詞。What I lost是第二句,因此輸入的第二個字元是B。
whatI lost的下一句歌詞是Now it’s gone;goneforever,在第四句,因此輸入的第三個字元是D。
依次類推,得到剩下的輸入。
完整的輸入為CBDABCADBCCABBABBABACBCCABDADBABABB
加上這個引數執行程式得到flag
參考的writeup:
http://sibears.ru/labs/TJCTF-2016-whatamitoyou/