BugkuCTF 逆向工程 部分WP

1. Easy_vb

下载下来是一个exe

直接拖进OD看字符串就好

2. Easy_Re

BugkuCTF 逆向工程 部分WP_第1张图片

打开了随便输一下,直接拖进IDA

BugkuCTF 逆向工程 部分WP_第2张图片直接可以在hex里找到flag

3. 游戏过关

BugkuCTF 逆向工程 部分WP_第3张图片

打开之后是一个游戏,我也是有点醉,说实话这个游戏还蛮好玩的

拖进IDA,emmmm,看不懂,都没找到main函数,拖进OD,搜字符串,开始分析

BugkuCTF 逆向工程 部分WP_第4张图片

BugkuCTF 逆向工程 部分WP_第5张图片

在上图设置断点,发现只要在程序中输入一个n,就会跳转到这里,是任何书数都会跳转到这一段

可是我们的目的是跳转到done!!!the flag is 这一段

我们试着把跳转地址定位到done!!!the flag is 这一段来试试看,我们可以看见一大堆相同的跳转语句,直接把第一个改了

BugkuCTF 逆向工程 部分WP_第6张图片

因为我改的是第一个跳转语句,我猜是输入1时的跳转,我就输了1,bingo

BugkuCTF 逆向工程 部分WP_第7张图片

4. Timer(阿里CTF)

一个apk文件,安卓逆向么

我用jeb打开的,但是看不到反编译的java代码,有没有带哥告诉我一下,我自己这题是用gui打开的

根据题目的名字,怀疑和时间有关

看到这一步我想起一个大佬和我说的话,虽然你一点也不会java,但是有时候看懂也就够了

beg和now参数的差小于等于0的时候,你就有flag了

BugkuCTF 逆向工程 部分WP_第8张图片

基本就是时间参数的差值,我猜测就是过多少秒才能运行,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转图片

BugkuCTF 逆向工程 部分WP_第9张图片

6. love

是个exe,拖进IDA分析main函数

BugkuCTF 逆向工程 部分WP_第10张图片

前面一顿操作,最后有个比较函数,与str2字符串作比较,对的话就成功了

str2是常量,轻松找到,然后要逆回去,我们看一下操作是什么

BugkuCTF 逆向工程 部分WP_第11张图片

上面的这段是之前的一个操作,分析下来是一系列的以为操作

BugkuCTF 逆向工程 部分WP_第12张图片再结合这一段,可以分析出就是不断的三个一组进行扩展,整个长度增加了三分之一,结合看了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,看主函数

BugkuCTF 逆向工程 部分WP_第13张图片

最后关键就是check函数判断,要是相等就继续往flag的段落运行,然后stringFromJNI2函数进行变形

这两个函数都在native层,我刚开始也不知道native层怎么看,后来大佬告诉我,把文件里的liblhm.so文件拖出来分析就好了,里面有(仿佛知道那个Timer怎么做下去了),这个文件和classes.dex同级别的lib文件夹里

把该文件拖进IDA

发现常用方法找不到主函数,又是大佬教我的,通过搜索字符串来找

BugkuCTF 逆向工程 部分WP_第14张图片

进去之后可以看见主要函数

BugkuCTF 逆向工程 部分WP_第15张图片

我们知道是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打开,靠字符串定位

BugkuCTF 逆向工程 部分WP_第16张图片

找到位子之后,一大堆mov赋值操作,坚定我用IDA打开的信念

BugkuCTF 逆向工程 部分WP_第17张图片

额,果然是入门…………这里有个小技巧,一个个输太傻了,可以在在OD里面直接在数据窗口里搜

BugkuCTF 逆向工程 部分WP_第18张图片

这里有个小错误,o要大写,后来才发现的

9. Take the maze

打开如下

BugkuCTF 逆向工程 部分WP_第19张图片

OD加IDA,emmmm,要有耐心对不对,OD打开乱的不行,IDA走一波,看一下main函数

BugkuCTF 逆向工程 部分WP_第20张图片

可以看见输入的长度应该24个字符,看看还有没有别的,看见有个flag.png字符串,估计是有图片,定位过去看一波

BugkuCTF 逆向工程 部分WP_第21张图片

动态执行一下,把程序指引到这一段上,看看会生成什么文件,至于怎么跳过去,就试试好了,总会成功的,先跳到下面这段,一步步来,改三个跳转语句就到了

