第8届山东省大学生网络安全竞赛 逆向 WP

RE1

  题目给出了一个flag.pyc文件和out.txt文件, 一看就是反编译pyc文件,于是开始用uncompyle6开始反编译,发现提示是模数错误第8届山东省大学生网络安全竞赛 逆向 WP_第1张图片
于是打开文件发现模数是20 19,然后自己python2编译了对应的pyc文件,发现
模数是03 F3于是将模数修改,然后利用uncompyle6反编译出原py文件

import math

flag = 'flag{**********************}'
a = []
b = []
for i in flag:
    a.append(ord(i))
 
def func(para):
    res = True
    i = 2
    sq = int(math.sqrt(para)) + 1
    while i <= sq:
        if para % i == 0:
            b.append(i + 1)
            res = False
            func(para / i)
            i += 1
            break
        i += 1

    if res:
        b.append(para + 1)

for i in a:
    func(i)
    print b,
    b = []

然后观察输出,由于这里是func()由于时间关系,当时没来得及逆,于是直接写出所有的可能然后与结果去比对,最后得到flag
  首先整理out.txt的格式为以下这种格式第8届山东省大学生网络安全竞赛 逆向 WP_第2张图片

import math
import string


flag = ""
x = string.printable
a = []
b = []
for i in x:
    a.append(ord(i))

def func(para):
    res = True
    i = 2
    sq = int(math.sqrt(para)) + 1
    while i <= sq:
        if para % i == 0:
            b.append(i + 1)
            res = False
            func(para / i)
            i += 1
            break
        i += 1
    if res:
        b.append(para + 1)


dic = []
for i in a:
    func(i)
    dic.append((chr(i), str(b)))
    b = []

f = open("out.txt", "r")
lines = f.readlines()
print lines

for line in lines:
    for i in dic:
        if i[1] == line.strip().replace("\r\n", ""):
            flag +=  i[0]
            break

print flag
#flag{eb0cf2f1bfc9990ee3d399a2bbde3dd4}

RE2

  拖入IDA观察,程序是需要输入10个字符,且范围是在“2356DESTZcqv”中,然后第一个字符和最后一个字符可以通过逻辑推出,中间8个是CRC爆破,通过下面和代码可以看出
第8届山东省大学生网络安全竞赛 逆向 WP_第3张图片
然后写脚本爆破。,,,,,,当时做题的时候看到是CRC了,,,,但是没想到是通过爆破解,,毕竟是数据量是12 ^ 8,。。,下面是解题爆破代码

import zlib

table = "2356DESTZcqv"
total = 0
for a in table:
    print("Tried: " + str(total))
    for b in table:
        for c in table:
            for d in table:
                for e in table:
                    for f in table:
                        for g in table:
                            for h in table:
                                temp = a + b + c + d + e + f + g + h
                                total += 1
                                if((zlib.crc32(temp) & 0xffffffff) == 0x5984f05e):
                                    print temp
                                    exit(0)

中间8位是 cqZS62vD第8届山东省大学生网络安全竞赛 逆向 WP_第4张图片
然后第一位和最后一位在这里插入图片描述
通过这里可以推出,拼起来加上flag{}就是最终的flag

RE3

  这道题给出的是data.bin文件和一个exe文件,,,这道题当时直接没时间看了,,,,这是后头看大佬的WP复现了一波,,,用DIE查这个程序是加了UPX壳的,,但是用upx -d没脱掉,,,于是用ESP定律手脱,然后用ImportREC PE 修复了下导入表,,拖入IDA,找到main开始分析,,,
第8届山东省大学生网络安全竞赛 逆向 WP_第5张图片
在sub_401000这个函数中,程序开始读取data.bin的数据,然后对byte_409064处的数据进行了xor 0x66
第8届山东省大学生网络安全竞赛 逆向 WP_第6张图片
来到 sub_4010C0函数
第8届山东省大学生网络安全竞赛 逆向 WP_第7张图片
很明显的发现这是一道VM的逆向,然后opcode就是 data.bin中的每4个字节,
最后写脚本得到flag

import string
from pwn import *

a = [ 0x3B, 0x48, 0x2A, 0x53, 0x2F, 0x56, 0x60, 0x08, 0x11, 0x15,0x02, 0x56, 0x01, 0x14, 0x0E, 0x5A, 0x10, 0x33, 0x3C, 0x34,   0x3E, 0x49, 0x1C, 0x5C, 0x35, 0x53, 0x3A, 0x1F, 0x4C, 0x17,   0x6F, 0x7A]

tar = [(x ^ 0x66) & 0xff  for x in a]


def fn1(x):
	return ((x+1)&0xff ^ 0x19)&0xff
def fn2(x):
	return (x>>1)&0xff
def fn3(x):
	return (x ^ 0x66)&0xff
def fn4(x):		
	return (((x^0x19)&0xff) - 1)&0xff
def fn5(x):
    return (x-1)&0xff
def fn6(x):
	return (x << 1) &0xff
def fn7(x):
	return (x << 2)& 0xff
def fn8(x):
	return (x + 1) & 0xff


f = open("data.bin", "r")
data = f.read()
f.close()

op = []            
for i in range(0, len(data), 4):
    y = u32(data[i:i+4])
    if y == 0xC8B5BDC6:
        op.append(fn1)
    elif y == 0xB5D2B4BE:
        op.append(fn2)
    elif y == 0xBFC7BBB8:
        op.append(fn3)
    elif y == 0xC5D0CFB3:
        op.append(fn4)
    elif y == 0xC9D3D4D7:
        op.append(fn5)
    elif y == 0xC6C9D1D3:
        op.append(fn6)
    elif y == 0xCED6A8B7:
        op.append(fn7)
    elif y == 0xFAB9AEB0:
        op.append(fn8)



flag = ""
s = string.printable

for i in range(32):     
    for ss in s:
        if i % 2 == 0:           
            sss = ord(ss) ^ 0x20
        else:
            sss = ord(ss) ^ 0x19
        for calc in op:
            sss = calc(sss)
        if sss == tar[i]:
            flag += ss
print flag

第8届山东省大学生网络安全竞赛 逆向 WP_第8张图片
下面是3道题的链接
链接:https://pan.baidu.com/s/1L-J49h7m0xNDLAkCO_zMPA
提取码:3rp2
复制这段内容后打开百度网盘手机App,操作更方便哦

你可能感兴趣的:(CTF,CTF)