一:簽到題0x01:運行程序,顯示flag就在這兒,直接IDA打開,進入main函數F5查看偽代碼。
0x02:看到一串奇怪的字符串,并且v10和這段字符串有操作,后面if語句有v10,我們試著將這個字符串輸入程序中運行,出現如下結果。
0x03:說明這串字符串就是正確的輸入,然后根據字符串的特征可以看出是base64加密的。隨便百度一個base64在線解密,順利解出flag。
二:easycrack:
0x01:運行程序,please input the right ans,將程序拖到ida里。F5查看偽代碼,有很多奇怪的函數,通過OD,IDA動靜結合
分析一下一些函數的用法。
0X02: 通過OD,可以看到其中的sub_4011ea和sub_401064,相當于printf和scanf函數,在IDA中按N修改名字。然后先隨便一組數據。
0x03 根據OD觀察內存變化,可以知道var_9c保存的是輸入的值,然后后面的sub_4011BD看返回值eax中值可以看
出這個函數求輸入的長度,
var_a0里保存長度,將var_9c改名為input,A0改名為l。
0x04 然后var_74置0,后面比較var_74和輸入的長度,大于(jge)等于就跳轉到右邊,否則進入左邊。
左邊的算法不是很清楚是什么操作,百度了一下,是對2去模的優化代碼,(詳細請
看blog.csdn.net/qq276592716/article/details/6971781)。
0x04:根據前面的優化代碼,確定如果var_74是奇數就跳轉到右邊的操作,否則進入左邊。左邊有
對var_78與5比較,小于等于才會進入左邊的流程,否則就退出了
。
0x05 因為現在var_74的值是0,所以我們先看左邊的操作,通過OD。觀察返回值(eax)值得變化,
可知道sub_401136是取字符串的操作,改名為getstring
0x06 ,繼續往下看,接著是是getstring函數取var_8c的字符串,通過OD觀察eax的可以看到取出
的值是mortal,所以var_8c='mortal';
0x07:通過上面的分析左邊的流程注釋如下
接下來看流程圖可知是,var_78++;var_74++,然后跳轉到var_74和長度的比較,繼續循環。
0x08:再分析右邊的流程。因為左邊已經把函數的功能分析完成,所以右邊直接可以得出來,是將input的奇數位的數與3異或。
0x09;根據上面的分析,可以寫出對input進行操作的偽代碼i=0
x=0
str='mortal'
l=len(input)
for(i=0;i<len;i++)
{ if(i%2)
{ input=input^3}
else{
f(x>5)
break;
input=input^str[x]
x++}}
0x0A:接下來就是看最后的比較了。首先var_74置0,與長度比較,大于就跳出循環,否則長度與25比
較,不相等退出循環,根據這里能退出輸入的長度為25位
0x0b 接下來就是講input[0]與var_70做比較,相同就繼續循環,var_74++;不等就把var_7c置0,跳出循環。
往上翻,可以看到var70到var_10有長度為25位的數據,正好與輸入位數相同,所以判斷是比較的字符串。
0x0c :寫出逆算法成功解出flag
三crackme0x01 這是一道安卓逆向,直接祭出神器JEB反編譯查看源碼。0x02 :找到mainactivety ,然后按TAB鍵直接反編譯出JAVA代碼
0x03:邏輯很簡單,就是輸入的奇數位與sincnuisasher異或,然后奇偶位交換,后與V2的值比較
0x03:把代碼直接復制到eclipse里,然后把算法反過來,先交換,再異或,然后將其中沒有聲明的變量聲明一下,運行,直接跑出flag.
四:way0x01 od,ida載入程序
0x02 和第二題一樣,繼續用OD找出其中奇怪的函數的作用。 一樣的首先找出了printf(40120d),和scanf(401064)函數,
在IDA中改名,然后隨便輸入1234567890,繼續在OD里面單步(F8)跟
.
0x03 根據返回值,可以判斷4011fe是算輸入的長度,然后送入var_38
。
然后401145根據返回值可以知道也是個getstring。Var_2c保存的輸入的值,改名為input
0x04然后在IDA直接f5看偽代碼


發現只有四個if比較,就可以確認輸入只能為0123之中的數字。0x05 在后面可以看到,v8是一個標志位,如果為真的話,就輸入正
確,在v8初始化時0,所以看哪些地方能改變v8的值,使其是個非0值。
0x06:在偽代碼中,可以看出當getstring(v10)==“X”時,能使的v8為1,再根據匯編代碼和OD單步跟,可以發現這個比較里,getstring
是返回var_1c的值,
而var_1c=‘C*......*...****.*.****...*....*.*..**********.*..*....*...*...**.****.*.*...****.*....*.*******..*.***..*.....*.*.." "***.**.***.*...****....*X..*’
V10相當于一個下標。所以getstring的返回值var_1c[v10]=”X”,的時候就是正確的時候。
0x07:v10初始化為0 ,而var_1c[72]才是‘x’,所以要找到v10的變化方式,通過偽代碼可以看到,
當輸入為0時,v10=v10-16,input=1時,v10=v10+1;Input=2時,v10=v10+16,input=3時,v10=v10-1;但是如果var+1c[v10]==”*”就會退出循環,
v8還是為0。
0x08:這是可以將var_1c看成是9*16的一個矩陣地圖,如圖。每行16元素,輸入0,相當于向上移,1等于右移,2代表向下移,3代表左移。
然后走到X的位置,路線為222122232211010011100333030011111211011211122332330332223221110011112233。
0x09 :IDA發現提示正確后,還讓我們看的清楚一些,后面還有一些函數,點最后一個函數進去(前面兩個點過去發現沒有
什么實際用處)。在OD中該函數的位置下斷點,f9運行到此函數出,單步走。
0x0A:找到flag
打了這么多能加精嗎,,,雖然很菜,哈哈。最后一張圖不知道為什么傳上來,,,在后面寫的時候排版沒問題啊,保存
后就變得奇怪了,最后還莫名其妙多了一張圖。題目下載:http://pan.baidu.com/s/1hsccBkC
|