欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

BugkuCTF **** WP(一边做一边更新)

程序员文章站 2022-05-15 11:51:01
...

1. Easy_vb

下载下来是一个exe

直接拖进OD看字符串就好

BugkuCTF **** WP(一边做一边更新)

2. Easy_Re

BugkuCTF **** WP(一边做一边更新)

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

BugkuCTF **** WP(一边做一边更新)直接可以在hex里找到flag

BugkuCTF **** WP(一边做一边更新)

3. 游戏过关

BugkuCTF **** WP(一边做一边更新)

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

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

BugkuCTF **** WP(一边做一边更新)

BugkuCTF **** WP(一边做一边更新)

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

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

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

BugkuCTF **** WP(一边做一边更新)

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

BugkuCTF **** WP(一边做一边更新)

4. Timer(阿里CTF)

一个apk文件,安卓逆向么

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

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

BugkuCTF **** WP(一边做一边更新)

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

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

BugkuCTF **** WP(一边做一边更新)

基本就是时间参数的差值,我猜测就是过多少秒才能运行,now应该就是现在的时间,我们底下也看到了

BugkuCTF **** WP(一边做一边更新)

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(一边做一边更新)

6. love

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

BugkuCTF **** WP(一边做一边更新)

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

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

BugkuCTF **** WP(一边做一边更新)

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

BugkuCTF **** WP(一边做一边更新)再结合这一段,可以分析出就是不断的三个一组进行扩展,整个长度增加了三分之一,结合看了aAbcdefghijklmn的数据,可知是base64解密,且置换方式没变

BugkuCTF **** WP(一边做一边更新)

把上面这段逆回去之后,直接解密就好了

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,看主函数

BugkuCTF **** WP(一边做一边更新)

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

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

把该文件拖进IDA

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

BugkuCTF **** WP(一边做一边更新)

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

BugkuCTF **** WP(一边做一边更新)

我们知道是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

程序里输入这串就好了

BugkuCTF **** WP(一边做一边更新)

 

 

 

 

 

 

相关标签: BugkuCTF **** Re