[安氵旬杯2022] 一些题目复现

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

阿巴阿巴

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值