HECTF2020

发布于 2020-11-27  48 次阅读


主办方不讲武德,建议耗子尾汁 :spray:

RE

还差一题ak,可惜了点 :tear: ,求个永生之年让我ak一次re

Hello_Re

签到题,简单的异或
image-20201127164625043

脚本:

list1 = [0x42, 0x56,0x45,0x7f,0x32,0x6E,0x4E,0x3D,0x56,0x3B, 0x78, 0x53, 0x4C,0x4F,0x50,0x62,0x74,0x73,0x7F,0x4B,0x73,0x21,0x56,0x7F,0x64]
flag = ""
for i in range(0,25):
    list1[i] = list1[i]^(i+1)
    flag = flag + chr(list1[i])
print(flag)

game1

走了点歪门邪道 :huaji: ,修改逻辑函数,无限加分,1024得分
image-20201127165004949


easymaze

查壳发现是upx壳

image-20201127165540910

然后用脱壳机脱壳,在用IDA打开,根据题目名字应该是个迷宫题,所以打开字符串找迷宫

image-20201127170226376

将迷宫恢复后走一遍

image-20201127170417417

其中输入的 0 1 2 3 分别是 右 左 上 下

emmmm

Py反编译

img

2个函数 change_a 将flag转assic 再减4:

image-20201127170759260

image-20201127170811181

恢复后做栅栏4位解密。

img

网上随便找个解密网站:

img

game2

game2也是一道迷宫题,但比上一道要复杂点,wasd控制方向,q是扔炸弹

主函数:

image-20201127171311047

老规矩,先将迷宫还原

image-20201127171130892

可以看到的是迷宫上没有一条通路,所以出题人写了个炸弹出来,炸出一条路

可以看到的是,第21,22行进行了两次赋值变量,所以放下炸弹后可以走两步,然后炸弹爆炸

image-20201127171411380

根据爆炸函数可以得到,爆炸的时候,上下左右和中间的道路都会变成1,也就是变成了通路

image-20201127171532579

所以道路是这么走的,然后这里还有一个坑,wasd是倒过来的 w -- 下 | s -- 上 | a -- 右 | d -- 左

decryption

这题有点意思,因为在IDA中,有些逻辑与动调时不太相同,存在部分花指令迷惑你,导致IDA反汇编失败,所以最后是用动调来找逻辑。

主函数很简单:

image-20201127172043960

输入的内容首先进行一个变异的base64加密

image-20201127172152471

很明显的base64加密特征。但关键是base加密后调用了一个函数 sub_4007AF()

在IDA中是一个输出语句,但在反汇编状态下可以很明显的看出函数并没有结束

image-20201127172925227

将datas字段内容转换成了程序:动调后发现,逻辑内容就是大小写转换,然后在rot21

然后在看第二个加密函数:

image-20201127173423307

这段函数很明显的有逻辑错误,在汇编下发现用的不是mov取值,而是用了movzx

image-20201127173858372

在动调下发现,函数是个加密函数,每个字符都会进行8轮加密,每轮加密先判断当前字符是否大于 127,

大于127就舍去最高位然后 *2 再与0x31异或

​ 例如二进制10000110-->先变成00000110,再乘2,然后在与0x31异或

如果不大与127就直接乘2

这个逻辑反向就比较难写,所以采用了爆破

import string
import copy
a=[ 0x4E, 0x1C, 0x6E, 0xF7, 0x4E, 0x96, 0xF6, 0xE6, 0x9A, 0xD7, 
  0x4D, 0x30, 0x9A, 0xD7, 0x8A, 0x51, 0x41, 0xA7, 0x01, 0x6E, 
  0x33, 0xF4, 0x4D, 0xD7, 0x2C, 0x1C, 0xAB, 0xF9, 0xD9, 0xE8, 
  0x9B, 0x96, 0x1D, 0xD9, 0x4D, 0xA5, 0x51, 0x5E, 0x89, 0x89
  ]
flag__1 = ""
little = string.printable
def replace_char(string,char,index):
    string = list(string)
    string[index] = char
    return ''.join(string)

for q in range(0,len(a)):
    i = a[q]
    for flag in little:
        temp_1 = ord(copy.copy(flag))
        for j in range(8,0,-1):
            if(temp_1 > 127):
                temp = '{:08b}'.format(temp_1)
                temp = replace_char(temp,"0",0)
                temp = (int(temp,2)*2)^0x31
                temp_1 = temp
            else:
                temp_1 = temp_1 * 2
        if (temp_1 == i):
            flag__1 = flag__1+flag

print(flag__1)

爆破得到了编译base64后的值

image-20201127174228801

最后在还原回去,先大小写互换,然后在rot5,最后再解自定义base64,得到flag


一沙一世界,一花一天堂。君掌盛无边,刹那成永恒。