Dynamic Debug
(这是除了签到题我唯一能做的了,据说它还是出题人的失误 )
- 得到ELF文件,先用虚拟机跑一下
- 丢进IDA
通过搜索字符串找到main函数
首先可以得知flag的长度为32,其次当我们继续分析会发现验证函数被添加了花指令,IDA无法识别。
这时我们动调一下就会发现动调后的代码发生了变化,可以初步判定为smc。
然后就可以找到一段极其像验证函数的代码
但是这一部分IDA没有分析,我们找到函数头P一下创建函数
发现F5后代码极其不可读,需要平衡一下堆栈,用keypatch在函数开头加上push rbp; mov rbp, rsp;
这样IDA就可以识别变量了
简单分析以后发现就是一个tea加密(熟悉常见的加密算法还是很重要的)
解密脚本如下:
#include <stdio.h>
#include <stdint.h>
unsigned char v[32]={0x99, 0xA1, 0x85, 0x55, 0x68, 0x5D, 0x82, 0x7E, 0x39, 0x00,
0x4D, 0x94, 0x43, 0x69, 0x72, 0x71, 0x06, 0x43, 0x51, 0x6A,
0x00, 0xAD, 0x14, 0x4B, 0x3F, 0x0D, 0xD2, 0x64, 0x15, 0xDB,
0x37, 0x9F};
uint32_t k[4]={0x6B696C69,0x79645F65,0x696D616E,0x67626463};
//解密函数
void decrypt ()
{
uint32_t i, j; /* set up */
uint32_t delta=0x9e3779b9; /* a key schedule constant */
uint32_t k0=k[0], k1=k[1], k2=k[2], k3=k[3]; /* cache key */
for (i=0; i<4; i++)
{
uint32_t *enc=(uint32_t *)(v+8*i);
uint32_t sum=0xC6EF3720;
for (j=0; j<32; j++)
{ /* basic cycle start */
enc[1] -= ((enc[0]<<4) + k2) ^ (enc[0] + sum) ^ ((enc[0]>>5) + k3);
enc[0] -= ((enc[1]<<4) + k0) ^ (enc[1] + sum) ^ ((enc[1]>>5) + k1);
sum -= delta;
} /* end cycle */
}
}
int main()
{
decrypt();
for(int i=0;i<32;i++)
printf("%c",v[i]);
return 0;
}
//MRCTF{Dyn4m1c_d3buG_1s_a_ki11eR}