Mountain climbing
先是運(yùn)行下程序,發(fā)現(xiàn)要輸入一串東西。
接著用查殼工具進(jìn)行查殼,發(fā)現(xiàn)這個(gè)軟件有個(gè) UPX 的殼。
然后我用萬(wàn)能的脫殼工具進(jìn)行脫殼,脫殼后得到能夠使用IDA和OD打開(kāi)的程序
于是我用IDA打開(kāi),按F12查看字符串,點(diǎn)擊開(kāi)頭的input開(kāi)始查看,根據(jù)要輸入的提示雙擊打開(kāi)input字符串,匯編混雜,現(xiàn)在還不能使用反編譯,點(diǎn)擊那個(gè)箭頭,跳轉(zhuǎn)到全是匯編界面
然后點(diǎn)擊Tab或F5,就可以得到反匯編
然后就是分析代碼的時(shí)候了。
第一個(gè)紅框表示生成隨機(jī)數(shù),srand代表隨機(jī)數(shù)種子,0xCu表示12,生成一個(gè)100000以內(nèi)的三角形隨機(jī)數(shù),一共19行。
第二個(gè)紅框表示76=L,82=R,如果等于76L就直接向下移動(dòng)一位,如果等于82R就向下和向右移動(dòng)一位。
然后就進(jìn)行反向編程,我用的是Java,編譯后的結(jié)果如下,然后我就用結(jié)果去試,顯而易見(jiàn)的錯(cuò)了,不可能這么簡(jiǎn)單的。。。。。
然后我就不知道怎么做了,于是百度了一下,發(fā)現(xiàn)原來(lái)還要進(jìn)行一部操作,可是我照著網(wǎng)上的IDA做就是不能找到想要的東西。。。。。以下第一幅圖是我的,沒(méi)找打xor的0x4運(yùn)算,而別人的有。。。。。
都找得到00411750即開(kāi)始標(biāo)志,push,不過(guò)我這個(gè)xor看不懂。
接著我又換一個(gè)軟件OD用,使用網(wǎng)上的過(guò)程,還是不行。。。。。
都可以找到0041114F,然后跟進(jìn)就始終找不到00411987 xor ecx 0x4.。。。。。
最后整不出來(lái),就思考了了一下思路,即在偶數(shù)位置需要與4進(jìn)行異或xor運(yùn)算
最后在整理一下思路
1、生成隨機(jī)數(shù),srand代表隨機(jī)數(shù)種子,0xCu表示12,生成一個(gè)100000以內(nèi)的三角形隨機(jī)數(shù),一共19行。
2、76=L,82=R,如果等于76L就直接向下移動(dòng)一位,如果等于82R就向下和向右移動(dòng)一位。
反編譯過(guò)來(lái)就是下一行左邊大得到L,右邊大得到R。
3、偶數(shù)位置需要與4進(jìn)行異或xor運(yùn)算
然后使用Java逆向編程出來(lái)即可
import java.util.Random;public class Mountain_climbing {//全局變量static int[] arr=new int[100000];static char[] str=new char[21];//生成隨機(jī)數(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");}}//進(jì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ù)位置異或運(yùn)算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();} }如果你只看了前面,恭喜你只得到思路,因?yàn)門(mén)MD--------Java和C語(yǔ)言隨機(jī)數(shù)種子一樣,但生成的隨機(jī)數(shù)不一樣。。。。。
拿去試還是不得行,經(jīng)過(guò)長(zhǎng)時(shí)間的比對(duì),發(fā)現(xiàn)沒(méi)有錯(cuò)誤。。。。。。
最后發(fā)現(xiàn)我用Java和別人用C語(yǔ)言編的隨機(jī)生成數(shù)不一樣,可是Java中應(yīng)該是這樣寫(xiě)的,最后才發(fā)覺(jué)兩個(gè)語(yǔ)言的隨機(jī)算法不一樣。。。。。。。。。。
于是我最后使用C語(yǔ)言編程得到最后答案,即flag
flag為:zsctf{RVRVRHLVRVLVLVRVLVL}
總結(jié)
以上是生活随笔為你收集整理的Mountain climbing的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: su组件在什么窗口_如何在草图大师Ske
- 下一篇: 绘制平行四边形