1. Easy_vb
下载下来是一个exe
直接拖进OD看字符串就好
2. Easy_Re
打开了随便输一下,直接拖进IDA
3. 游戏过关
打开之后是一个游戏,我也是有点醉,说实话这个游戏还蛮好玩的
拖进IDA,emmmm,看不懂,都没找到main函数,拖进OD,搜字符串,开始分析
在上图设置断点,发现只要在程序中输入一个n,就会跳转到这里,是任何书数都会跳转到这一段
可是我们的目的是跳转到done!!!the flag is 这一段
我们试着把跳转地址定位到done!!!the flag is 这一段来试试看,我们可以看见一大堆相同的跳转语句,直接把第一个改了
因为我改的是第一个跳转语句,我猜是输入1时的跳转,我就输了1,bingo
4. Timer(阿里CTF)
一个apk文件,安卓逆向么
我用jeb打开的,但是看不到反编译的java代码,有没有带哥告诉我一下,我自己这题是用gui打开的
根据题目的名字,怀疑和时间有关
看到这一步我想起一个大佬和我说的话,虽然你一点也不会java,但是有时候看懂也就够了
beg和now参数的差小于等于0的时候,你就有flag了
基本就是时间参数的差值,我猜测就是过多少秒才能运行,now应该就是现在的时间,我们底下也看到了
t获取了当前的毫秒数,处以1000,那就是秒,然后beg就是当前时间加上200000秒
意思就是程序运行了200000秒以后,才能开始算flag,那我们把时间参数改掉后跑一边代码就好了,但我没装java环境,我们在之前的图可以看到最后的flag就是由k生成的,我们把k最后的结果逆向出来就好了
就上个脚本吧,把k求出来
def is2(paramInt):
if paramInt>3:
if ((paramInt % 2 != 0) and (paramInt % 3 != 0)):
i = 5
while(True):
if (i * i <= paramInt):
if (paramInt % i != 0) and (paramInt % (i + 2) != 0):
i += 6
continue
return False
else:
return True
return False
elif paramInt<=1:
return False
return True
time=200000
k=0
key=True
while(time>0):
if is2(time):
k+=100
else:
k-=1
time-=1
#print(k) k=1616384
然后接下来因为没下过java编写的软件,stringFromJNI2这个操作我也不太懂,算出k的参数以后就暂时先放一下
5. 逆向入门
打开之后密密麻麻都是字,开头有提示base64,直接base64转图片
6. love
是个exe,拖进IDA分析main函数
前面一顿操作,最后有个比较函数,与str2字符串作比较,对的话就成功了
str2是常量,轻松找到,然后要逆回去,我们看一下操作是什么
上面的这段是之前的一个操作,分析下来是一系列的以为操作
再结合这一段,可以分析出就是不断的三个一组进行扩展,整个长度增加了三分之一,结合看了aAbcdefghijklmn的数据,可知是base64解密,且置换方式没变
把上面这段逆回去之后,直接解密就好了
import base64
m='e3nifIH9b_C@n@dH'
flag=''
for i in range(len(m)):
flag+=chr(ord(m[i])-i)
flag=base64.b64decode(flag)
#print(flag) b'{i_l0ve_you}'
7. LoopAndLoop(阿里CTF)
jeb反编译成java,看主函数
最后关键就是check函数判断,要是相等就继续往flag的段落运行,然后stringFromJNI2函数进行变形
这两个函数都在native层,我刚开始也不知道native层怎么看,后来大佬告诉我,把文件里的liblhm.so文件拖出来分析就好了,里面有(仿佛知道那个Timer怎么做下去了),这个文件和classes.dex同级别的lib文件夹里
把该文件拖进IDA
发现常用方法找不到主函数,又是大佬教我的,通过搜索字符串来找
进去之后可以看见主要函数
我们知道是chec函数(看函数标题),可以看到具体流程就是,最后一个参数*2%3的值来选择运行哪个check(1、2、3)函数
因为仍和一个check函数里面有chec函数,所以会不断迭代,迭代的范围次数是[2,]
上脚本
def check1(input,loop):
a=input
for i in range(1,100):
a=a-i
return a
def check2(input,loop):
a=input
if loop%2==0:
for i in range(1,1000):
a=a-i
else:
for i in range(1,1000):
a=a+i
return a
def check3(input,loop):
a=input
for i in range(1,10000):
a=a-i
return a
key=1835996258
target = key
for i in range(2,100):
if 2 * i % 3 == 0:
target = check1(target,i - 1)
elif 2 * i % 3 == 1:
target = check2(target,i - 1)
else:
target = check3(target,i - 1)
print(target)
#236492408
程序里输入这串就好了
8. 入门逆向
下载下来是一个闪退的exe
用OD打开,靠字符串定位
找到位子之后,一大堆mov赋值操作,坚定我用IDA打开的信念
额,果然是入门…………这里有个小技巧,一个个输太傻了,可以在在OD里面直接在数据窗口里搜
这里有个小错误,o要大写,后来才发现的
9. Take the maze
打开如下
OD加IDA,emmmm,要有耐心对不对,OD打开乱的不行,IDA走一波,看一下main函数
可以看见输入的长度应该24个字符,看看还有没有别的,看见有个flag.png字符串,估计是有图片,定位过去看一波
动态执行一下,把程序指引到这一段上,看看会生成什么文件,至于怎么跳过去,就试试好了,总会成功的,先跳到下面这段,一步步来,改三个跳转语句就到了
继续单步执行
会发现生成了一个png文件,是一个二维码
扫描完之后,如下
自闭,继续分析………………
乖乖会主函数分析,但是函数其实挺复杂的,怎么找check函数呢
我们看到这个函数明显就是check的部分,重点分析
这一段其实也蛮明显的,如下,可以知道我们要输的是什么,比较硬核的人可以直接爆破233
好了,分析一波check函数
细心的你可能发现了,两个字符一组来决定什么操作,这个个字符是一段字符串(这里就叫它字典吧)的索引
然后看一下知道索引后是什么操作
字典如下
同时这个switch总感觉让人有一种在做迷宫题的感觉,这里的dlru应该对应的就是前后左右之类的,目前只是猜测
研究一下这四个函数,先看第一个好了,如下
a2显然控制了循环次数,那么也就是说我们其中的一个索引值是控制了循环次数
而最后一定是要将i的值写入*a1才有意义,那么就可以判断出限制条件了:
i/26<=10;
dword_540548[i] ^ dword_540068[i] ==0;
那么结合我们迷宫的猜测,显然前者限定了范围,后者限定了路径,虽然怎么限定路径的我目前还是没看出来,反正就是异或等于0则操作成功
不过这一题比较友好的就是上下左右特别好判断,u,d,l,r对应上下左右嘛
接下来就要找地图,起点,终点了
i每次加26,可以推断出,每行有26个字符,分析一下走的范围的话,只能在四个函数里自己搜集了
何在一起 x∈[1,24];y∈[1,10]
看一下check函数怎样才会结束,在main函数的开头有这么一段,如下
长宽猜也猜出来了:12*26
这题最坑的就是迷宫图的构造了
在四个函数里,我们可以看到每个方向什么时候可以走,所以我们要把四条合法路径全部求出来,对于不会IDC的我来说是很不友好的,我是慢慢用python调的,太心酸了,好想会IDC啊……
当然在搜集数据的时候也不太顺利,感觉IDA有时候也有毒,要自己推一下
得出走法:06360836063b0839073e0639
最后是可以得到结果的,但是输入程序发现还是错的,23333
看一下最开始输入字符前对字符是否进行过处理,如下
这个45C748函数对我们的输入应该是做了处理的,进去看一下,会发现一大堆switch语句,这要逆到什么时候去啊,果断放弃,动态调试一下
因为OD里面毕竟和IDA不同调试起来还是比较累的,要慢慢找到你需要的函数的主体部分,毕竟base地址不同,对照汇编或者是低地址找一下好了,我们的函数如下
以此类推到最后的switch部分
我们输入123456781234567812345678测试,输出为1317131?9;9?9;97 #!'!#!/,长度不变
我们自己测试一波,如下
emmmm,是不是发现了什么,那么规律我们就找到了,test一下
把结果加上我们扫描的二维码后缀合起来输入,emmmmm,还是错了,即将自闭
再回过去看一下,发现对输入的变换还有个小操作,如下
v6其实是你输入的第17个字符,一开始就要和1异或,真的是太刺激了
最后试一遍,终于成功了,答案为:zsctf{07154=518?9i<5=6!&!v$#%.Docupa}