MRCTF 2021 Dynamic Debug

Dynamic Debug

这是除了签到题我唯一能做的了,据说它还是出题人的失误

  1. 得到ELF文件,先用虚拟机跑一下
    在这里插入图片描述
  2. 丢进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}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值