日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Mountain climbing

發(fā)布時間:2024/1/18 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Mountain climbing 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

先是運行下程序,發(fā)現(xiàn)要輸入一串東西。

接著用查殼工具進行查殼,發(fā)現(xiàn)這個軟件有個 UPX 的殼。

然后我用萬能的脫殼工具進行脫殼,脫殼后得到能夠使用IDA和OD打開的程序

于是我用IDA打開,按F12查看字符串,點擊開頭的input開始查看,根據(jù)要輸入的提示雙擊打開input字符串,匯編混雜,現(xiàn)在還不能使用反編譯,點擊那個箭頭,跳轉(zhuǎn)到全是匯編界面

然后點擊Tab或F5,就可以得到反匯編

然后就是分析代碼的時候了。

第一個紅框表示生成隨機數(shù),srand代表隨機數(shù)種子,0xCu表示12,生成一個100000以內(nèi)的三角形隨機數(shù),一共19行。
第二個紅框表示76=L,82=R,如果等于76L就直接向下移動一位,如果等于82R就向下和向右移動一位。

然后就進行反向編程,我用的是Java,編譯后的結(jié)果如下,然后我就用結(jié)果去試,顯而易見的錯了,不可能這么簡單的。。。。。

然后我就不知道怎么做了,于是百度了一下,發(fā)現(xiàn)原來還要進行一部操作,可是我照著網(wǎng)上的IDA做就是不能找到想要的東西。。。。。以下第一幅圖是我的,沒找打xor的0x4運算,而別人的有。。。。。
都找得到00411750即開始標志,push,不過我這個xor看不懂。

接著我又換一個軟件OD用,使用網(wǎng)上的過程,還是不行。。。。。
都可以找到0041114F,然后跟進就始終找不到00411987 xor ecx 0x4.。。。。。



最后整不出來,就思考了了一下思路,即在偶數(shù)位置需要與4進行異或xor運算

最后在整理一下思路
1、生成隨機數(shù),srand代表隨機數(shù)種子,0xCu表示12,生成一個100000以內(nèi)的三角形隨機數(shù),一共19行。
2、76=L,82=R,如果等于76L就直接向下移動一位,如果等于82R就向下和向右移動一位。
反編譯過來就是下一行左邊大得到L,右邊大得到R。
3、偶數(shù)位置需要與4進行異或xor運算

然后使用Java逆向編程出來即可

import java.util.Random;public class Mountain_climbing {//全局變量static int[] arr=new int[100000];static char[] str=new char[21];//生成隨機數(shù)public static void rand() {Random srand=new Random(12);for (int i = 1; i <= 20; ++i) { for (int j = 1; j <= i; ++j) {arr[100 * i+j]=srand.nextInt(100000);System.out.print(arr[100 * i+j]+" "); } System.out.print("\n");}}//進行位移L或R,public static void DFS() {int i=1;int j=1;int max=0;while(true) {int ii=i+1;int jj=j+1;if(arr[100 * ii+j]>arr[100 * ii + jj]) {str[i] = 'L';i++;max += arr[100 * i + j];}else {str[i] = 'R';i++;j++;max += arr[100 * i + j];}if (i == 20){str[i] = '\0';break;}}System.out.println(str);System.out.println(max);}//改變偶數(shù)位置異或運算public static void change(){int i;for (i = 1; i <= 19; i++){if (i % 2==0){str[i] ^= 4;}}System.out.println(str);} //主函數(shù)public static void main(String[] args) {rand();DFS();change();} }

如果你只看了前面,恭喜你只得到思路,因為TMD--------Java和C語言隨機數(shù)種子一樣,但生成的隨機數(shù)不一樣。。。。。

拿去試還是不得行,經(jīng)過長時間的比對,發(fā)現(xiàn)沒有錯誤。。。。。。
最后發(fā)現(xiàn)我用Java和別人用C語言編的隨機生成數(shù)不一樣,可是Java中應該是這樣寫的,最后才發(fā)覺兩個語言的隨機算法不一樣。。。。。。。。。。
于是我最后使用C語言編程得到最后答案,即flag

#include <stdio.h> #include <stdlib.h>int main() {srand(0xCu); // 隨機數(shù)種子int arr[2020]; // 存放隨機數(shù)的數(shù)組printf("76 = %c 82 = %c 76^4 = %c 82^4 = %c\n", 76, 82, 76 ^ 4, 82 ^ 4);for (int i = 0; i < 20; i++) // 總長度19{printf("%2d ", i);for (int j = 0; j <= i; j++){arr[100 * i + j] = rand() % 100000; // 依次生成隨機數(shù)printf("%5d ", arr[100 * i + j]);}printf("\n");}int all = 0; // 最終總和all += arr[100 * 0 + 0]; // 第一行第一個賦值給allchar str[21];int i = 0, j = 0;while (1){printf("%d ", i);int i_ = i + 1;int j_ = j + 1;if (arr[100 * i_ + j] > arr[100 * i_ + j_]) // 正下方的一個數(shù)大于其右邊的數(shù){str[i] = 'L';if (i % 2 == 1){str[i] ^= 4;}i++;all += arr[100 * i + j];}else{str[i] = 'R';if (i % 2 == 1){str[i] ^= 4;}i++;j++;all += arr[100 * i + j];}if (i == 19){str[i] = '\0';break;}}printf("\n 輸入為: %s\n", str);printf("maxnum = %d\n", all);system("pause");return 0; }


flag為:zsctf{RVRVRHLVRVLVLVRVLVL}

總結(jié)

以上是生活随笔為你收集整理的Mountain climbing的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。