w早上十点多起床开始做
然后忘记提交大数据实验了(乐)
主要做了Re 有时间也会复现一下其他方向的
Re
reeeee
绕过反调试 去除花指令
然后看到一个很像Rc4的算法 但是感觉有点复杂 怀疑是魔改了(其实并没有)
但是rc4属于流加密 最重要的是把密钥流取出来xor 一下就ok了
所以我直接动调取出数据 (其实太懒了不想写脚本)
t
data=[ 0x56, 0x61, 0x63, 0xA4, 0x22, 0xA4, 0x50, 0x7D, 0xCD, 0x8D, 0x13, 0x3D, 0x4A, 0x4F, 0x0D, 0x62,
0x88, 0xAB, 0xFC, 0xE9, 0xBB, 0x1E, 0xA0, 0x90]
xor = [50,81,4,151,89,240,56,20,190,210,34,8,21,9,100,12,236,252,149,135,223,46,215,237]
m = [i^j for i,j in zip(data,xor)]
flag = ''.join(chr(i) for i in m)
print(flag)
re1
前面一大堆没看懂 但是最重要的是走到那个虚拟机保护的地方
随便进一个函数指针分析
其它的也差不多
翻译虚拟机指令
code=[..]#取出来那一大堆
Dest="xxxxxxxxxxxxabcdefghijkl"
ptr=0
print("===============================")
while(code[ptr]!=0xF4):
opcode = code[ptr]
if(opcode==0xF1):
a1 = code[ptr+1]
a2 = code[ptr+2]
if(a1==0xE1):
print("eax = dest[%d]"%a2)
if(a1==0xE2):
print("ebx = dest[%d]"%a2)
if(a1==0xE3):
print("ecx = dest[%d]"%a2)
if(a1==0xE4):
print("dest[%d] = eax"%a2)
ptr+=6
elif(opcode==0xF2):
a2 = code[ptr+1]
print("eax^=ebx")
ptr+=1
elif(opcode==0xf5):
a2 = code[ptr+1]
print("read input")
ptr+=1
elif(opcode==0xf6):
a2 = code[ptr+1]
print("eax = ((2<<eax)|(eax>>6))&0xff ")
ptr+=1
elif(opcode==0xf8):
a1 = code[ptr+1]
a2 = code[ptr+2]
if(a1==0xe1):
print("eax+=%d"%a2)
print("eax&=0xff")
if(a1==0xe2):
print("ebx+=%d"%a2)
print("ebx&=0xff")
if(a1==0xe3):
print("ecx+=a2")
ptr+=3
elif(opcode==0xf9):
a1 = code[ptr+1]
a2 = code[ptr+2]
if(a1==0xe1):
print("eax-=%d"%a2)
print("eax&=0xff")
if(a1==0xe2):
print("ebx-=%d"%a2)
print("ebx&=0xff")
if(a1==0xe3):
print("ecx-=%d"%a2)
ptr+=3
打印出来是以下
eax = dest[0]
ebx = dest[48]
eax^=ebx
eax = ((2<<eax)|(eax>>6))&0xff
dest[32] = eax
eax = dest[1]
ebx = dest[49]
eax^=ebx
eax = ((2<<eax)|(eax>>6))&0xff
dest[33] = eax
eax = dest[2]
ebx = dest[50]
eax^=ebx
eax = ((2<<eax)|(eax>>6))&0xff
dest[34] = eax
eax = dest[3]
ebx = dest[51]
eax^=ebx
eax = ((2<<eax)|(eax>>6))&0xff
dest[35] = eax
eax = dest[4]
ebx = dest[52]
eax^=ebx
eax = ((2<<eax)|(eax>>6))&0xff
dest[36] = eax
eax = dest[5]
ebx = dest[53]
eax^=ebx
eax = ((2<<eax)|(eax>>6))&0xff
dest[37] = eax
eax = dest[6]
ebx = dest[54]
eax^=ebx
eax = ((2<<eax)|(eax>>6))&0xff
dest[38] = eax
eax = dest[7]
ebx = dest[55]
eax^=ebx
eax = ((2<<eax)|(eax>>6))&0xff
dest[39] = eax
eax = dest[8]
ebx = dest[56]
eax^=ebx
eax = ((2<<eax)|(eax>>6))&0xff
dest[40] = eax
eax = dest[9]
ebx = dest[57]
eax^=ebx
eax = ((2<<eax)|(eax>>6))&0xff
dest[41] = eax
eax = dest[10]
ebx = dest[58]
eax^=ebx
eax = ((2<<eax)|(eax>>6))&0xff
dest[42] = eax
eax = dest[11]
ebx = dest[59]
eax^=ebx
eax = ((2<<eax)|(eax>>6))&0xff
dest[43] = eax
from z3 import *
data=[0xA7, 0x3A, 0x19, 0xB4, 0xF1, 0x49, 0x2B, 0xCB, 0xEA, 0x0E,
0x0E, 0x14]
dest=[0]*76
for i in range(12):
dest[32+i] = BitVec("x[%d]"%(i+1),8)
eax = dest[32]
ebx = dest[33]
ebx+=164
ebx&=0xff
eax^=ebx
eax-=5
eax&=0xff
dest[64] = eax
eax = dest[33]
ebx = dest[34]
ebx+=112
ebx&=0xff
eax^=ebx
eax-=151
eax&=0xff
dest[65] = eax
eax = dest[34]
ebx = dest[35]
ebx+=79
ebx&=0xff
eax^=ebx
eax-=121
eax&=0xff
dest[66] = eax
eax = dest[35]
ebx = dest[36]
ebx+=211
ebx&=0xff
eax^=ebx
eax-=71
eax&=0xff
dest[67] = eax
eax = dest[36]
ebx = dest[37]
ebx+=95
ebx&=0xff
eax^=ebx
eax-=146
eax&=0xff
dest[68] = eax
eax = dest[37]
ebx = dest[38]
ebx+=3
ebx&=0xff
eax^=ebx
eax-=74
eax&=0xff
dest[69] = eax
eax = dest[38]
ebx = dest[39]
ebx+=8
ebx&=0xff
eax^=ebx
eax-=189
eax&=0xff
dest[70] = eax
eax = dest[39]
ebx = dest[40]
ebx+=40
ebx&=0xff
eax^=ebx
eax-=57
eax&=0xff
dest[71] = eax
eax = dest[40]
ebx = dest[41]
ebx+=127
ebx&=0xff
eax^=ebx
eax-=41
eax&=0xff
dest[72] = eax
eax = dest[41]
ebx = dest[42]
ebx+=41
ebx&=0xff
eax^=ebx
eax-=59
eax&=0xff
dest[73] = eax
eax = dest[42]
ebx = dest[43]
ebx+=55
ebx&=0xff
eax^=ebx
eax-=193
eax&=0xff
dest[74] = eax
eax = dest[43]
ebx = dest[64]
ebx+=186
ebx&=0xff
eax^=ebx
eax-=209
eax&=0xff
dest[75] = eax
S = Solver()
for i in range(12):
S.add(dest[64+i]==data[i])
S.check()
print(S.model())
x=[0]*13
x[5] = 232
x[4] = 64
x[1] = 172
x[9] = 64
x[11] = 116
x[12] = 132
x[8] = 108
x[2] = 92
x[7] = 156
x[10] = 212
x[6] = 12
x[3] = 29
#这里前面有一个循环位移和xor的操作
for i in range(13):
tmp = x[i]
tmp = ((tmp<<6)|(tmp>>2)) &0xff
tmp ^= (ord("a")+i-1)
print(chr(tmp),end='')
其实也可以从头开始加约束然后使用z3直接求解的
re2
main函数一眼顶针 不可能这么简单
求出第一个flag后会弹出来舞王 典中典
然后进入TLS回调函数看一下
盲猜是利用NtCurrentTeb进行反调试
进入下面的函数继续看
对齐进行交叉引用过去
来到这个函数 里面注册一个钩子应该是勾键盘的输入
进入后是一个迷宫 限制步数75步 一直走不对
函数中有一大堆操作 怀疑是把迷宫改了
后来才知道是把Sleep函数给hook了 但没分析出来这个函数的作用
所以真实的WASD是这样的
改一下P.Z师傅的脚本 然后跑一下
注意两个检测调试的地方会修改地图
用DFS找出来所有的路 然后找出符合setp=75的就可以
maze=b'\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x01\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x00\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x01\x01\x00\x00\x01\x01\x01\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x01\x01\x01\x01\x00\x01\x01\x00\x01\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x01\x01\x01\x01\x01\x00\x01\x00\x01\x01\x01\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x01\x01\x01\x01\x00\x01\x01\x00\x01\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x01\x01\x01\x01\x01\x00\x01\x00\x01\x01\x01\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x01\x01\x01\x01\x00\x00\x01\x01\x01\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x01\x00\x01\x00\x01\x00\x01\x01\x01\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x01\x00\x01\x00\x00\x01\x01\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x01\x01\x01\x00\x01\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x00\x00\x01\x01\x01\x01\x00\x01\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x01\x01\x01\x01\x01\x01\x01\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x01\x01\x01\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x01\x01\x00\x01\x01\x01\x01\x01\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x01\x01\x01\x00\x01\x01\x01\x00\x01\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x00\x01\x01\x01\x00\x01\x00\x01\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x01\x01\x01\x01\x00\x01\x01\x01\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x01\x01\x01\x01\x01\x01\x01\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x01\x01\x01\x01\x01\x01\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x01\x00\x01\x01\x01\x00\x01\x01\x01\x01\x01\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x01\x00\x01\x00\x01\x01\x01\x00\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x01\x01\x01\x01\x01\x00\x01\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x01\x01\x01\x01\x01\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x01\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x01\x01\x01\x00\x01\x00\x01\x01\x01\x01\x00\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x01\x01\x01\x00\x01\x00\x01\x00\x01\x01\x01\x01\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x01\x01\x01\x00\x01\x01\x01\x01\x01\x00\x01\x01\x01\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x01\x00\x01\x01\x01\x01\x01\x00\x01\x01\x01\x00\x00\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x01\x01\x01\x01\x01\x01\x01\x00\x01\x00\x01\x00\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x01\x01\x01\x02'
byte=[i for i in maze]
#peb
byte[0x49B] = 0 # or 1
#byte[0x49B] = 1
# isdebug
byte[0x63F] = 1
byte[0x639] = 2
#print(byte)
map1 = [byte[i*40:i*40+40] for i in range(40)]
map2 = [[0 for i in range(40)] for j in range(40)]
flag=''
for i in map1:
print(i)
def DFS(x,y):
global flag
if x==38 and y==34 : #判断边界
print(flag)
print(len(flag))
try:
if map1[x+1][y+1] == 0 and map2[x+1][y+1] == 0:
map2[x][y] = 1
flag += 's'
DFS(x+1,y+1)
flag = flag[:-1]
map2[x][y] = 0
except:
pass
try:
if map1[x-1][y-1] == 0 and map2[x-1][y-1] == 0:
map2[x][y] = 1
flag += 'w'
DFS(x-1,y-1)
flag = flag[:-1]
map2[x][y] = 0
except:
pass
try:
if map1[x-1][y+1] == 0 and map2[x-1][y+1] == 0:
map2[x][y] = 1
flag += 'd'
DFS(x-1,y+1)
flag = flag[:-1]
map2[x][y] = 0
except:
pass
try:
if map1[x+1][y-1] == 0 and map2[x+1][y-1] == 0:
map2[x][y] = 1
flag += 'a'
DFS(x+1,y-1)
flag = flag[:-1]
map2[x][y] = 0
except:
pass
DFS(2,2)
flowerpyc
查了一堆文章
(15条消息) Python pyc文件 bytecode 字节码解析与插入、编辑qfcy的博客-CSDN博客_bytecode
dis --- Python 字节码反汇编器 — Python 3.8.14 文档
(15条消息) 往Pyc文件中添加花指令 学习记录_Chi 吴家奇的博客-CSDN博客
(15条消息) Python3 字节码混淆sid10t.的博客-CSDN博客python3 混淆
(15条消息) VNCTF-reverse-BabyMaze(复现)_这就是强者的世界么的博客-CSDN博客
【VNCTF2022】Reverse-BabyMaze 出题人视角!哔哩哔哩bilibili
fd = open("PYC.pyc","rb")
try:
fd.seek(16)
sample = marshal.load(fd)
fd.close()
print(i)
dis(sample)
except:
pass
只能编译出来这么多 不知道花指令在哪里 =。= 蹲大佬的的wp把
没有尝试用pycdc 不过应该也没用吧
讨厌数学
首先进行查壳 怀疑有upx壳 但是没办法自动脱壳
ELF64手脱UPX壳实战 - 『脱壳破解区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn
按照文章脱壳
能脱下来 但是脱完没办法运行
静态分析也看不懂 数学也不好 蹲大佬wp把
pwn
easyarm
阿巴阿巴