主办方不讲武德,建议耗子尾汁 :spray:
RE
还差一题ak,可惜了点 :tear: ,求个永生之年让我ak一次re
Hello_Re
签到题,简单的异或
脚本:
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得分
easymaze
查壳发现是upx壳
然后用脱壳机脱壳,在用IDA打开,根据题目名字应该是个迷宫题,所以打开字符串找迷宫
将迷宫恢复后走一遍
其中输入的 0 1 2 3 分别是 右 左 上 下
emmmm
Py反编译
2个函数 change_a 将flag转assic 再减4:
恢复后做栅栏4位解密。
网上随便找个解密网站:
game2
game2也是一道迷宫题,但比上一道要复杂点,wasd控制方向,q是扔炸弹
主函数:
老规矩,先将迷宫还原
可以看到的是迷宫上没有一条通路,所以出题人写了个炸弹出来,炸出一条路
可以看到的是,第21,22行进行了两次赋值变量,所以放下炸弹后可以走两步,然后炸弹爆炸
根据爆炸函数可以得到,爆炸的时候,上下左右和中间的道路都会变成1,也就是变成了通路
所以道路是这么走的,然后这里还有一个坑,wasd是倒过来的 w — 下 | s — 上 | a — 右 | d — 左
decryption
这题有点意思,因为在IDA中,有些逻辑与动调时不太相同,存在部分花指令迷惑你,导致IDA反汇编失败,所以最后是用动调来找逻辑。
主函数很简单:
输入的内容首先进行一个变异的base64加密
很明显的base64加密特征。但关键是base加密后调用了一个函数 sub_4007AF()
在IDA中是一个输出语句,但在反汇编状态下可以很明显的看出函数并没有结束
将datas字段内容转换成了程序:动调后发现,逻辑内容就是大小写转换,然后在rot21
然后在看第二个加密函数:
这段函数很明显的有逻辑错误,在汇编下发现用的不是mov取值,而是用了movzx
在动调下发现,函数是个加密函数,每个字符都会进行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后的值
最后在还原回去,先大小写互换,然后在rot5,最后再解自定义base64,得到flag