打開后是一個windows下的pe檔案,查殼,無殼,為32位的可執行檔案,使用IDA(32)打開,f5一鍵反編譯,發現反編譯不了,顯示positive sp value has been found,那就開始看匯編把!

這里需要我們輸入flag,通過后面的判斷可以知道,輸入字符長度為24,繼續往下:

,,
這里可以看出來,flag經過了兩個函式,__Z5wrongPc和__Z3omgPc如下:
前者主要對flag進行一些操作,偶數位(從0開始)^i,奇數位-1,得到的結果值傳入后者再與字串unk_4030C0進行比較


這里,發現有錯誤的輸出,但輸出錯誤并不會影響到整個程式的進行,而且后序的傳參傳的仍是原來的值,所以這里是個假的flag!!!好把,做題的時候我沒有發現,(把假的flag求出來后才發現是假的>~<,但不影響啦)繼續,
這里,進去__Z7encryptPc函式后,什么都沒有,而箭頭指向的地方是個回圈解密的程序,換至OD中動態除錯,運行到 call 401500處,

f7單步跟蹤,發現函式流程如下:

判斷[ebp+0x1c](計數器,起始值為0)的值是否等于0x12,然后從input中取出對應的字符與404012處對應的字符進行異或,異或后的值再與[ebp+eax*4-0x6c]中的值相比較,相等則繼續直至退出回圈,若有一個不相等則退出程式, 查看[ebp+eax*4-0x6c]中的值,如圖:

因此可以求出flag[0:19]的值,還剩下最后5個,往后繼續,有提示"come here",因此繼續往下運行,必要時更改標志暫存器的值,跳過一些判斷,跳出該函式處
運行到call 40159a處,f7單步進入,函式開頭為,

結尾為

函式開頭將5個數,放入了[ebp-0x11]地址處,繼續運行至0x401617處,發現就是將flag的第一個字符與開頭的第一個字符相比較,若相等則輸出Really???若不相等就是輸出I hide the last past,但這肯定是不相等的,再結合提示猜測與最后flag的五個字符有關,因為flag最后一位為'}',故猜測flag即為開頭五個字符與ord('}')-0x3a異或得到,腳本如下:
c=[0x0E,0x0D,0x09, 0x06,0x13,0x05,0x58, 0x56,0x3E,0x06,0x0C, 0x3C,0x1F,0x57,0x14, 0x6B,0x57,0x59,0xd] d=[0x25,0x74,0x70,0x26,0x3A] b='hahahaha_do_you_find_me?' print(len(a),len(b),len(c)) for i in range(19): temp=ord(b[i])^c[i] print(chr(temp),end='') for i in d: x=i^(ord('}')^0x3a) print(chr(x),end='')
得到結果即為flag!!!

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/143684.html
標籤:其他
上一篇:抖音無水印下載
