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='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

程序里输入这串就好了

猜你喜欢

转载自blog.csdn.net/qq_42192672/article/details/82698595