题目给出了一个flag.pyc文件和out.txt文件, 一看就是反编译pyc文件,于是开始用uncompyle6开始反编译,发现提示是模数错误
于是打开文件发现模数是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的格式为以下这种格式
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}
拖入IDA观察,程序是需要输入10个字符,且范围是在“2356DESTZcqv”中,然后第一个字符和最后一个字符可以通过逻辑推出,中间8个是CRC爆破,通过下面和代码可以看出
然后写脚本爆破。,,,,,,当时做题的时候看到是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
然后第一位和最后一位
通过这里可以推出,拼起来加上flag{}就是最终的flag
这道题给出的是data.bin文件和一个exe文件,,,这道题当时直接没时间看了,,,,这是后头看大佬的WP复现了一波,,,用DIE查这个程序是加了UPX壳的,,但是用upx -d没脱掉,,,于是用ESP定律手脱,然后用ImportREC PE 修复了下导入表,,拖入IDA,找到main开始分析,,,
在sub_401000这个函数中,程序开始读取data.bin的数据,然后对byte_409064处的数据进行了xor 0x66
来到 sub_4010C0函数
很明显的发现这是一道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
下面是3道题的链接
链接:https://pan.baidu.com/s/1L-J49h7m0xNDLAkCO_zMPA
提取码:3rp2
复制这段内容后打开百度网盘手机App,操作更方便哦