XCTF-Reverse:logmein
题目地址:https://adworld.xctf.org.cn/task/answer?type=reverse&number=4&grade=0&id=5078&page=1
发现程序是一个ELF文件,将其放入Linux环境中进行分析,发现程序是64位的
直接拖进ida64
step1、从main函数开始分析,使用F5查看伪代码
题目说是涉及算法逆向,应该是通过一系列比较可以得到正确的结果
void __fastcall __noreturn main(__int64 a1, char **a2, char **a3)
{size_t v3; // rsiint i; // [rsp+3Ch] [rbp-54h]char s[36]; // [rsp+40h] [rbp-50h]int v6; // [rsp+64h] [rbp-2Ch]__int64 v7; // [rsp+68h] [rbp-28h]char v8[8]; // [rsp+70h] [rbp-20h]int v9; // [rsp+8Ch] [rbp-4h]/*
v8是":"AL_RT^L*.?+6/46"这个字符串
V7是一个ll型的十进制数28537194573619560
然后逆序进行计算的话,28537194573619560转换为16进制是65626d61726168
接着转文本得到ebmarah
然后通过别的题解了解到这个需要将其倒序使用harambe
*/v9 = 0;strcpy(v8, ":\"AL_RT^L*.?+6/46"); //将指定字符串复制到v8v7 = 28537194573619560LL;//ebmarah 单击鼠标右键,先转化为十六进制,再转化为字符串v6 = 7;printf("Welcome to the RC3 secure password guesser.\n", a2, a3);printf("To continue, you must enter the correct password.\n");printf("Enter your guess: ");__isoc99_scanf("%32s", s);//s是用户输入的字符串,先进行比较长度v3 = strlen(s);if ( v3 < strlen(v8) )//如果长度比v8小,则进入sub_4007C0函数sub_4007C0();//双击查看,可以看出输出字符串Incorrect password,然后,退出for ( i = 0; i < strlen(s); ++i )//如果长度大于或等与v8则进入下面的循环{if ( i >= strlen(v8) )sub_4007C0();if ( s[i] != (char)(*((_BYTE *)&v7 + i % v6) ^ v8[i]) )//如果输入的字符串和经过运算后的后字符串不等,则进入sub_4007c0sub_4007C0();//输出Incorrect password}sub_4007F0();//You entered the correct password!\nGreat job!\n
}
补:这里(char)(((_BYTE )&v7 + i % v6) ^ v8[i])
BYTE 经查询,是相当于unsigned char
然后可以得到一个二进制码与后面v8[i]进行异或运算,然后转换为char类型依次比较
所以把每一个比较的字符存储进行输出就可以得到flag
证明输入的字符串就是flag
发现算法的关键在于 V6、V7、V8 的异或处理,通过分析得到如下代码:
key1=":\"AL_RT^L*.?+6/46" #v8
key2="harambe" #v7
key3=7 #v6
flag=''
for i in range(0,len(key1)):flag += chr(ord(key1[i])^ord(key2[i%key3]))
print(flag)
RC3-2016-XORISGUD
ord():是将字符串转换为ascii格式,为了方便运算
chr():是将ascii转换为字符串
至于为什么要倒序使用harambe也是看了大佬的WP才知道的 [●´Å`●] ~~
x86系列的CPU都是以小端序储存数据的,即低位字节存入低地址,高位字节存入高地址,所以正确的字符串应该反过来
XCTF-Reverse:logmein相关推荐
- Xctf Reverse菜鸟题解之csaw2013reversing2
Xctf Reverse菜鸟题解之csaw2013reversing2 IDA Pro静态分析 x32dbg动态调试分析 绕过反调试机制 IDA Pro静态分析 x32dbg动态调试分析 绕过反调试机 ...
- Bugku,Reverse:马老师杀毒卫士
扫描后32位 搜索字符,发现散乱的 flag,栅栏密码解决 得到 flag flag{ma_bao_guo_nb!}
- js数组要用的方法:push、pop、unshift、shift、splice、reverse、sort、concat、join、slice、indexof、foreash、map、filter
1.改变了原数组的方法 (1)push:从数组的最后面增加元素 返回值是:增加元素以后数组的长度 <script>var arr=[1,2,3]var res=arr.p ...
- 逆向迷宫题总结(持续更新) 2020华南师大CTF新生赛maze,攻防世界新手区:NJUPT CTF 2017,BUUCTF:不一样的flag
CTF逆向入门:迷宫题学习记录(持续更新) ** 目录 **CTF逆向入门:迷宫题学习记录(持续更新)** (前言) 一. 逆向迷宫题概述 二. 具体题目分析 1. 2019华南师大CTF新生赛maz ...
- 剑指offer:面试题06. 从尾到头打印链表
题目:从尾到头打印链表 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回). 示例 1: 输入:head = [1,3,2] 输出:[2,3,1] 限制: 0 <= 链表长度 & ...
- C++中std::reverse和std::reverse_copy的使用
std::reverse:反转排序容器内指定范围中的元素. std::reverse_copy与std::reverse唯一的区别是:reverse_copy会将结果拷贝到另外一个容器中,而不影响原容 ...
- Python 数据类型:列表
一.列表介绍 1. 列表可以存储一系列的值,使用中括号来定义,每个元素之间用逗号隔开,形如 ['a', 'b', 'c', 'd'] 2. 列表与元组的区别是:列表中的元素是可变的,元组中的元素是不可 ...
- 倒置函数reverse的用法
倒置字符串函数reverse:用于倒置字符串s中的各个字符的位置,如原来字符串中如果初始值为123456,则通过reverse函数可将其倒置为654321,程序如下: #include<stdi ...
- css3效果: animate实现点点点loading动画效果(一)
实现如图所示的点点点loading效果: 一:CSS3 animation实现代码 html代码: 提交订单中<span class="ani_dot">...< ...
最新文章
- python去重复行_python去除文件中重复的行实例
- java B2B2C电子商务平台分析之十一------配置中心和消息总线
- h5ai搭建自己的文件分享程序
- Android弹窗组件工作机制之Dialog、DialogFragment(二)
- linux内核printk调试
- Java Servlet监听器的分类
- jakarta ee_Jakarta EE中的规范范围
- iOS初级开发学习笔记:APP生命周期的学习总结
- 【cocos2d-x从c++到js】12:回调函数1——按键回调
- Golang实践录:工程管理
- cocos2dx-lua 笔记 方向控制 v2
- kali虚拟机安装教程(超详细)
- 计算机基础知识2019题库,2019年计算机基础考试题库(含答案)全
- uart项目验证(一)-uart协议与uart ip的理解
- 18款最佳Bug跟踪管理系统
- 修改webbrower中浏览器版本
- 通过阿里云api获取ecs主机信息
- java使用多态打印个人信息_java 多态 回顾
- SSD学习系列(二)LMDB概念以及将VOC数据集转换成LMDB格式
- DAY 09 Python 操作Excel