本文主要是介绍bugku mountain climbing,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
知识点
这条题涉及了一些知识点,可以的,做了一天。
- 给出的软件在win10 下面不运行
- 有的脱壳机脱不了这壳(多试试几个就行,不行就手脱)
- 脱壳后IDA反汇编会失败(这时候要调节堆栈)—不知道是不是故意出成这样的。。。。
- 算法分析(这个还是蛮简单的,入门级)
- OD中跟加密的函数
因为这个在IDA中看的有点儿懵逼。。。。。
分析
那开始吧。
关于IDA反汇编失败
点这里
关于软件在win10不能运行
点这里
那两个烦人的问题就解决了111111,
不知道那些大神们的环境为啥这么流畅。。。。
先无脑F5一下,看看。
结果这个还是挺简单的。
srand(0xcu) //伪随机数
然后是一个递增的列表,
这个很明显,用c一下子就打出来了,难度不大。
接下来是语句的输出。
这些都不重要,
最重要的是下面的这个循环。
长度要等于19.
输入的只能是L或者是R.
不是的话就会输出error,醉了,还以为是一个走迷宫,
然后是先把第一个数先放到数组里,
然后再递增,
思考:那么这条题是讲什么东东的???
又不给提示啥的,
还climbing mountain,爬啥呢?
再运行一次程序:
发现提升:maximun (学好英语的重要性,狗头)
那应该就是求最大值。(这种情况下,毫无思路,只能按照这种思路走,先走走看看,不行再说)
嗯,那先把数组弄出来看看,
用c写吧,
#include<stdio.h>
#include<stdlib.h>
int main()
{int i,j;int a[20][20];srand(0xC);for(i=1;i<20;i++){for(j=1;j<=i;j++){a[i][j]=rand()%100000;}}for(i=1;i<20;i++){for(j=1;j<=i;j++){printf("%d ",a[i][j]);}printf("\n");}return 0;}
然后就得出结果了,
然后,题目蛮友善的,这个遍历太简单了。(自己手动数都行oooooo)
PS:(这个学期要认真学好数据结构,那些什么深度遍历,二叉树什么的还只停留在概念,实操gg)
#include<stdio.h>
#include<stdlib.h>int main()
{int i,j;int a[20][20];srand(0xC);int v1=1;int v2=1; int sum;for(i=1;i<20;i++){for(j=1;j<=i;j++){a[i][j]=rand()%100000;}}sum=a[1][1];for(i=2;i<19;i++){if(a[i][v2]<a[i][v2+1]){printf("R");v2=v2+1;}else{printf("L"); }sum+=a[i][v2];}return 0;}
RLLLRRLLLRLLLLRLLR
正确顺序,
但此时,却不行。
emmmmmmm,
这时候我机智地翻开了别人的wp,(O(∩_∩)O),tql!
原来那里忽略了一个小函数,,,,,,
看来以后要留个心眼了。。。。
这是IDA和OD一起上,
很快就跟踪到了加密的地方。
认真分析一下就ok了,
这里跟到这里,(又掌握了一些加快跟踪速度的方法)
可以看出是换偶数位,让偶数位和4异或。。。。
那就是RVRVRHLVRVLVLVRVLVL
问题又来了:
flag呢?
想起之前做的迷宫题,
emmm,
这里中间又木有出现flag的序列号,应该就是直接交这个上去咯。。。。
然后就欧克了。
学到的东西
一些调试啥的,
还有就是用OD分析要有耐心,
要掌握多一点跟踪技巧。
这篇关于bugku mountain climbing的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!