Mountain climbing WP
PE查殼,發(fā)現(xiàn)有殼
利用UPX靜態(tài)脫殼機(jī)脫殼
?打開exe文件,得到關(guān)鍵語句
?ida打開,shift+F12找到關(guān)鍵語句,F5反編譯
有隨機(jī)數(shù)組產(chǎn)生,而且是二維的
?編寫代碼得的隨機(jī)數(shù)列
#include <stdio.h> #include <stdlib.h> #include <string.h>int main() {int i, j;srand(0xCu);for (i = 1; i <= 20; i++){for (j = 1; j <= i; j++){printf("%7d ", rand() % 100000);}printf("\n");}return 0; }?下面就是走迷宮
if ( j_strlen(Str) == 19 ){sub_41114F(Str);v4 = 0;j = 1;i = 1;dword_423D78 += dword_41A138[101];while ( v4 < 19 ){if ( Str[v4] == 'L' ){dword_423D78 += dword_41A138[100 * ++i + j];}else{if ( Str[v4] != 'R' ){((void (__cdecl *)(const char *, char))sub_41134D)("error\n", v3);system("pause");goto LABEL_18;}dword_423D78 += dword_41A138[100 * ++i + ++j];}++v4;}sub_41134D("your operation can get %d points\n", dword_423D78);?'L'是向下走一步,'R'是向右下走一步,可以走19步,從77開始選擇走'L'或者是走'R',選擇最大值走。手動(dòng)扒去的步法為:RRRRRLLRRRLRLRRRLRL
輸入發(fā)現(xiàn)是錯(cuò)誤的,證明是對(duì)步法進(jìn)行了改變。對(duì)我們輸入的str進(jìn)行跟蹤,看到了sub_41114F函數(shù),選擇OD動(dòng)態(tài)調(diào)試。
在函數(shù)sub_41114F上下斷點(diǎn),讓程序運(yùn)行到這里
對(duì)EAX寄存器進(jìn)行數(shù)據(jù)窗口下跟隨,看我們的值進(jìn)行了怎么的變化,F8單步步過,看到我們的值發(fā)送了變化
?重新執(zhí)行程序,看看我的值具體的變化
?F7單步步入,F4運(yùn)行到00411949 ? ?E8 57F7FFFF ? ? call ConsoleA.004110A5? 然后再F7步入,來到改變函數(shù)。
?F4運(yùn)行到0041181B,F7跳轉(zhuǎn)到0041194E,F8單步執(zhí)行,期間注意窗口值的變化,執(zhí)行到00411992,發(fā)現(xiàn)我們的第二個(gè)值R變成了V
?查看發(fā)現(xiàn),原來是對(duì)值進(jìn)行與4的異或,還是偶數(shù)項(xiàng)進(jìn)行異或。重新異或得到flag:RVRVRHLVRVLVLVRVLVL
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的Mountain climbing WP的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode70. Climbing
- 下一篇: 英语年份有日期的读法