180420 逆向-DDCTF_WP(Re)

这篇博客详述了在DDCTF逆向工程挑战中,作者如何解决从Baby MIPS的方程校验,到黑盒破解的复杂函数调用,再到解谜隐藏的真实,以及最后探索Atlantis文明的解密过程。文章涵盖了MIPS汇编分析、IDA调试技巧、字符串操作、比特币地址转换和反调试技术等多个方面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Reverse

Baby MIPS

IDA打开发现几个字符串结构都很清晰,提供16个变量,然后进行16次方程校验
但是运行会发现在中间就因为段错误而异常
尝试许久以后发现几个不太对劲的指令,突兀出现的 t, t , sp, 跳转等等的机器码都为EB02开头,猜测为花指令,于是使用IDC脚本去花
注意MIPS为定长指令集,每个指令都为4字节,因此需要固定监测指令的头部,否则可能会误清除掉正常指令,例如方程参数的赋值(╯‵□′)╯︵┻━┻

#include <idc.idc>
static matchBytes(StartAddr, Match) 
{ 
auto Len, i, PatSub, SrcSub; 
Len = strlen(Match);

while (i < Len) 
{ 
   PatSub = substr(Match, i, i+1); 
   SrcSub = form("%02X", Byte(StartAddr)); 
   SrcSub = substr(SrcSub, i % 2, (i % 2) + 1); 

   if (PatSub != "?" && PatSub != SrcSub) 
   { 
    return 0; 
   } 

   if (i % 2 == 1) 
   { 
    StartAddr++; 
   } 
   i++; 
}

return 1; 
}


static main() 
{ 
   auto StartVa, SavedStartVa, StopVa, Size, i, j;

StartVa = 0x400420; 
StopVa = 0x403233;

Size = StopVa - StartVa; 
SavedStartVa = StartVa;

for (i = 0; i < Size/4; i++) 
{ 
   if (matchBytes(StartVa, "EB02????")) 
   { 
    Message("Find%x:%02x%02x%02x%02x\n", StartVa,Byte(StartVa),Byte(StartVa+1),Byte(StartVa+2),Byte(StartVa+3));
    for (j = 0; j < 4; j++) 
    { 

     PatchByte(StartVa, 0x00); 
     MakeCode(StartVa); 
     StartVa++; 
    } 
   } 
    else
    StartVa=StartVa+4; 
}

AnalyzeArea(SavedStartVa, StopVa); 
Message("Clear eb02 Opcode Ok "); 
} 

去花后再次分析即可得到清晰的赋值和check过程
写了一个伪执行汇编的py脚本来得到参数,最后清洗一下即可得到方程,通过z3限制BitVec即可跑出整数解

f = open("code.txt", "r")
flower = ["slti", "sdc1"]
a0 = 0x76ff270
v0 = 0xd0000
v1 = 8
fp = [0 for i in range(0x500)]
table = [0x0, 0x42d1f0, 0x0, 0x42d1f0,
0xa, 0xa, 0x0, 0x9,
0x4250bc, 0x9, 0x426630, 0x42d1f0,
0x40a3ec, 0x37343431, 0x363434, 0x0,
0x0, 0x42d1f0, 0x0, 0x4250bc,
0x0, 0x0, 0x425060, 0x42d1f0,
0x403ad0, 0x0, 0x0, 0x1000,
0x425088, 0x76fff184, 0x412fcd, 0x1,
0x410570, 0x425190, 0x40ca48, 0x0,
0x0, 0x42d1f0, 0x0, 0x42d1f0,
0x425088, 0xffffffff, 0x4106c4, 0xffffffff,
0x76fff184, 0x412fcd, 0x1, 0x42d1f0,
0x0, 0x425088, 0x40ccac, 0x0,
0x0, 0x0, 0x0, 0x42d1f0,
0x0, 0x425190, 0x76ffeef8, 0x425190,
0x10, 0x425088, 0x40baac, 0x42d1f0,
0x412fcd, 0x1, 0x425088, 0x40baac,
0x76fff184, 0x412fce, 0x40b684, 0x0,
0x0, 0x0, 0x0, 0x42d1f0,
0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0,
0x0, 0x42d1f0, 0x0, 0x42d1f0,
0x0, 0x4250bc, 0x413081, 0x9,
0x403f24, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x42d1f0,
0x0, 0x413078, 0x0, 0x0,
0x0, 0x0, 0xd0000, 0xf1f4,
0xcf8, 0xf5f1, 0x7883, 0xe2c6,
0x67, 0xeccc, 0xc630, 0xba2e,
0x6e41, 0x641d, 0x716d, 0x4505,
0x76fff224, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0xfffffffe, 0x0,
0x76fff2ac, 0x412fcd, 0x1, 0x0,
0x6, 0x7fffffff, 0x1, 0x0,
0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0,
0xa, 0xa, 0x425088, 0x8,
0x7ffffff8, 0x100, 0x413f38, 0x1,
0x413f38, 0x0, 0x2, 0x76fff0f8,
0x0, 0x0, 0x7fff
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值