文章目录

  • vm_operad
    • 函数功能
  • read
    • 函数功能
      • 流程代码
  • 简介每个数字所要做的事(但是流程不是按照这样进行的)
    • 注意:
  • 验证数据(逆向重点)
  • 逆向思维

vm_operad

int __cdecl vm_operad(int *a1, int a2)
{int result; // eax@2char v3[100]; // [sp+13h] [bp-E5h]@4char v4[100]; // [sp+77h] [bp-81h]@5char v5; // [sp+DBh] [bp-1Dh]@5int v6; // [sp+DCh] [bp-1Ch]@1int v7; // [sp+E0h] [bp-18h]@1int v8; // [sp+E4h] [bp-14h]@1int v9; // [sp+E8h] [bp-10h]@1int v10; // [sp+ECh] [bp-Ch]@1v10 = 0;v9 = 0;v8 = 0;v7 = 0;v6 = 0;while ( 1 ){result = v10;if ( v10 >= a2 )return result;switch ( a1[v10] ){case 10:read(v3);++v10;break;case 1:v4[v7] = v5;++v10;++v7;++v9;break;case 2:v5 = a1[v10 + 1] + v3[v9];v10 += 2;break;case 3:v5 = v3[v9] - LOBYTE(a1[v10 + 1]);v10 += 2;break;case 4:v5 = a1[v10 + 1] ^ v3[v9];v10 += 2;break;case 5:v5 = a1[v10 + 1] * v3[v9];v10 += 2;break;case 6:++v10;break;case 7:if ( v4[v8] != a1[v10 + 1] ){printf("what a shame...");exit(0);}++v8;v10 += 2;break;case 11:v5 = v3[v9] - 1;++v10;break;case 12:v5 = v3[v9] + 1;++v10;break;case 8:v3[v6] = v5;++v10;++v6;break;default:continue;}}
}

函数功能

利用文件字符串中保存的流程数据(以及加密数据)和控制台数据配合进行验证flag(这个文件字符串中保存的数据既起到了流程的作用还有加密作用)

read

size_t __cdecl read(char *a1)
{size_t result; // eax@1printf("string:");scanf("%s", a1);result = strlen(a1);if ( result != 15 ){puts("WRONG!\n");exit(0);}return result;
}

函数功能

这个read函数用来读取控制台输入的命令,我觉得就是flag

0A 00 00 00 04 00 00 00  10 00 00 00 08 00 00 00
03 00 00 00 05 00 00 00  01 00 00 00 04 00 00 00
20 00 00 00 08 00 00 00  05 00 00 00 03 00 00 00
01 00 00 00 03 00 00 00  02 00 00 00 08 00 00 00
0B 00 00 00 01 00 00 00  0C 00 00 00 08 00 00 00
04 00 00 00 04 00 00 00  01 00 00 00 05 00 00 00
03 00 00 00 08 00 00 00  03 00 00 00 21 00 00 00
01 00 00 00 0B 00 00 00  08 00 00 00 0B 00 00 00
01 00 00 00 04 00 00 00  09 00 00 00 08 00 00 00
03 00 00 00 20 00 00 00  01 00 00 00 02 00 00 00
51 00 00 00 08 00 00 00  04 00 00 00 24 00 00 00
01 00 00 00 0C 00 00 00  08 00 00 00 0B 00 00 00
01 00 00 00 05 00 00 00  02 00 00 00 08 00 00 00
02 00 00 00 25 00 00 00  01 00 00 00 02 00 00 00
36 00 00 00 08 00 00 00  04 00 00 00 41 00 00 00
01 00 00 00 02 00 00 00  20 00 00 00 08 00 00 00
05 00 00 00 01 00 00 00  01 00 00 00 05 00 00 00
03 00 00 00 08 00 00 00  02 00 00 00 25 00 00 00
01 00 00 00 04 00 00 00  09 00 00 00 08 00 00 00
03 00 00 00 20 00 00 00  01 00 00 00 02 00 00 00
41 00 00 00 08 00 00 00  0C 00 00 00 01 00 00 00
07 00 00 00 22 00 00 00  07 00 00 00 3F 00 00 00
07 00 00 00 34 00 00 00  07 00 00 00 32 00 00 00
07 00 00 00 72 00 00 00  07 00 00 00 33 00 00 00
07 00 00 00 18 00 00 00  07 00 00 00 A7 FF FF FF
07 00 00 00 31 00 00 00  07 00 00 00 F1 FF FF FF
07 00 00 00 28 00 00 00  07 00 00 00 84 FF FF FF
07 00 00 00 C1 FF FF FF  07 00 00 00 1E 00 00 00
07 00 00 00 7A 00 00 00