BugkuCTF 逆向工程 部分WP_第22张图片

继续单步执行

BugkuCTF 逆向工程 部分WP_第23张图片

会发现生成了一个png文件,是一个二维码

扫描完之后,如下

BugkuCTF 逆向工程 部分WP_第24张图片

自闭,继续分析………………

乖乖会主函数分析,但是函数其实挺复杂的,怎么找check函数呢

BugkuCTF 逆向工程 部分WP_第25张图片

我们看到这个函数明显就是check的部分,重点分析

这一段其实也蛮明显的,如下,可以知道我们要输的是什么,比较硬核的人可以直接爆破233

好了,分析一波check函数

BugkuCTF 逆向工程 部分WP_第26张图片

细心的你可能发现了,两个字符一组来决定什么操作,这个个字符是一段字符串(这里就叫它字典吧)的索引

然后看一下知道索引后是什么操作

BugkuCTF 逆向工程 部分WP_第27张图片

字典如下

BugkuCTF 逆向工程 部分WP_第28张图片

同时这个switch总感觉让人有一种在做迷宫题的感觉,这里的dlru应该对应的就是前后左右之类的,目前只是猜测

研究一下这四个函数,先看第一个好了,如下

BugkuCTF 逆向工程 部分WP_第29张图片

a2显然控制了循环次数,那么也就是说我们其中的一个索引值是控制了循环次数

而最后一定是要将i的值写入*a1才有意义,那么就可以判断出限制条件了:

i/26<=10;

dword_540548[i] ^ dword_540068[i] ==0;

那么结合我们迷宫的猜测,显然前者限定了范围,后者限定了路径,虽然怎么限定路径的我目前还是没看出来,反正就是异或等于0则操作成功

不过这一题比较友好的就是上下左右特别好判断,u,d,l,r对应上下左右嘛

接下来就要找地图,起点,终点了

i每次加26,可以推断出,每行有26个字符,分析一下走的范围的话,只能在四个函数里自己搜集了

1<=x<=25

1<=x<=24

0<=y<=10

1<=y<=25

何在一起 x∈[1,24];y∈[1,10]

看一下check函数怎样才会结束,在main函数的开头有这么一段,如下

长宽猜也猜出来了:12*26

这题最坑的就是迷宫图的构造了

在四个函数里,我们可以看到每个方向什么时候可以走,所以我们要把四条合法路径全部求出来,对于不会IDC的我来说是很不友好的,我是慢慢用python调的,太心酸了,好想会IDC啊……

当然在搜集数据的时候也不太顺利,感觉IDA有时候也有毒,要自己推一下

得出走法:06360836063b0839073e0639

最后是可以得到结果的,但是输入程序发现还是错的,23333

看一下最开始输入字符前对字符是否进行过处理,如下

BugkuCTF 逆向工程 部分WP_第30张图片

这个45C748函数对我们的输入应该是做了处理的,进去看一下,会发现一大堆switch语句,这要逆到什么时候去啊,果断放弃,动态调试一下

因为OD里面毕竟和IDA不同调试起来还是比较累的,要慢慢找到你需要的函数的主体部分,毕竟base地址不同,对照汇编或者是低地址找一下好了,我们的函数如下

BugkuCTF 逆向工程 部分WP_第31张图片

以此类推到最后的switch部分

BugkuCTF 逆向工程 部分WP_第32张图片

我们输入123456781234567812345678测试,输出为1317131?9;9?9;97 #!'!#!/,长度不变

我们自己测试一波,如下

BugkuCTF 逆向工程 部分WP_第33张图片

emmmm,是不是发现了什么,那么规律我们就找到了,test一下

BugkuCTF 逆向工程 部分WP_第34张图片

把结果加上我们扫描的二维码后缀合起来输入,emmmmm,还是错了,即将自闭

再回过去看一下,发现对输入的变换还有个小操作,如下

BugkuCTF 逆向工程 部分WP_第35张图片

v6其实是你输入的第17个字符,一开始就要和1异或,真的是太刺激了

BugkuCTF 逆向工程 部分WP_第36张图片

最后试一遍,终于成功了,答案为:zsctf{07154=518?9i<5=6!&!v$#%.Docupa}

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(CTF_WP,RE_WP)