[SUCTF2019]hardcpp_一道混淆题,熟悉控制流平坦化

首先用IDA打开,发现有很多while(1),大量代码混淆其中

利用defalt进行控制流平坦化去混淆

 

找到主函数地址

好了

开始执行

输入 python .\defalt.py hardCpp 0x4007E0

等几分钟后会执行完毕

顺便说一下符号执行的原理

符号执行大概是将内存 寄存器值当成未知变量 就像设一个方程 当成x 往下执行 遇到分支保存一下 尝试各种分支 执行到你想要的地方 后续可以约束求解

好了,我们再打开

 逻辑清晰很多了

 进行分析

 每个函数大概的意思都放在名称上了

分析加密逻辑

解密逻辑

 

 

 ok

#include<stdio.h>
int main(){
    int i;
   unsigned char enc[] ={0xF3, 0x2E, 0x18, 0x36, 0xE1, 0x4C, 0x22, 0xD1, 0xF9, 
    0x8C, 0x40, 0x76, 0xF4, 0x0E, 0x00, 0x05, 0xA3, 0x90, 0x0E, 0xA5};
  char flag[22];
    flag[0]='#';
    flag[21]='\0';
    for(i = 1;i<21;i++){
     flag[i]= ((enc[i-1]^((flag[i-1] ^18)*3 +2))-flag[i-1]%7)^0;                      
    }
    puts(flag); 
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值