Mountain Climbing WP
拿到題首先熟練地查個殼再用各種脫殼工具脫個殼。
脫殼之后熟練地雙擊感受一下出題者的惡意:

根據字面意思得知,是要根據一系列的操作來得到收益最大值,於是用ida打開並f5出來研究出題者是想讓我們如何操作:

76和82分別是“L”和“R”的ASCII碼值,所以聯想到操作只有左移和右移。在來看看這段代碼的其他部分:

這一部分相當於利用偽隨機數構造了一個直角三角形的數表。由於是偽隨機數,只要隨機數種子srand()的值一樣,構造出來的數表也是一樣的。這里的隨機數種子是srand(0xCu)也就是srand(12),自行寫腳本構造出來一個一樣的隨機數表:

這樣就很明了了,題目意圖是讓我們從三角形數表的“山頂”開始一步步往下走,每次選擇上一個節點的左子節點或右子節點下山,找出路線上所有數字和最大的那一條路線。於是利用隨便一種搜索算法搜最優路線即可,這里用深度優先搜索舉個例子:
1 #include <cstdio> 2 #include <ctime> 3 #include <windows.h> 4 using namespace std; 5 int mt[100][100]; 6 int save[30],ans[30]; 7 int MAXN = -1; 8 void dfs(int h,int l,int sum){ 9 sum += mt[h][l]; 10 if(h == 20){ 11 if(sum >= MAXN){ 12 MAXN = sum; 13 memcpy(ans,save,sizeof(save)); 14 } 15 return ; 16 } 17 save[h] = 0; 18 dfs(h + 1,l,sum); 19 save[h] = 1; 20 dfs(h + 1,l + 1,sum); 21 } 22 int main(){ 23 srand(12); 24 for(int i = 1;i <= 20;++i) 25 for(int j = 1;j <= i;++j) 26 mt[i][j] = rand() % 100000; 27 dfs(1,1,0); 28 for(int i = 1;i <= 19;++i) 29 if(ans[i]) 30 printf("R"); 31 else printf("L"); 32 return 0; 33 }
當我把搜索到的最優解輸進去之后...

嗯???error是什么情況???在反復確認搜索腳本無誤后決定打開ollydbg一探究竟。在我試驗性地輸入字符串LLLLLLLLLLRRRRRRRRR后,字符串被原封不動的保存下來:

而當我調試經過004114F這個函數過后,我輸入的字符串發生了有規律的改變:

