DASCTF暑期挑战赛 Reverse复现

DosSnake:

本题考查的是对8086汇编代码分析(当然也可以修改游戏程序直接输出flag,由于我的windows系统打不开游戏程序所以此方法暂且不作分析介绍了)

直接拖进IDA查看汇编代码算了,由于这个程序只给了一个数据段,我们很容易就能找到代码加密逻辑(前面一大段的汇编代码都是为了实现贪吃蛇这个小游戏没啥用,我们直接看加密部分):

可以看到逻辑非常简单,Dasctf的前6部分作为key,后面的26位数据作为密文,进行简单的异或加密

si对应密文指针,di对应key指针,密文数据如下:

直接写脚本一把逆即可得到flag

Exp:

#include <stdio.h>
#include <stdbool.h>
#include <stdint.h>
#include <string.h>

int main() {
   unsigned char a[]="DASCTF";
   unsigned int b[]={ 0x3F, 0x09, 0x63, 0x34, 0x32, 0x13, 0x2A, 0x2F, 0x2A, 0x37, 
     0x3C, 0x23, 0x00, 0x2E, 0x20, 0x10, 0x3A, 0x27, 0x2F, 0x24, 
     0x3A, 0x30, 0x75, 0x67, 0x65, 0x3C};
   int i;
   for(i=0;i<26;i++){
           printf("%c",a[i%6]^b[i]);
   }
}

Strangeprograme:

本题考查的是iat hook

直接在ida分析Strangeprograme_ok.exe,查看字符串找到有一个假flag

看汇编分析发现存在.DASCTF段

直接跳到该处(loc_41D000),进行交叉引用,溯源到sub_413D50,可以看到存在一个反调试

再进入sub_4111BD()->sub_414E30()->sub_411046()->sub_414B90():

查看sub_4111BD函数会发现其内部先定位到.DASCTF段,再进行了SMC

下断点处理一下就可以看见加密逻辑是魔改的TEA:

Exp:


#include <stdio.h>
#include <stdint.h>
 
void TEA_decrypt(uint32_t* enc, uint32_t* key);
 
int main() {
    unsigned int enc[] = { 0xBC2B4DF9, 0x6213DD13, 0x89FFFCC9, 0x0FC94F7D, 0x526D1D63, 0xE341FD50, 0x97287633, 0x6BF93638, 0x83143990, 0x1F2CE22C };
    unsigned int key[] = { 0x12345678, 0x09101112, 0x13141516, 0x15161718 };
    for (size_t i = 9; i >= 2; i -= 2)
    {
        enc[i] ^= enc[1];
        enc[i - 1] ^= enc[0];
        TEA_decrypt(enc, key);
    }
    TEA_decrypt(enc, key);
 
    printf("%s", enc);
}
 
void TEA_decrypt(uint32_t* enc, uint32_t* key)
{
    uint32_t v0 = enc[0], v1 = enc[1], i;
    uint32_t delta = 0x9e3779b9;
    uint32_t sum = delta * 16;
    uint32_t k0 = key[0], k1 = key[1], k2 = key[2], k3 = key[3];
    for (i = 0; i < 16; i++)
    {
        sum -= delta;
        v1 -= ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3);
        v0 -= ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1);
 
    }
    enc[0] = v0;
    enc[1] = v1;
}

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值