流程代码

  case 10:read(v3);++v10;break;case 1:v4[v7] = v5;++v10;++v7;++v9;break;case 2:v5 = a1[v10 + 1] + v3[v9];v10 += 2;break;case 3:v5 = v3[v9] - LOBYTE(a1[v10 + 1]);v10 += 2;break;case 4:v5 = a1[v10 + 1] ^ v3[v9];v10 += 2;break;case 5:v5 = a1[v10 + 1] * v3[v9];v10 += 2;break;case 6:++v10;break;case 7:if ( v4[v8] != a1[v10 + 1] ){printf("what a shame...");exit(0);}++v8;v10 += 2;break;case 11:v5 = v3[v9] - 1;++v10;break;case 12:v5 = v3[v9] + 1;++v10;break;case 8:v3[v6] = v5;++v10;++v6;break;default:continue;

简介每个数字所要做的事(但是流程不是按照这样进行的)

  1. 0x0A:读取控制台所输入的15个字符
  2. 0x4:求v5值,文件字符串下一个位置值 ^ 控制台第一个数据
  3. 0x10:continue
  4. 0x08:v5赋给v3数组的第一个元素
  5. 0x03:(v3数组的第一个元素-文件字符串下一个位置值)赋给v5
  6. 0x05:求V5值,文件字符串下一个位置值 * 控制台第一个数据
  7. 0x01:v5赋给v4数组的第一个元素,然后v9自增,也就代表接下来需要利用到控制台第二个数据
  8. 0x4:求v5值,文件字符串下一个位置值 ^ 控制台第一个数据
  9. 0x20:continue
  10. 0x08:v5赋给v3数组的第二个元素
  11. 0x05:求V5值,文件字符串下一个位置值 * 控制台第二个数据
  12. 0x03:(v3数组的第二个元素 - 文件字符串下一个位置值)赋给v5
  13. 0x01:v5赋给v4数组的第二个元素,然后v9自增,也就代表接下来需要利用到控制台第三个数据
    ……………………………………


注意:

文件字符串遇到2 ,3,4,5,7时,那么下一个值并不控制流程(流程直接跳过!),而是被当计算数据所用了。。所以才说执行流程并非是上面所写

验证数据(逆向重点)

07 00 00 00 22 00 00 00  07 00 00 00 3F 00 00 00
07 00 00 00 34 00 00 00  07 00 00 00 32 00 00 00
07 00 00 00 72 00 00 00  07 00 00 00 33 00 00 00
07 00 00 00 18 00 00 00  07 00 00 00 A7 FF FF FF
07 00 00 00 31 00 00 00  07 00 00 00 F1 FF FF FF
07 00 00 00 28 00 00 00  07 00 00 00 84 FF FF FF
07 00 00 00 C1 FF FF FF  07 00 00 00 1E 00 00 00
07 00 00 00 7A 00 00 00

这里全是用来验证的:
依次是 22h 3fh 34h 32h 72h 33h 18h ffffffa7h 31h fffff1h 28h ffff84h 1eh 7ah
所以按照标准字符串,然后把每个字符都逆着做一遍操作,然后就得到了我们所输在控制台的东西,紧接着就结束了。。。

逆向思维

  1. (0x22+5)^ 0x10
  2. (0x3f/3) ^ 0x20
  3. (0x34 + 1) + 2
  4. (0x32 ^ 4) - 1
  5. (0x72 + 0x21) / 3
  6. (0x33 + 1) + 1
  7. (0x18 + 0x20) ^ 9
  8. (0xa7 ^ 0x24) -0x51
  9. (0x31 + 1) - 1
  10. (0xf1 - 0x25) / 2
  11. (0x28 ^ 0x41) - 0x36
  12. (0x84 / 1) - 0x20
  13. (0xc1 - 0x25) / 3
  14. (0x1e + 0x20) ^ 9
  15. (0x7a - 1) - 0x41
flag{757515121f3d478}

