nctf——HomuraVM

虚拟机的题目,只要把每个字符代表的意思读懂就行

MCh: r2=(r1+flag[xxx])-2(r1 & flag[xxx]);(flag+1)
{mG}: flag[xxx]=r2;r2=0
Hv:
(flag+1);r2=r1
{aG}: r1=0;r2=0
[ur]: r1=flag[xxx];flag=0
Ov: (flag-1);(r2=r1)[无用]
a: r1–;
r: r1++;
h:
(flag+1)

下面是wp

def fuc(r1,flag):
    return (r1 + flag) - 2 * (r1 & flag)
order_list1=["1","aaa","rr","rarara","rararrr","araraa","rararrara","rrrarrr","aarrarr","aaarrar","rrrarr","aarrraa","arraar","rrraaarr","aaarrrrarr","rrrraarrarr","rrarra","aaraar","ovrrarra","aarrrar","rraarra","rrar","aarrar","rrraar","rrrraa","rrarra","rrrrrr","aaaar","rraaa","aarra","rrar","aarraa","aarrara","aarrarar"]
end=[27,114,17,118,8,74,126,5,55,124,31,88,104,7,112,7,49,108,4,47,4,105,54,77,127,8,80,12,109,28,127,80,29,96]
count=1
flag=[125];tem=[]
r1=0;r2=0
out=""
while(count<=34):
    for i in range(25,126):
        if(count==1):
            if (fuc(flag[count-1],i) == end[count - 1]):
                flag.append(i)
                out += chr(flag[count])
                break
        else:
            r_c=order_list1[count-1].count('r')
            a_c=order_list1[count-1].count('a')
            i1=i+r_c-a_c
            #print(count,flag,end,i1)
            if(fuc(end[count-2],i1)==end[count-1]):
                flag.append(i)
                out+=chr(flag[count])
                break
    count+=1
print(out)

easyRE——(忘了那个比赛出的了)

很简单的逻辑,判断长度然后judge一下就出来了
在这里插入图片描述
然后打开judge,有一个sp手段,修复之后,发现什么都不是
在这里插入图片描述
但观察到,代码下方有许多的数据
在这里插入图片描述看到开始发现有一个judge的异或操作,所以理解题目意思,将judge的数据与0xc异或然后得到正常代码,正常运行一下就行(这里注意运行之前先把judge全部变成data,不然会出现代码混乱类似于以下情况)

未转换成data图
在这里插入图片描述
转换成data图
在这里插入图片描述
然后就是一个究极简单的异或,做一个简单的题放松一下

a=[102,109,99,100,127,107,55,100,59,86,96,59,110,112]
flag=""
for i in range (len(a)):
    flag+=chr(a[i]^i)
print flag

在这里插入图片描述

blackcase

又是一个小小的虚拟机问题,给的txt文件就是一个测试通过后显示里面的文本,没别的大用,主要是第二次输入的password,然后找到相关的op码代表的含义就可以了。

这里是通过我们输入的值,call相关的sub
在这里插入图片描述
这里就是我们的一些操作
在这里插入图片描述
根据动调找到八个相关的操作码
'*','\'','>','Z','?','N','j','+','('`在这里插入代码片`
在这里有一些位置要标记
a1 + 665 #类似一个暂时寄存器(设为eax)
a1 + 664 #得到下一位输入的值
a1 + 8 #得到我们输入的字符串str
a1 + 288 #index(下标)

分析函数
fuc1: eax=str[index]
fuc2: str[index[=eax
fuc3: eax=eax+next_input-33
fuc4: eax=eax-next_input+33
fuc5: index++
fuc6: check
fuc7: index–
fuc8: str[index] = input[index+next_input-48]-49
fuc9: index=next_input; str[index] = input[index+next_input-48]-49

然后构造opcode序列就好
$t/80表示:
var = str[0] var = 80
var = var - input[2] + 33 = 66
str[0] = var
index++

类似,可构建产生Binggo的opcode序列为 $t/80$C)80$CI80$CX80$Cg80$Cj8
处理多余位数 0#J1
index– uuuuuuu
调用func6 Es

$t/80$C)80$CI80$CX80$Cg80$Cj80#J1uuuuuuuEs
(因为好长时间了,自己的操作码都忘了,所以这里直接放进大佬的操作)

这里可以多解的,我们不让check做最后一次,我们让check中的else实现,然后打印某一位置的字符,再通过相关操作把该位置的字符改成Binggo也是可以的

网安运维塞——re3(0x27BC86A9)

这道题是一个类矩阵乘法,2x2的矩阵进行相乘,首先要求我们输入三个数,然后一个一个检测,每个数进行右移,每进行一次就做一次运算,最后得到一个0x27BC86A9即可
在这里插入图片描述
在这里插入图片描述
这里有两个矩阵,我们称其为q_list1和q_list2,这里我卡了很长时间,本来是想爆破的,但后来发现一直都不行,无奈只好仔细看算法。

我们输入的数转成二进制,每一位都会进行判断,如果是1,那便q_list2=q_list1q_list2,不管是不是1都要进行q_list1=q_list1。

而且再仔细看,q_list2的初值比较特殊,既q_list2[0]*q_list1=q_list1,乘任何数都等于任何数它本身,相当于乘法里的1,而且那么我们可以把最后结果变成这样
q_list2=q_list1[0] x q_list[1] x……x q_list[n]

q_list[1] = q_list[0]^2(这里指2次方)
q_list[2] = q_list[0]^4

q_list[2] = q_list[0]^( 2^(n-1) )
最后我们我们就让q_list[0]自乘,一直得到我们想要的值就行,他的自乘次数就是我们想要的值,爆破就完事了

def fff(v27):
    return (v27 - 666666666 * ((((0x67144772A3C047E5 * v27) >> 64) >> 28) - (v27 >> 63)))
def fuc(q_list1, q_list2):                            #为了加快爆破速度,这里我们把它简化
    q_list3 = [[0, 0], [0, 0]]
    q_list3[0][0] = fff(fff(fff(q_list1[0][0] * q_list2[0][0])) + fff(q_list1[0][1] * q_list2[1][0]))
    q_list3[0][1] = fff(fff(fff(q_list1[0][0] * q_list2[0][1])) + fff(q_list1[0][1] * q_list2[1][1]))
    q_list3[1][0] = fff(fff(fff(q_list1[1][0] * q_list2[0][0])) + fff(q_list1[1][1] * q_list2[1][0]))
    q_list3[1][1] = fff(fff(fff(q_list1[1][0] * q_list2[1][0])) + fff(q_list1[1][1] * q_list2[1][1]))
    return q_list3

for i in range(pow(2,32)):                                    #这里让他跑就行了,大概20分钟所有数据就都出来了
    q_list1=fuc(q_list1,q)                    
    #print(i)
    if(q_list1[0][1]==0x220951BB):
        print (q_list1)
        print(i)
    #print(q_list1)
    #print (i)

最后得到三批数据,带进去就好了,这里提醒一下,我们出来的次数要加1才是最后的值

blackcase题目大佬地址 https://blog.csdn.net/q1uTruth/article/details/99943837

一个好奇的人