1. 程式人生 > >170707 逆向-南郵CTF逆向(WxyVM1)

170707 逆向-南郵CTF逆向(WxyVM1)

1625-5 王子昂 總結《2017年7月7日》 【連續第278天總結】
A. 南郵CTF逆向(4)
B. 4:
記事本打開發現檔案頭是ELF,拖入IDA進行反編譯,發現只有幾個函式
檢視main函式,發現輸入以後呼叫sub_4005B6()函式,然後判斷長度是否為24和字串0x601060比較
再進一步看4005B6,發現是按照0x6010C0的14997個位元組來處理,每3個位元組為一組,每組的第一個位元組為處理方式,通過switch來判斷,包括加減乘異或等;第二個位元組指定處理第幾個位元組;第三個位元組則為處理數
這裡寫圖片描述
由於處理內容過於龐大,就想直接使用IDC指令碼來逆處理目標字串。加減乘異或的逆運算都很明顯。
思路很清晰,然而在寫指令碼的時候出問題了:IDC指令碼不接受陣列和char型別的宣告(或者是我不會(:з」∠)


無法新申請記憶體空間,就只好使用已有的記憶體空間了;然而*(0x601060)的使用方法也不承認,說好的IDC指令碼和C++很像呢
想把這一段指令碼Dump下來用py處理也是可以的,不過在找IDC的寫入函式時找到了PatchByte(a,v)函式,可以將v寫入a位元組
那麼直接對0x601060位置的24個字串處理即可得到flag
IDC指令碼如下:

auto i;
for ( i = 14997; i >= 0; i = i - 3 )
  {
    auto v0 = Byte(0x6010C0+i);
    auto v3 = Byte(0x6010C0+(i + 2
)); auto result = v0; if(v0==1){ result =Byte(0x6010C0+i + 1); PatchByte(0x601060 + result*4,Byte(0x601060 + result*4)-v3); } if(v0==2){ result =Byte(0x6010C0+i + 1); PatchByte(0x601060 + result*4,Byte(0x601060 + result*4)+v3); } if(v0==3){ result
=Byte(0x6010C0+i + 1); PatchByte(0x601060 + result*4,Byte(0x601060 + result*4)^v3); } if(v0==4){ result =Byte(0x6010C0+i + 1); PatchByte(0x601060 + result*4,Byte(0x601060 + result*4)/v3); } if(v0==5){ result =Byte(0x6010C0+i + 1); PatchByte(0x601060 + result*4,Byte(0x601060 + result*4)^Byte(0x601060+v3*4)); } else continue; } for(i=0;i<24;i++) Message("%c",Byte(0x601060+i*4))

注意單位為位元組,因此直接對地址運算時需要x4
C. 明日計劃
南郵CTF逆向5、6