6.1000clicks
看题目名字似乎是让咱们点击1000次之后才会出flag。本来打算用CE看能不能搜索出来数值,技术不到家,最后没有搜索到,还导致永劫无间打不了了。所以还是拿出IDA老实分析。
直接搜索flag字符,出来一大堆。张紫涵大佬说是Text对的这个,一看果然是。但是不能局限于此,还要分析为啥是这个。
发现除了text,其他的都没有交叉引用。那就差不多可以判断这个就是flag了。而且目标字符串的引用意思是弹窗提示此消息,更落实我们的猜想。
软件还有一个输入框,会根据输入的信息提示正确或者错误。使用OD修改后发现并没有什么用处,可能是在下才疏学浅,等有机会,看看是不是方法出了问题
补充:原来OD调试的时候,success代码附近就会显示flag!
7.crypt (暂时没解决)
看名字,估计是个算法相关的,进入IDA看看吧。
首先粗粗看一下代码,给函数改个名字,便于分析。
malloc()找到可用内存中一个大小适合的块。
内存是匿名的;
也就是说,malloc()分配了内存,但没有为它指定名字。
然而,它却可以返回那块内存第一个字节的地址
。
看图片得知,str是一串疑似编码表的字符串,而v3表示了它的长度。估计memset函数把str后面的改成0了。v10数组则全是为0. v9是一块内存的首地址。
先来看sub_140001120函数。
a1就是v9,v9是一快内存的首地址的指针变量。前几行首先给v9这块内存进行赋值,然后给v6赋值。LOBYTE代表16位数的低八位,所以result和v7也被赋值。鉴于result会被返回,所以可以先不管result。
for循环中,v8等于v9的某个值。v7 = (unsigned __int8)(*(_BYTE *)(a2 + v6) + v8 + v7);
这行代码从之前介绍的内存地址(基于a2
和偏移量v6
)处取出一个字节的数据,与v8
和当前的v7
值相加,然后将结果强制转换为 8 位无符号整数类型后赋值给v7。
但是说了这么多,result却是直接返回j+1,不太清楚这个函数主要实现什么。
再来看这个函数。
8.happyctf
这个题目还给了PBD文件,查阅PDB文件:每个开发人员都必须知道的 - iTech - 博客园
发现,PBD其实是一种帮助我们逆向分析的文件,IDA启动的时候可以加载这个文件。
不加载PBD文件,可读性就会变差,需要分析好多函数!但是一旦引入PBD文件,则会带来许多便利之处,可读性则会大大增强。
可以看到,刚开始用了一个cout函数,意思是输出,这里就不再多说了。 if语句检查输入的是不是长度为24。如果等于24,则会继续向下。vector意思是容器,可以装一些东西进去。
这句代码意思是把这两个的地址绑定在一起。为什么? 我推测是因为函数内的语句 this->v = <v>。
Python 之 lambda 函数完整详解 & 巧妙运用_lamda函数python-CSDN博客
可以看这个博客,了解一下lambda的用法。它本质上是一种匿名函数.所以我们按照正常处理函数去处理它就行了。再看while循环里面的lamabda函数:
首先看参数,我们已经知道bytee就是一个字符,也就是输入的字符的开头部分。接下来将它和0x14(也就是20)异或。将结果传入val,也就是v,也就是add(因为二者指针绑定了)。
这个函数应该也是实现指针的绑定 !↑
-----------------
关键函数如上,if语句见下,这是关键代码。
我们需要让它返回1,函数内if语句实现的应该是v9和key的对比。v9恰恰是异或后的数组。所以我们就可编写解题的exp:
a='rxusoCqxw{yqK`{KZqag{r`i'
b=''
for i in range(0,24):
b+=chr(ord(a[i])^20)
print(b)
总结一下,这道题之所以没写出来,是因为我没理解lambda要当成函数看,以及指针的绑定我不懂。这道题算法总结下来就是输入一串字符串,异或之后和key对比,算法还是比较简单的。