当前位置: 首页 > 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

相关文章:

  • 对日开发 秀丸文本编辑器 宏的基本使用
  • 计算属性 vs methods方法
  • Java大厂面试突击:从Spring Boot自动配置到Kafka分区策略实战解析
  • SVT-AV1源码分析-函数svt_aom_motion_estimation_kernel
  • linux:进程的替换
  • 深入解读:2025 数字化转型管理 参考架构
  • 【算法】回溯法
  • 杭电oj(1010、1015、1241)题解
  • 【沉浸式求职学习day27】
  • 【视频生成模型】通义万相Wan2.1模型本地部署和LoRA微调
  • Python----深度学习(基于DNN的吃鸡预测)
  • 动手学深度学习11.11. 学习率调度器-笔记练习(PyTorch)
  • arcpy列表函数的应用(4)
  • MySQL的锁(InnoDB)【学习笔记】
  • win11报错 ‘wmic‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件 的解决方案
  • NestJS + Kafka 秒杀系统完整实践总结
  • 在 Ubuntu 24.04 系统上安装和管理 Nginx
  • SDRAM介绍和时序
  • 列出es查询match、term、wildcard、prefix、fuzzy、range、query_string、text、missing的区别及用法
  • 数据可视化 —— 饼图
  • 国家能源局:支持民营企业参股投资核电项目
  • 大学2025丨专访南开人工智能学院院长赵新:人工智能未来会变成通识类课程
  • 葛兰西:“生活就是抵抗”
  • 人民日报:光荣属于每一个挺膺担当的奋斗者
  • 文化体验+商业消费+服务创新,上海搭建入境旅游新模式
  • 龚曙光:散文家永远只有一个视角,就是“我与时代”