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

re学习(30)攻防世界-hackme(代码复原2)

思路:   1.输出成功,v26不为0,说明关系式:v21=((unsigned __int8)v24 ^ v20)

           →2.在汇编代码第37行,输入v16=v20,所以求的值为v20

           →3.根据关系式,求的值v20=v21^v24

           →4.v21在第汇编代码第36行也可以提取出来

           →5.v24可以由汇编代码40行while计算出来

首先载入IDA,Ctrl+F查找main函数,没有找到,然后Shift+F2查找字符串,发现特殊字符串,跟进,然后交叉引用查看字符串位置,寻找flag

 

 

反汇编如下:

__int64 __fastcall sub_400F8E(__int64 a1, int a2, int a3, int a4, int a5, int a6)
{int v6; // edxint v7; // ecxint v8; // r8dint v9; // r9dint num; // ecxint v11; // r8dint v12; // r9dchar v14; // [rsp+0h] [rbp-C0h]char v15; // [rsp+0h] [rbp-C0h]char input[136]; // [rsp+10h] [rbp-B0h] BYREFint v17; // [rsp+98h] [rbp-28h]char v18; // [rsp+9Fh] [rbp-21h]int v19; // [rsp+A0h] [rbp-20h]unsigned __int8 v20; // [rsp+A6h] [rbp-1Ah]char v21; // [rsp+A7h] [rbp-19h]int v22; // [rsp+A8h] [rbp-18h]int v23; // [rsp+ACh] [rbp-14h]int v24; // [rsp+B0h] [rbp-10h]int v25; // [rsp+B4h] [rbp-Ch]_BOOL4 v26; // [rsp+B8h] [rbp-8h]int i; // [rsp+BCh] [rbp-4h]sub_407470((unsigned int)"Give me the password: ", a2, a3, a4, a5, a6, a2);sub_4075A0((unsigned int)"%s", (unsigned int)input, v6, v7, v8, v9, v14);for ( i = 0; input[i]; ++i );v26 = i == 22;v25 = 10;do{num = (int)sub_406D90() % 22;               // 猜测是一个正常的返回,v10的取值为0...21,如果不正常的话需要把sub_406D90逆向一下v22 = num;v24 = 0;v21 = byte_6B4270[num];v20 = input[num];                           // 将输入值v16赋值给v20v19 = num + 1;v23 = 0;while ( v23 < v19 ){++v23;v24 = 1828812941 * v24 + 12345;}v18 = v24 ^ v20;if ( v21 != ((unsigned __int8)v24 ^ v20) )  // 关系式:既然v26不为0,说明v21=((unsigned __int8)v24 ^ v20)// 在汇编代码第37行,输入v16=v20,所以求的值为v20// v21在第汇编代码第36行也可以提取出来// v24可以由汇编代码40行while计算出来// 最后根据关系式,求的值v20=v21^v24v26 = 0;--v25;}while ( v25 );if ( v26 )                                    // 如果在这里输出,说明v26不为0v17 = sub_407470((unsigned int)"Congras\n", (unsigned int)input, v24, num, v11, v12, v15);elsev17 = sub_407470((unsigned int)"Oh no!\n", (unsigned int)input, v24, num, v11, v12, v15);return 0LL;
}

编写脚本:

int main(){unsigned char v21[] ={0x5F, 0xF2, 0x5E, 0x8B, 0x4E, 0x0E, 0xA3, 0xAA, 0xC7, 0x93, 0x81, 0x3D, 0x5F, 0x74, 0xA3, 0x09, 0x91, 0x2B, 0x49, 0x28, 0x93, 0x67, 0x00, 0x00};for(int i=0;i<22;i++){   //先假定是这样的一个顺序 int v23=0;int v24=0;int v19=i+1;while ( v23 < v19 ){++v23;v24 = 1828812941 * v24 + 12345;}printf("%c",v24^v21[i]);}
} 

 flag{d826e6926098ef46}

http://www.lryc.cn/news/115195.html

相关文章:

  • Go Windows下开发环境配置(图文)
  • 【人工智能概述】python妙用 __str__()
  • android kernel移植5-RK3568
  • C++——string类介绍
  • 教雅川学缠论07-中枢实战众泰汽车000980
  • REDIS主从配置
  • 【测试】软件测试工具JMeter简单用法
  • 五个授权关键,为智能驾驶量产赋能
  • 【代码随想录-Leetcode第三题:977. 有序数组的平方】
  • [运维|中间件] Apache APISIX Dashboard部署(持续踩坑更新。。。)
  • Vue中watch监听属性新旧值相同问题解决方案
  • awk案例练习
  • Debian 12.1 正式发布
  • neo4j清空数据库
  • SpringBoot整合Mybatis-Plus
  • 在langchain中使用自定义example selector
  • pytest常用执行参数详解
  • 本地项目如何连接git远程仓库
  • 力扣 494. 目标和
  • Maven-搭建私有仓库
  • PostgreSql 参数配置
  • 【BMC】OpenBMC开发基础2:修改原有程序
  • 2012年数学建模竞赛脑卒中发病环境因素分析及干预日期数据处理代码
  • Merge和Rebase的区别
  • [RTKLIB]模糊度固定相关问题(二)
  • QtAV for ubuntu16.04
  • MFC 文件读写包括字符串的结构体
  • 在家构建您的迷你聊天Chat gpt
  • pytest自动化测试框架之断言
  • C++模板的用法