【偽隨機數】【搜索】【RE】【bugku】mountainclimbing WriteUp


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這個函數過后,我輸入的字符串發生了有規律的改變:

  

  再試驗幾個由“H”和“V”構成的字符串后發現,004114F這個加密函數是將偶數位的L與H互換,偶數位的R與V互換。於是將原來深搜的結果進行相應的轉換,便是flag中括號里的內容了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM