当前位置: 首页 > news >正文

re题(48)BUUCTF-[网鼎杯 2020 青龙组]singal

BUUCTF在线评测

找到主函数,对v4存储空间赋值

我们知道v4的数据

看vm_operad函数,传进来已知的v4数组和整数114,我们可以看到这个函数里就两个数组str和v4,可以初步判断主要是这两个函数进行操作,其他的char和int是进行运算的中间量

case7是str数组从第100个存储单元开始与a1数组里的数据按规律比较,若不同则结束,case10是输入操作,str数组前15个字符是我们要的flag

可以发现v9起到计数的作用,每一步都涉及v9;v6只在case1中,意思是v4给str从第100个存储单元开始赋值;case2、case3、case4、case5都是用a1数组的数据和str前15个字符(也就是flag)运算后赋值给v4

case8、case11、case12同样是用str前十五个字符运算后赋值给v4

总结一下,就是从case10读取数据,从case2、3、4、5、6、8、11、12选取几个对flag进行运算赋值给v4,再执行case1通过中介v4赋值给str第100往后的单元,最后执行case7进行一个比较操作,判断是否正确

所以我们更改一下代码,把case7的比较操作改成给str第100往后存储单元赋值操作,并且每执行一个case记录一下v9的值(后面有用),运行得到str第100个存储单元往后的数据,再改写一次代码,因为switch循环是根据a1[v9]的值进行选择的,而这两个值我们都知道,所以我们就可以从后往前运行,用str[v7+100]的值推出来flag

我的脚本中我把两次更改的代码写成了两个函数

#include<stdio.h>
#include<string.h>
unsigned char ida_chars[] =
{0x0A, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x51, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xA7, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xF1, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x84, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0xC1, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x7A, 0x00, 0x00, 0x00
};int *a = (int*)ida_chars;int __cdecl vm_operad(int *a1, int a2)
{int result; // eaxchar Str[200]; // [esp+13h] [ebp-E5h] BYREFchar v4; // [esp+DBh] [ebp-1Dh]int v5; // [esp+DCh] [ebp-1Ch]int v6; // [esp+E0h] [ebp-18h]int v7; // [esp+E4h] [ebp-14h]int v8; // [esp+E8h] [ebp-10h]int v9; // [esp+ECh] [ebp-Ch]char order[114] = {};int s = 0;v9 = 0;v8 = 0;v7 = 0;v6 = 0;v5 = 0;while ( 1 ){result = v9;if ( v9 >= a2 )break;switch ( a1[v9] ){case 1:Str[v6 + 100] = v4;++v9;++v6;++v8;break;case 2:v4 = a1[v9 + 1] + Str[v8];v9 += 2;break;case 3:v4 = Str[v8] - (a1[v9 + 1]);v9 += 2;break;case 4:v4 = a1[v9 + 1] ^ Str[v8];v9 += 2;break;case 5:v4 = a1[v9 + 1] * Str[v8];v9 += 2;break;case 6:++v9;break;case 7:Str[v7 + 100] = a1[v9 + 1];                        // 打印关键数据V4printf("%#X, ", Str[v7 + 100]);++v7;v9 += 2;break;case 8:Str[v5] = v4;++v9;++v5;break;case 10:scanf("%s",Str);++v9;break;case 11:v4 = Str[v8] - 1;++v9;break;case 12:v4 = Str[v8] + 1;++v9;break;}order[s++] = v9;}printf("执行顺序是: ");for (int ss = 0; ss < strlen(order); ss++) {printf("%d, ", order[ss]);}
return 0;
}int __cdecl devm_operad(int *a1, int a2)
{//加密数据 unsigned char enflag[]=
{
0X22, 0X3F, 0X34, 0X32, 0X72, 0X33, 0X18, 0XFFFFFFA7, 0X31, 
0XFFFFFFF1, 0X28, 0XFFFFFF84, 0XFFFFFFC1, 0X1E, 0X7A
};char order[]=
{ 
1, 3, 4, 6, 7, 9, 10, 12, 13, 15, 16, 17, 18, 19, 20, 22,
23, 25, 26, 28, 29, 30, 31, 32, 33, 35, 36, 38, 39, 41, 
42, 44, 45, 46, 47, 48, 49, 51, 52, 54, 55, 57, 58, 60, 61,
63, 64, 66, 67, 69, 70, 72, 73, 75, 76, 78, 79, 81, 82, 83,
84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114};int i; // eaxunsigned char flag[100]; // [esp+13h] [ebp-E5h] BYREFint v5; // [esp+DCh] [ebp-1Ch]int v6; // [esp+E0h] [ebp-18h]int v7; // [esp+E4h] [ebp-14h]int v8; // [esp+E8h] [ebp-10h]v8 = 15;v7 = 15;v6 = 15;v5 = 0;
for(int k=strlen(order)-1;k>=0;k--){i=order[k];switch ( a1[i] ){case 1:v6--;v8--;v5 = enflag[v6];break;case 2:flag[v8]=v5 - char(a1[i + 1]);break;case 3:flag[v8]=v5 + char(a1[i + 1]);break;case 4:flag[v8]=(v5 ^ a1[i + 1])&0xff;break;case 5:flag[v8]=v5 / a1[i + 1];break;case 6:break;case 7:break;case 8:v5 = flag[--v7];break;case 10:break;case 11:flag[v8]=v5 + 1;break;case 12:flag[v8]=v5 - 1;break;}}printf("%s", flag);return 0;}int main(){vm_operad(a,114);devm_operad(a,114);return 0;
}

最后一串数字就是flag

http://www.xdnf.cn/news/178849.html

相关文章:

  • vue项目页面适配
  • Java学习--HashMap
  • 科技打头阵,创新赢未来——中科视界携千眼狼超高速摄像机亮相第三届科交会
  • 【HPC存储性能测试】02-ior带宽性能测试
  • acwing532. 货币系统
  • 【操作系统原理07】输入/输出系统
  • 常用的多传感器数据融合方法
  • 安卓屏播放语音失败,报错TextToSpeech: speak failed: not bound to TTS engine
  • risc-V学习日记(4):RV32I指令集
  • 开关电源实战(六)ADDC反激电源
  • 说一下Drop与delete区别
  • 在java中实现protobuf自定义协议
  • 通过ThreadLocal存储登录用户信息
  • LeetCode每日一题4.27
  • 【HPC存储性能测试】01-OpenMPI部署
  • 深入理解指针(5)
  • 【Leetcode 每日一题】3392. 统计符合条件长度为 3 的子数组数目
  • lobechat调用ollama模型,服务连接失败
  • UE5 NDisplay 单主机打包运行
  • SaaS方兴未艾,快速稳定的访问与全面的安全防护成关键
  • 典籍查询界面增加我的收藏查询功能
  • AI 数据中心 vs 传统数据中心:从硬件架构到网络设计的全面进化
  • 0基础 | Proteus | 中断 | 点阵
  • keil 中优化等级的bug
  • 泰迪杯实战案例超深度解析:旅游景点游客流量预测与资源优化
  • Zabbix
  • 测试基础笔记第十四天
  • Java基础——排序算法
  • 底层源码和具体测试解析HotSpot JVM的notify唤醒有序性(5000字详解)
  • 优化无头浏览器流量:使用Puppeteer进行高效数据抓取的成本降低策略