2020——网鼎杯 (青龙组)signal相关推荐

  1. [re]符号执行一把梭:2020网鼎杯青龙组re_signal_wp

    [re]符号执行一把梭:2020网鼎杯青龙组re_signal_wp 这道题是2020网鼎杯青龙组的一道逆向提signal,一道虚拟机逆向题目,题目本身不难,可以直接分析也可以符号执行秒掉. 题目分析 ...

  2. 2020网鼎杯青龙组部分题目writeup

    2020网鼎杯青龙组部分题目writeup 0x00 Crypto之boom 0x00 Crypto之boom 下载下来是个exe文件,拖到cmd运行(切记一定不要双击,用cmd打开,双击运行后最后程 ...

  3. 2020网鼎杯青龙组部分题目WP

    0x00 Crypto之boom 下载下来是个exe文件,拖到cmd运行(切记一定不要双击,用cmd打开) 找个md5网站解密,得到明文 输入后得到一个方程组,解方程组(找个就不用说了,初中知识) 输 ...

  4. 2022网鼎杯青龙组wp

    本次网鼎杯的Crypto部分其实还是比较简单的,解出的人数也较多.感觉405题略难一些,花了比较多的时间,恰巧最后几小时给出的162所用到的求解方式之前遇到过,有幸作为一个CTF新手把这次的比赛密码学 ...

  5. [pwn]星号格式化串:2020网鼎杯白虎组pwn quantum_entanglement wp

    [pwn]星号格式化串:2020网鼎杯白虎组pwn quantum_entanglement wp 文章目录 [pwn]星号格式化串:2020网鼎杯白虎组pwn quantum_entanglemen ...

  6. 2020网鼎杯玄武组re baby_vm复盘

    baby_vm 0x00 前言 这是一道来自2020网鼎杯玄武组的逆向题,题目的重难点在分析vm流程.这届比赛我没有参加,看到 一些博客都在分析这道题目,于是在闲暇时间复盘学习一下. 0x01分析 首 ...

  7. 【CTF WriteUp】网鼎杯 青龙组 Misc题解复现(整理,WP非原创)

    (原本还打算四场Crypto全刷的,结果第四场被教做人了,算了整理点别的当补偿了) (另:求白虎组 Misc-boot 的 WP) Misc 虚幻2 图片在RGB信道各有一张图,提出来 R: G: B ...

  8. 2020第二届网鼎杯 青龙组部分writeup

    目录 Reverse jocker signal bang Reverse jocker 前面是一个假的flag,直接跳过omg函数 下面这段代码把0x401500-0x4015ba都亦或了0x41( ...

  9. 网鼎杯青龙组 web题-AreUSerialz

    //复现地址:https://buuoj.cn/challenges //开启环境后获得源码一份. <?phpinclude("flag.php");highlight_fi ...

  10. 2020网鼎杯玄武组部分题writeup(签到/vulcrack/java/js_on)

    签到题 思路 浏览器F12,调取ajax,输入队伍token,获取flag 过程 (1)浏览器进入F12查看js,看到game_manage.js这个js,看名字像是控制游戏的 (2)进入js,通过搜 ...

最新文章

  1. 英伟达TensorRT 8-bit Inference推理
  2. Android学习笔记之progressBar(进度条)
  3. 推荐系统产品与算法概述 | 深度
  4. 手把手教你写移动端瀑布流控件布局篇
  5. 全球及中国航空材料行业发展动态及应用格局展望规划报告2021-2027年版
  6. 我的程序人生以及一些杂项
  7. Spring的REST服务发现性,第5部分
  8. java 一维数组_java基础 ---- 一维数组
  9. Tomcat简单介绍
  10. 每天一道算法题(10)——数对之差的最大值
  11. delphi中的Format函数详解
  12. matlab音乐信号处理,数字信号处理课程设计---基于 MATLAB 的音乐信号处理和分析...
  13. 用户划分——RMF方法
  14. 【荐读】基于文本数据的消费者洞察
  15. 汇编基础--cmp汇编指令
  16. 【微服务】服务调用----Ribbon
  17. 【第二十一讲】参数解析器
  18. webpack多入口
  19. 淘宝新开店铺没有生意不会推广的苦衷与心得
  20. IPv6的被请求节点的组播地址

热门文章

  1. 虚拟服务器启动顺序,认识VPC2007的虚拟机系统启动顺序
  2. 博物馆自动灭火系统应如何选择
  3. NLP:自然语言处理技术近十年发展技术更迭的简介、案例之详细攻略(持续更新)
  4. ML之SVM:基于sklearn的svm算法实现对支持向量的数据进行标注
  5. Py之SnowNLP:SnowNLP中文处理包的简介、安装、使用方法、代码实现之详细攻略
  6. MapReduce-TextInputFormat 切片机制
  7. 十一、linux文件系统权限详解
  8. is 和 == 区别 编码和解码
  9. 前端构建工具gulp之基本介绍
  10. 10-10数组的介绍