目录
re5-packed-movement
先脱壳
ida打开全是mov 指令,movfuscator混淆
法一
shift+F12 搜索字符串找到'Wrong Flag!',
交叉引用可以看到有70多处引用,可能就是逐字符比较
随便点一个看看,从每一个'Wrong Flag!'处往上翻可以看到都有一个
mov R2 xxh的指令
直接搜索R2寄存器内容
Alt+B搜索C7 05 68 20 06 08即mov R2对应的16进制编码
得到flagALEXCTF{M0Vfusc4t0r_w0rk5_l1ke_m4g1c}
法二
使用idac脚本。
shift+F2打开脚本界面
运行得到flag
flag
ALEXCTF{M0Vfusc4t0r_w0rk5_l1ke_m4g1c}
reverse-for-the-holy-grail-350
直接看主函数,有点多重点锁定这几个语句
v4 = stringmod(v9),v4小于0就输出auuuuuuugh,大于0才输出tuctf{}
应该就是v4>0时输出flag,跟进一下stringmod
stringmod有三个部分先看第一个
v4要大于0所以if 要不执行,那么v3就要是3的倍数,并且
v12读取的字符必须等于firstchar[v3 / 3]
第二部分是一个异或
第三部分
查看一下thirdchar和masterArray,有点乱不好提取
用idapython导出一下
from idc_bc695 import *
addr=[0x601840,0x601860,0x601880]
for a in addr:
list=[]
for i in range(6):
list.append(Dword(a+4*i))
print(list)
前三行时对应16进制结果,后三行则是10进制
exp
firstchar = [0x41, 0x69, 0x6e, 0x45, 0x6f, 0x61]
thirdchar = [0x2ef, 0x2c4, 0x2dc, 0x2c7, 0x2de, 0x2fc]
masterarray = [0x1d7, 0xc, 0x244, 0x25e, 0x93, 0x6c]
list = [666,]
v7 = 666
for i in range(17):
v7 = v7 + v7 % 5
list.append(v7)
print(list)
#求flag第0,3,6,9,12,15位
flag = [0 for i in range(18)]
index1 = 0
for i in range(0,16,3):
flag[i] = firstchar[index1]
index1 += 1
# print(flag)
#求第2,5,8,11,14,17位
index2=0
for i in range(2,18,3):
flag[i] = list[i] ^ thirdchar[index2]
index2 += 1
# print(flag)
# 暴力求第1,4,7,10,13,16位
index3 = 0
for i in range(1,17,3):
for j in range(32,127):
if ((list[i-1] ^ firstchar[index3]) * (list[i] ^ j)) % thirdchar[index3] == masterarray[index3]:
flag[i] = j
index3 +=1
break
print('tuctf{'+"".join(map(chr,flag))+'}')
#[666, 667, 669, 673, 676, 677, 679, 683, 686, 687, 689, 693, 696, 697, 699, 703, 706, 707]
#tuctf{AfricanOrEuropean?}
flag
tuctf{AfricanOrEuropean?}