查殼後程式是一個32位無殼的程式
拉到od和ida中分析一下
經過分析,
![](https://i.iter01.com/images/61a3a009ca12665a7eebabb188a8d3a216912d24dc9b462cece7a46b2276f69f.png)
![](https://i.iter01.com/images/cdaebaf33306a418c647758649c30153f7b529319c9ec24e5daa9a51f34f1df5.png)
首先分析第一個字串比較的call
![](https://i.iter01.com/images/8fe43c6cf35ae83bd0f7c8db4db77077e2cb91dd2dad130adc22bca9841bee36.png)
取字串的第一個字元,迴圈字串n次(n為字串的長度),將第一個字元相加n次,然後這個值=550也就是0x226
所以這裡只要滿足 字元*n=550 就可以,經過後面的分析這裡n需要填10(見下文)
也就是 7開頭長度為10 的字串
接下來除錯程式
在段首004010770地址下個斷點(ida中main函式開頭的地址)
![](https://i.iter01.com/images/6697bb4eb14eabc2c75d2f435fd86a5e8b7f9eb74c94d2d7ac85a719cac7fe7d.png)
我們一路單步(F8)來到這裡,這裡必須跳轉(可以修改標誌暫存器的S位改變是否跳轉),不然程式是不會進行字串比較的
下面那個call就是進行字串比較的call了
![](https://i.iter01.com/images/08d94b12fbcdbd12ef2d96de01725a798e70107335f6da5e9ad124654c1da1bf.png)
我們單步(F7)進入,發現這裡面有兩個跳轉
第一個jnz就是==550的判斷
第二個jnz是字串是否相等的判斷
![](https://i.iter01.com/images/43f600a8986efef25c5aad26cefe123379992dcde9c1c9fd03bac219e0cc04b6.png)
對應ida中
![](https://i.iter01.com/images/b3044a20caa9cae032701f173983b764e5cb07ce593658d6caabd4b8a8060824.png)
這裡我們看到一串類似base64的字串
搜尋字串看一下
![](https://i.iter01.com/images/4f09db53aeb2413128f81e4d4caa7ff2a306ac2f750def638f0ab099862a20d8.png)
猜測這裡他自定義了base64編碼表
![](https://i.iter01.com/images/48f4edde6f3daff67ffa8862dbe1ef21ba26256103b1b580906c14730cdb54c9.png)
解密得到
因為這裡解密到的長度是10,所以上面的n才為10,不然加密後的字串長度是不夠的
![](https://i.iter01.com/images/9483aa6905120cb5ecf358d901f97d16415ae3a2e87569cd5a76bf56f540f118.png)
此時我們測試一下,
當演算法call執行完成後我們修改字串為 上面解密到的,我們看能不能成功
![](https://i.iter01.com/images/099330e4e08a4336152723ae49ad318aec5aacc43bb9fcc9d8020994bc8bfca8.png)
在記憶體視窗中修改後
![](https://i.iter01.com/images/90f3d31fa46494c3bc98a8cd6a6abe2bd5ea3b2bfbbb3b293d8c2d615c9515f1.png)
然後來到字串比較的地方
我們可以看到要進行比較的兩個字串是一樣的
![](https://i.iter01.com/images/5776ff38defc1e25781de9c233e6eca5fddb0f6ad9071460aa3b00fde47d45a2.png)
所以現在
只需要讓我們輸入的字串經過演算法call後等於 =>=:<2>?=2
然後分析一下演算法的call
![](https://i.iter01.com/images/71c7f9f2db6d65333a554afc90f7fe92c42fa395cb41f0df5517762960ef363c.png)
演算法call裡主要就是這個call,然後這個call執行了4次,我們點進去
分析
第一次執行的是4
第二次1
第三次2
第四次3
![](https://i.iter01.com/images/8bce12d1adb58d691640e70a36e8dfa2bb2c5d718304c0b9cca79d14deef5410.png)
此時只需要將 =>=:<2>?=2 反推回來
也就是
先每一位+1,再除啦第一位後面每一位-3,再每一位xor9 就可以了
然後寫指令碼
![](https://i.iter01.com/images/36c217e8b7610ee838195df879babcb1b159fff0c788c6e5a4ac0cc2011b4a18.png)
![](https://i.iter01.com/images/69a17f611c13c51b8d3d08870c3caebc1783534ed5536f58908394c8cecbbd3b.png)