这次比赛的质量挺高的,除了那个出错了的fxck,昨天纠结了一下午,后来程序更新也没通知,我是真的想日穿出题者难受,还有一个线性移位寄存器的题,后面我就等着wp自己再去复现一下,那一个我是真的没想出来

#天津垓

扔到ida里面分析,这里是第一个关键函数,按照他的指令就是把我们输入的值和Rising_Hopper!字符串做与和或的操作
ida调试图
得出来的值和下面的值比对
ida调试图
逆出字符串Caucasus@s_ability,显然不是flag在观察函数时,发现第二个关键函数
key2
对一大批数据进行了异或处理,异或字符串就是我们刚逆出来的Caucasus@s_ability,然后output脚本(这里可以直接ida复刻,但是也放出python的方法)

ttt="Caucasus@s_ability"
f=open("ppp","rb")
f1=open("flag","wb")
p=1;i=0;p1=1
while(p1):
    p1=f.read(1)
    p=int.from_bytes(p1,byteorder='big',signed=False)
    if(i>=0xc4d and i<=0xc4d+0x41e):
        n = p ^ ord(ttt[(i - 0xc4d) % 18])
        f1.write(n.to_bytes(length=1,byteorder='big',signed=False))
    else:   f1.write(bytes(p1))
i += 1

然后key2就出来了,比对函数,最后按照逻辑逆出来就行,就一个计算逻辑
key2
key2
脚本:

res=[0x1EA272,0x206FC4,0x1D2203,2027349,2421009,1653372,2047032,2184813,2302911,2263545,1909251,2165130,1968300,2243862,2066715,2322594,1987983,2243862,1869885,2066715,2263545,1869885,964467,944784,944784,944784,728271,1869885,2263545,2283228,2243862,2184813,2165130,2027349,1987983,2243862,1869885,2283228,2047032,1909251,2165130,1869885,2401326,1987983,2243862,2184813,885735,2184813,2165130,1987983,2460375]
for i in range(len(res)):
    print(chr(res[i]//0x4ce3),end='')

得到flag
key2

后来还遇到了一个base58出错的题,自闭了一个下午,难受,不过后来发现自己的base58脚本写的有些问题,也算是有一小点点的补偿吧。。还有一个虚拟机的,这里就不说了,就是麻烦,其实逻辑很简单。然后等我更新那个寄存器吧

gatesXgame

放上官方wp:null指针
放上我的朋友的wp:高高有话说

这道题的答题思路就是一个去花,然后走迷宫,其中新颖的点就是每走一步就换更换系统框架,在x86和64之间轮换跳转,这里我就直接搬来官方wp给的两个花结构

#define JUNK2(idx) __asm{          \
  __asm  call next1_junk2_##idx          \
  __asm  __emit 0x77          \
  __asm  jmp next_junk2_##idx        \
  __asm  __emit 0x88          \
  __asm  next1_junk2_##idx:            \
  __asm  add dword ptr ss:[esp], 1  \
  __asm  ret              \
  __asm  next_junk2_##idx:              \
}


#define JUNK1(idx) __asm{\
__asm jmp jlabel##idx \
__asm __emit 0x88 \
__asm jlabel_##idx : \
__asm ret \
__asm __emit 0xba \
__asm jlabel##idx : \
__asm call jlabel_##idx  \
}

可以自己慢慢去patch,然后我自己写了一个通用的patch脚本,以后只要遇到是有结构性的花指令,都可以用这个脚本来patch,刚patch出来的时候我的心情是无比激动的,呃啊啊啊啊啊!总算patch成了!
下面是脚本

h1=[0xEB,0x03,0x88,0xC3,0xBA,0xE8,0xF9,0xFF,0xFF,0xFF]        #花结构
h2=[0xE8,0x04,0x00,0x00,0x00,0x77,0xEB,0x07,0x88,0x36,0x83,0x04,0x24,0x01,0xC3]
data=[]
def check(i,rep):                #负责数组匹配和patch
    k=1
    while(k<len(rep)):            #这里匹配不同就退出来
        if data[i+k]!=rep[k]:
            return 0
        k+=1
    for j in range(len(rep)):    #匹配成功之后这里进行patch
        data[i+j]=0x90

with open("123.exe","rb") as f:        #打开文件变成数组data
    a=f.read(1)
    while(a):
        data.append(int.from_bytes(a,byteorder='little',signed=False))
        a=f.read(1)

for i in range(len(data)):            #进行匹配
    if(data[i]==h1[0]):
        check(i,h1)
    elif(data[i]==h2[0]):
        check(i,h2)
with open("1","wb") as fw:            #写入
    for i in data:
        fw.write(i.to_bytes(1,byteorder='little',signed=False))

前后效果图
未patch
未patch图
patch后
patch图
patch图
patch图


一个好奇的人