欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

南邮ctf攻防平台RE第四题WxyVM1

程序员文章站 2022-05-13 19:05:23
...

今天做了南邮攻防平台RE第四题,链接:http://ctf.nuptsast.com/

用Winhex打开以后可以看出来是ELF文件,所以用IDA打开,找到main函数,F5。
南邮ctf攻防平台RE第四题WxyVM1
可以看出来,程序的意思就是:输入flag,经过sub_4005B6那个函数进行运算,然后长度必须为24,再与最终答案进行比较,检测是否正确。
接下来看那个运行的函数:
南邮ctf攻防平台RE第四题WxyVM1
6010C0是一个长度为15000的数组,每3个分为一组,分别为v0,v1,v2。一共5000组。v0是检测进行哪种运算,一共有5种运算,加减乘异或。v1是选择输入的哪一位进行运算,v2是运算数。最后与601060中的数据进行比较。所以解题思路就是用601060中的数据将上面的运算进行逆运算,这样就可以得到正确输入。
下面是python代码:

c = ''' C4 34 22 b1 d3 11 97 07  db 37 c4 06 1d fc 5b ed 98 df 94 d8 b3 84 cc 08 '''
d=[]
for i in c.split():
   d.append(int(i,base=16))

for i in range(5000):
    v0 = b[3*(4999-i)]
    v1 = int(b[3*(4999-i)+1],base=16)
    # print(v1)
    v3 = int(b[3 * (4999 - i) + 2], base=16)
    print(v3)
    if v0 =="01":
        d[v1] -= v3
    elif v0 == '02':
        d[v1] += v3
    elif v0 =='03':
        d[v1] ^= v3
    elif v0 == '04':
        d[v1] = d[v1]/v3
    elif v0 == '05':
        d[v1] ^= d[v3]
    else:
        continue
print(''.join([str(chr(int(i)%128))for i in d]))

结果是:nctf{Embr4ce_Vm_j0in_R3}

有一个重要的点是最后对比的数组,是一个char类型的,所以我们取数据的时候每4位取最低位,而不是直接取。这个问题纠结了我好久,最后还是有个学弟告诉我的。。。