BugkuCTF **** WP(一边做一边更新)
1. Easy_vb
下载下来是一个exe
直接拖进OD看字符串就好
2. Easy_Re
打开了随便输一下,直接拖进IDA
直接可以在hex里找到flag
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='aaa@qq.com@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
程序里输入这串就好了