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

Buuctf reverse [FlareOn4]IgniteMe 题解

一. 查壳
无壳32位程序请添加图片描述
二. ida打开

请添加图片描述

  1. GetStdHandle函数根据微软官方文档可以得知是获取标准输入/输出/错误的句柄
    参数里的 0xFFFFFFF6转换一下是4294967286, 对应(DWORD) -10
    所以这里的WriteFile函数实际上是实现了printf的功能

请添加图片描述

  1. sub_4010F0()函数
    其功能是通过ReadFile函数读取输入的字符串并保存到地址为403078的内存处
int sub_4010F0()
{unsigned int v0; // eaxchar Buffer[260]; // [esp+0h] [ebp-110h] BYREFDWORD NumberOfBytesRead; // [esp+104h] [ebp-Ch] BYREFunsigned int i; // [esp+108h] [ebp-8h]char v5; // [esp+10Fh] [ebp-1h]v5 = 0;for ( i = 0; i < 260; ++i )Buffer[i] = 0;                              // 清空buffer数组ReadFile(hFile, Buffer, 260u, &NumberOfBytesRead, 0);// 读取数据到buffer中for ( i = 0; ; ++i ){v0 = strlen_401020(Buffer);                 // int类型修改为char*,获取字符串长度if ( i >= v0 )break;v5 = Buffer[i];if ( v5 != '\n' && v5 != '\r' ){if ( v5 )input_403078[i] = v5;                   // 将Buffer串保存到403078中}}return 1;
}

其中的401020()函数的功能不难发现是返回字符串长度,这里用strlen命名便于理解
另外ida可能会把函数参数认为是int类型(由于32位指针占4字节),可以右键使用set call type将int改为char*

在这里插入图片描述

  1. sub_401050函数
    这个函数的功能是:
    对输入字符串进行加密,加密操作是从flag的末尾到flag的开头进行一个异或操作
    将加密后的字符串和程序保存的加密串进行比较,所以加密串是已知的

v4的初始值由sub_401000()函数赋值,401000中仅有一个rol4函数
_ROL4_函数的功能是循环左移,位移时最高位不舍弃,将最高位挪回最低位
比如二进制数据 10000,循环左移2位后得到00010
这里循环左移四位后再右移一位,最终返回值是0x380004,也就是v4初值

在这里插入图片描述

int sub_401050()
{int len; // [esp+0h] [ebp-Ch]int i; // [esp+4h] [ebp-8h]unsigned int j; // [esp+4h] [ebp-8h]char v4; // [esp+Bh] [ebp-1h]len = strlen_401020(input_403078);v4 = sub_401000();                            // 返回的是0x380004for ( i = len - 1; i >= 0; --i ){encode_flag[i] = v4 ^ input_403078[i];      // 异或操作v4 = input_403078[i];}for ( j = 0; j < 39; ++j ){if ( encode_flag[j] != (unsigned __int8)encode_flag000[j] )return 0;}return 1;
}
  1. 解题脚本
#include <stdio.h>int main() {unsigned char encode_flag000[] ={0x0D, 0x26, 0x49, 0x45, 0x2A, 0x17, 0x78, 0x44, 0x2B, 0x6C,0x5D, 0x5E, 0x45, 0x12, 0x2F, 0x17, 0x2B, 0x44, 0x6F, 0x6E,0x56, 0x09, 0x5F, 0x45, 0x47, 0x73, 0x26, 0x0A, 0x0D, 0x13,0x17, 0x48, 0x42, 0x01, 0x40, 0x4D, 0x0C, 0x02, 0x69, 0x00};char tmp = 0x380004;unsigned char flag[40] = { 0 };for (int i = 38; i >=0; i--){flag[i] = encode_flag000[i] ^ tmp;tmp = flag[i];}puts(flag);return 0;
}

得到flag{R_y0u_H0t_3n0ugH_t0_1gn1t3@flare-on.com}

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

相关文章:

  • ChatGPT懂SAP吗?跟ChatGPT聊完后,我暂时不担心会失业
  • Communications link failure 解决方法 !!!
  • pytorch入门2--数据预处理、线性代数的矩阵实现、求导
  • 15.消息队列RabbitMQ
  • 并发编程之死锁问题介绍
  • 【python学习笔记】:SQL常用脚本(一)
  • Spring是怎么解决循环依赖的
  • HTML创意动画代码
  • 软工第一次个人作业——阅读和提问
  • urho3d的自定义文件格式
  • spark第一章:环境安装
  • MySQL---存储过程与存储函数的相关概念
  • PMP值得考吗?
  • Quartus 报错汇总(持续更新...)
  • Netty权威指南总结(一)
  • Elasticsearch:如何轻松安全地对实时 Elasticsearch 索引重新索引你的数据
  • 【算法笔记】前缀和与差分
  • python实战应用讲解-【实战应用篇】函数式编程-八皇后问题(附示例代码)
  • 【Servlet篇】如何解决Request请求中文乱码的问题?
  • SpringBoot:SpringBoot简介与快速入门(1)
  • RabbitMQ学习(十一):RabbitMQ 集群
  • 学渣适用版——Transformer理论和代码以及注意力机制attention的学习
  • 网上这么多IT的培训机构,我们该怎么选?
  • 数据结构与算法—跳表(skiplist)
  • 【C++】5.C/C++内存管理
  • 一文让你彻底理解关于消息队列的使用
  • 条件期望3
  • 第四届蓝桥杯省赛 C++ B组 - 翻硬币
  • linux shell 入门学习笔记14 shell脚本+数学计算
  • ESP32设备驱动-MAX30100心率监测传感器驱动