题目地址: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相关推荐

  1. Xctf Reverse菜鸟题解之csaw2013reversing2

    Xctf Reverse菜鸟题解之csaw2013reversing2 IDA Pro静态分析 x32dbg动态调试分析 绕过反调试机制 IDA Pro静态分析 x32dbg动态调试分析 绕过反调试机 ...

  2. Bugku,Reverse:马老师杀毒卫士

    扫描后32位 搜索字符,发现散乱的 flag,栅栏密码解决 得到 flag flag{ma_bao_guo_nb!}

  3. 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 ...

  4. 逆向迷宫题总结(持续更新) 2020华南师大CTF新生赛maze,攻防世界新手区:NJUPT CTF 2017,BUUCTF:不一样的flag

    CTF逆向入门:迷宫题学习记录(持续更新) ** 目录 **CTF逆向入门:迷宫题学习记录(持续更新)** (前言) 一. 逆向迷宫题概述 二. 具体题目分析 1. 2019华南师大CTF新生赛maz ...

  5. 剑指offer:面试题06. 从尾到头打印链表

    题目:从尾到头打印链表 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回). 示例 1: 输入:head = [1,3,2] 输出:[2,3,1] 限制: 0 <= 链表长度 & ...

  6. C++中std::reverse和std::reverse_copy的使用

    std::reverse:反转排序容器内指定范围中的元素. std::reverse_copy与std::reverse唯一的区别是:reverse_copy会将结果拷贝到另外一个容器中,而不影响原容 ...

  7. Python 数据类型:列表

    一.列表介绍 1. 列表可以存储一系列的值,使用中括号来定义,每个元素之间用逗号隔开,形如 ['a', 'b', 'c', 'd'] 2. 列表与元组的区别是:列表中的元素是可变的,元组中的元素是不可 ...

  8. 倒置函数reverse的用法

    倒置字符串函数reverse:用于倒置字符串s中的各个字符的位置,如原来字符串中如果初始值为123456,则通过reverse函数可将其倒置为654321,程序如下: #include<stdi ...

  9. css3效果: animate实现点点点loading动画效果(一)

    实现如图所示的点点点loading效果: 一:CSS3 animation实现代码 html代码: 提交订单中<span class="ani_dot">...< ...

最新文章

  1. python去重复行_python去除文件中重复的行实例
  2. java B2B2C电子商务平台分析之十一------配置中心和消息总线
  3. h5ai搭建自己的文件分享程序
  4. Android弹窗组件工作机制之Dialog、DialogFragment(二)
  5. linux内核printk调试
  6. Java Servlet监听器的分类
  7. jakarta ee_Jakarta EE中的规范范围
  8. iOS初级开发学习笔记:APP生命周期的学习总结
  9. 【cocos2d-x从c++到js】12:回调函数1——按键回调
  10. Golang实践录:工程管理
  11. cocos2dx-lua 笔记 方向控制 v2
  12. kali虚拟机安装教程(超详细)
  13. 计算机基础知识2019题库,2019年计算机基础考试题库(含答案)全
  14. uart项目验证(一)-uart协议与uart ip的理解
  15. 18款最佳Bug跟踪管理系统
  16. 修改webbrower中浏览器版本
  17. 通过阿里云api获取ecs主机信息
  18. java使用多态打印个人信息_java 多态 回顾
  19. SSD学习系列(二)LMDB概念以及将VOC数据集转换成LMDB格式
  20. DAY 09 Python 操作Excel

热门文章

  1. Create a PCL visualizer in Qt with QtDesigner
  2. NYOJ 7 街区最短路径问题
  3. 洛谷 P1273 【有线电视网】
  4. QML中MouseArea元素的介绍
  5. 让PHP程序永远在后台运行
  6. “伪基站”任意冒用手机号短信诈骗
  7. 为WPF和Silverlight的Grid添加边框线
  8. 面向对象基础回顾(二)
  9. 头发一周洗几次才适宜? - 生活至上,美容至尚!
  10. ID3DXMesh的数据导出和导入