[Re]bugku CTF逆向题(持续更新)

目录

bugku 入门逆向题解

bugku easy_vb题解

bugku easy_re

bugku 游戏过关题解

bugku love题解

bugku file题解

待续


bugku 入门逆向题解

打开程序,一闪而过去

控制台环境打开

[Re]bugku CTF逆向题(持续更新)_第1张图片

只有一串字符,再次拖入ida

 

[Re]bugku CTF逆向题(持续更新)_第2张图片

em,啥都没有,flag果然就是这串字符

bugku easy_vb题解

一个vb写的程序,打开类似一个密码转盘,ollydbg中打开

明文中出现flag,提交即可

bugku easy_re

拖入ida中分析,shift+f12打开字符串子窗口,发现可疑字符串

[Re]bugku CTF逆向题(持续更新)_第3张图片

双击进入地址

[Re]bugku CTF逆向题(持续更新)_第4张图片

双击交叉引用,跳转如函数内,f5反编译如下

[Re]bugku CTF逆向题(持续更新)_第5张图片

注意到strcmp函数和上面的“%s“,v8应该是我们的输入,v4应该是用于比较

的密文,第一行的函数将xmmword_413e34处的内容,拷贝到v4处,进入地址

查看如下

[Re]bugku CTF逆向题(持续更新)_第6张图片

这两串连续的16进制很可疑,复制入python中解析一下看看

[Re]bugku CTF逆向题(持续更新)_第7张图片

稍微调整下顺序应该就是flag了,输入即可通过

bugku 游戏过关题解

打开程序,看起来是个小游戏

[Re]bugku CTF逆向题(持续更新)_第8张图片

要求我们输入数字即可改变跑马灯状态,要求我们点亮每一层的灯

偶数个灯,按顺序按下去就可以完成了

[Re]bugku CTF逆向题(持续更新)_第9张图片

flag出现 zsctf{T9is_tOpic_1s_v5ry_int7resting_b6t_others_are_n0t}

bugku love题解

程序拖入ida分析,查看字符串窗口

根据字符串交叉引用跳转如函数内反编译结果如下

[Re]bugku CTF逆向题(持续更新)_第10张图片

进入str2处地址查看密文

[Re]bugku CTF逆向题(持续更新)_第11张图片

保存下密文,来写python脚本解密吧

总的来说就是经过base64加密后的密文再次加上他的索引

我们只要做逆运算即可,py脚本如下

from base64 import *
flagstr = 'e3nifIH9b_C@n@dH'
flagstr = list(flagstr)

flag = []
index = 0
for ech in flagstr:
    flag.append(chr((ord(ech)-index)%256))
    index = index + 1

flag = ''.join(flag)

flag = b64decode(flag)

print flag

flag结果 {i_l0ve_you}

bugku file题解

一个x64的elf文件,放到Linux子系统尝试下运行,结果是直接抛出了个异常

[Re]bugku CTF逆向题(持续更新)_第12张图片

拖入ida中分析

[Re]bugku CTF逆向题(持续更新)_第13张图片

进入main函数f5反汇编如上

程序开头要求,读入一个文件,并从中获取输入。紧接着一个循环利用sttr_home

这个数组生成一个用于加密的表,至于flllag这个变量,保存的是一串,加密最后的

结果flag{hello_player_come_on_hahah},也就是说最后一个循环,利用我们提供的

文件异或加密表异或索引,最后产生一个字符串应该为flag{hello_player_come_on_hahah}

而flag的值应该是这个文件的MD5值。

那么,我们开始写py解密脚本吧

脚本如下

from hashlib import *

sttr_home = '664e06226625425d562e766e042d422c072c45692d125c7e6552606954646643'
sttr_home = list(sttr_home)


def dec1(a):
    if a <= 47 or a >57:
        if a <= 64 or a > 70:
            if a <= 96 or a > 102:
                result = 0xFFFFFFFF
            else:
                result = a - 87
        else:
            result = a - 55
    else:
        result = a - 48
    return result

def dec2(a):
    if a <= 47 or a > 57:
        if a <= 64 or a > 70:
            if a <= 96 or a > 102:
                result = 0xFFFFFFFF
            else:
                result = a - 87
        else:
            result = a - 55
    else:
        result = a - 48
    return result


def jiemi(a,b):
    v = 16 * dec1(a)
    return v+dec2(b)

check_array = []
fllage = []
fllag = 'flag{hello_player_come_on_hahah}'
fllag = list(fllag)
for ech in fllag:
    fllage.append(ord(ech))

    
for i in range(0,64,2):
    a = ord(sttr_home[i])
    b = ord(sttr_home[i+1])
    ech = jiemi(a,b)
    check_array.append(ech)


flag = []
for i in range(0,32):
    fllage[i] = fllage[i]^check_array[i]^i
    flag.append(unichr(fllage[i]))

flagstr =  ''.join(flag)

print flagstr
m = md5()
m.update(flagstr)
print m.hexdigest()

注意,ida中用于生成加密表的函数,记得要进入看一下,并且

按照他的逻辑写出py函数,应为我们也要根据sttr_home数组生成这样一个加密表,

你也可以通过动态调试,在内存中直接将加密表dump下来,接下来的解密

循环只要用加密表异或索引异或最后的flag{hello_player_come_on_hahah}即可

如果我们将生成字符串在linux中管道重定向到一个文件里,可以看到程序正确

输出结果

[Re]bugku CTF逆向题(持续更新)_第14张图片

 

最后生成的MD5值 914a7b9df69eab5b74b9edb7070e53e8

flag应为 flag{914a7b9df69eab5b74b9edb7070e53e8}

待续

其他题目待续,继续练习

 

 

你可能感兴趣的:(C,Reverse)