暑假第五周

Tree-24 / 2023-08-01 / 原文

目录
  • re5-packed-movement
    • 法一
    • 法二
    • flag
  • reverse-for-the-holy-grail-350
    • exp
    • flag

re5-packed-movement

先脱壳
img
ida打开全是mov 指令,movfuscator混淆
img

法一

shift+F12 搜索字符串找到'Wrong Flag!',
交叉引用可以看到有70多处引用,可能就是逐字符比较
img
随便点一个看看,从每一个'Wrong Flag!'处往上翻可以看到都有一个
mov R2 xxh的指令
img
img
直接搜索R2寄存器内容
Alt+B搜索C7 05 68 20 06 08即mov R2对应的16进制编码
img
得到flagALEXCTF{M0Vfusc4t0r_w0rk5_l1ke_m4g1c}
img

法二

使用idac脚本。
shift+F2打开脚本界面
img
运行得到flag
img

flag

ALEXCTF{M0Vfusc4t0r_w0rk5_l1ke_m4g1c}

reverse-for-the-holy-grail-350

直接看主函数,有点多重点锁定这几个语句
v4 = stringmod(v9),v4小于0就输出auuuuuuugh,大于0才输出tuctf{}
应该就是v4>0时输出flag,跟进一下stringmod
img
stringmod有三个部分先看第一个
img
v4要大于0所以if 要不执行,那么v3就要是3的倍数,并且
v12读取的字符必须等于firstchar[v3 / 3]
img
第二部分是一个异或
img
第三部分
img
查看一下thirdchar和masterArray,有点乱不好提取
img
用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进制
img

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?}