ctf re 题目 crackini

介绍

题目链接 https://ctf.bugku.com/challenges/detail/id/412.html

该题目动态生成核心的校验代码,因此动态调试比较容易。

write up

大概分析

main 函数中得到输入,给变量addr 分配内存并由 sub_1185函数写入数据。然后执行addr处指令(函数),addr处函数返回0,则成功。

因此,核心是拿到addr处函数。

__int64 __fastcall main(int a1, char **a2, char **a3)
{char s[136]; // [rsp+0h] [rbp-90h] BYREFvoid *addr; // [rsp+88h] [rbp-8h]puts(::s);printf("Enter the license key: ");fgets(s, 128, stdin);s[strcspn(s, "\n")] = 0;addr = mmap(0LL, 0xE2uLL, 7, 33, -1, 0LL);sub_1185((__int64)addr, 0, 0, 1);if ( ((unsigned int (__fastcall *)(char *))addr)(s) )puts("\x1B[1m\x1B[31m[-] Nope, wrong.\x1B[0m");elseputs("\x1B[1m\x1B[32m[+] Well done, that's it!\x1B[0m");munmap(addr, 0xE2uLL);return 0LL;
}

动态调试

gdb下断点到调用addr处第一条指令,使用 x/27i $rip 查看函数指令:

0x7ffff7fbc000: lea -0x7(%rip),%rsi # 0x7ffff7fbc000 │
0x7ffff7fbc007: xor %rcx,%rcx │
0x7ffff7fbc00a: jmp 0x7ffff7fbc00f │
0x7ffff7fbc00c: inc %rcx │
0x7ffff7fbc00f: mov (%rdi,%rcx,1),%al │
0x7ffff7fbc012: test %al,%al │
0x7ffff7fbc014: jne 0x7ffff7fbc00c │
0x7ffff7fbc016: cmp $0x2f,%rcx │ 判断字符串长度是否为0x2f
0x7ffff7fbc01a: jne 0x7ffff7fbc04d │
0x7ffff7fbc01c: xor %rdx,%rdx │ rdx = 0
0x7ffff7fbc01f: xor %rax,%rax │ rax = 0
0x7ffff7fbc022: mov 0x55(%rsi,%rdx,1),%al │  al = rsi + rdx + 0x55
0x7ffff7fbc026: mov 0x84(%rax,%rsi,1),%al │  al = rax + rsi + 0x84
0x7ffff7fbc02d: mov (%rdi,%rdx,1),%bl │ bl = rdi + rdx 
0x7ffff7fbc030: xor %bl,%al │ al = al ^ bl
0x7ffff7fbc032: mov 0xb3(%rdx,%rsi,1),%bl │ bl = rdx + rsi + 0xb3   
0x7ffff7fbc039: cmp %bl,%al │ bl == al?    input_string[i]^ target_rsi_0x84[ target_string_rsi_0x55[i] ] = target_rsi_0xb3[i]
0x7ffff7fbc03b: jne 0x7ffff7fbc04d │ 不相等 return 1
0x7ffff7fbc03d: dec %rcx │ rcx --
0x7ffff7fbc040: inc %rdx │ rdx ++
0x7ffff7fbc043: test %rcx,%rcx │ rcx == 0 ?
0x7ffff7fbc046: jne 0x7ffff7fbc022 │ 继续循环
0x7ffff7fbc048: xor %rax,%rax │
0x7ffff7fbc04b: jmp 0x7ffff7fbc054 │
0x7ffff7fbc04d: mov $0x1,%eax │
0x7ffff7fbc052: jmp 0x7ffff7fbc054 │
0x7ffff7fbc054: ret

逆向算法

校验算法大概是

for(i=0; i<=0x2f; ++i){if (input_string[i]^ target_rsi_0x84[ target_string_rsi_0x55[i] ] != target_rsi_0xb3[i]) return 1;
}
return 0;

查看 rsi + 0x55 处数据:

(gdb) x/47x 0x7ffff7fbc000+0x55                                                                                                       │
0x7ffff7fbc055: 0x0b    0x20    0x04    0x08    0x29    0x1c    0x15    0x11                                                          │
0x7ffff7fbc05d: 0x16    0x18    0x07    0x1e    0x1f    0x26    0x01    0x25                                                          │
0x7ffff7fbc065: 0x23    0x1a    0x06    0x21    0x1d    0x12    0x0f    0x14                                                          │
0x7ffff7fbc06d: 0x09    0x05    0x0d    0x2b    0x0a    0x28    0x10    0x03                                                          │
0x7ffff7fbc075: 0x0c    0x22    0x2c    0x27    0x24    0x02    0x2e    0x19                                                          │
0x7ffff7fbc07d: 0x17    0x2d    0x13    0x1b    0x2a    0x00    0x0e   

同理查看 rsi+0x84 处数据:

(gdb) x/47x 0x7ffff7fbc000+0x84
0x7ffff7fbc084: 0xa2    0x20    0x50    0x04    0xdc    0x48    0x85    0x84
0x7ffff7fbc08c: 0x09    0x47    0xa9    0x30    0x24    0x53    0x81    0xd7
0x7ffff7fbc094: 0x6c    0xde    0xa7    0x8a    0x3b    0x3e    0x02    0xf9
0x7ffff7fbc09c: 0x19    0x14    0xac    0xda    0xbf    0x25    0x36    0x9a
0x7ffff7fbc0a4: 0x69    0x39    0xc8    0x9f    0xc6    0xef    0xaf    0x66
0x7ffff7fbc0ac: 0x9b    0x02    0x35    0xd9    0x2b    0xf2    0xdc

rsi+0xb3处数据:

(gdb) x/47x 0x7ffff7fbc000+0xb3
0x7ffff7fbc0b3: 0x43    0x01    0xb9    0x65    0x6e    0xd2    0x5f    0xaa
0x7ffff7fbc0bb: 0x67    0x6a    0xff    0x66    0xca    0xfb    0x61    0xa7
0x7ffff7fbc0c3: 0xb2    0xfa    0xca    0x7a    0x67    0xe5    0xfa    0x72
0x7ffff7fbc0cb: 0x02    0x09    0x1a    0x9a    0x84    0xaa    0x59    0x51
0x7ffff7fbc0d3: 0x7c    0x9d    0x06    0x54    0x92    0x14    0x93    0x5f
0x7ffff7fbc0db: 0xd4    0xc6    0xcc    0x95    0x77    0xf3    0xfc

写脚本:


# target_string_rsi_0x55
arr1 = [0x0b,0x20 ,   0x04  ,  0x08 ,   0x29 ,   0x1c  ,  0x15  ,  0x11, 0x16  ,  0x18  ,  0x07 ,   0x1e ,   0x1f  ,  0x26,0x01  ,  0x25, 0x23 ,   0x1a ,   0x06 ,   0x21,0x1d  ,  0x12  ,  0x0f   , 0x14
, 0x09  ,  0x05  ,  0x0d   , 0x2b,0x0a   , 0x28  ,  0x10 ,   0x03 , 0x0c  ,  0x22  ,  0x2c,0x27 ,   0x24 ,   0x02  ,  0x2e, 0x19, 0x17, 0x2d, 0x13, 0x1b, 0x2a, 0x00, 0x0e]# target_rsi_0x84
arr2 = [0xa2,0x20,0x50,0x04  ,  0xdc,0x48 ,   0x85,0x84, 0x09  ,  0x47  ,  0xa9,0x30,0x24 ,   0x53  ,  0x81  ,  0xd7,  0x6c ,   0xde   , 0xa7  ,  0x8a   , 0x3b ,   0x3e  ,  0x02 ,   0xf9,
0x19 ,   0x14,0xac ,   0xda   , 0xbf  ,  0x25  ,  0x36 ,   0x9a,0x69   , 0x39  ,  0xc8 ,   0x9f  ,  0xc6  ,  0xef   , 0xaf , 0x66, 0x9b, 0x02, 0x35, 0xd9, 0x2b, 0xf2, 0xdc, 0x43]# target_rsi_0xb3
arr3 = [0x43,0x01,0xb9,0x65,0x6e,0xd2,0x5f,0xaa  , 0x67,0x6a,0xff,0x66,0xca,0xfb,0x61,0xa7 ,  0xb2,0xfa,0xca,0x7a,0x67,0xe5,0xfa,0x72,
0x02,0x09,0x1a,0x9a,0x84,0xaa,0x59,0x51,0x7c,0x9d,0x06,0x54,0x92,0x14,0x93, 0x5f, 0xd4, 0xc6  ,  0xcc  ,  0x95  ,  0x77 ,   0xf3  ,  0xfc ]print((arr1))
print((arr2))
print((arr3))for i in range(0x2f):index = arr1[i]# print(index)print(chr(arr2[index] ^ arr3[i]), end="")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/890656.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【学习总结|DAY023】Java高级技术

大家好&#xff0c;今天我们来聊聊 Java 中的几个高级技术&#xff1a;单元测试、反射、注解和动态代理。这些技术在源码、框架和架构师层面发挥着重要作用&#xff0c;掌握它们能让我们更深入地理解 Java 的底层原理&#xff0c;并提升代码质量和开发效率。 单元测试&#xf…

基于微信小程序的校园访客登记系统

基于微信小程序的校园访客登记系统 功能列表 用户端功能 注册与登录 &#xff1a;支持用户通过手机号短信验证码注册和登录。个人资料管理 &#xff1a;允许用户编辑和更新个人信息及其密码。站内信消息通知&#xff1a;通知公告。来访预约&#xff1a;提交来访预约支持车牌…

极狐GitLab 17.7正式发布,可从 GitLab 丝滑迁移至极狐GitLab【一】

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料&#xff1a; 极狐GitLab 官网极狐…

重温设计模式--观察者模式

文章目录 观察者模式&#xff08;Observer Pattern&#xff09;概述观察者模式UML图作用&#xff1a;实现对象间的解耦支持一对多的依赖关系易于维护和扩展 观察者模式的结构抽象主题&#xff08;Subject&#xff09;&#xff1a;具体主题&#xff08;Concrete Subject&#xf…

技术文档的语言表达:简洁、准确与易懂的平衡艺术

目录 1. 简洁性&#xff1a;去繁从简&#xff0c;避免冗余2. 准确性&#xff1a;确保技术内容的精确传递3. 易懂性&#xff1a;降低门槛&#xff0c;让读者易于理解4. 避免歧义&#xff1a;清晰的表述与上下文5. 适当使用图表和示意图结语 在技术文档的撰写过程中&#xff0c;语…

CH32V307VCT6---工程template创建

一、硬件&#xff1a;沁恒官网申请的CH32V307VCT6开发板 二、开发环境&#xff1a;Mounriver 三、最终效果 1.PB9连接LED1&#xff0c;使其闪烁 2.OLED屏幕显示&#xff1a;软件IIC&#xff0c;PB10----SDA&#xff0c;PB11---SCL 3.工程链接&#xff1a;CH32V307VCT6 lo…

分布式协同 - 分布式事务_2PC 3PC解决方案

文章目录 导图Pre2PC&#xff08;Two-Phase Commit&#xff09;协议准备阶段提交阶段情况 1&#xff1a;只要有一个事务参与者反馈未就绪&#xff08;no ready&#xff09;&#xff0c;事务协调者就会回滚事务情况 2&#xff1a;当所有事务参与者均反馈就绪&#xff08;ready&a…

Anton和Danik的棋局对决

问题描述 Anton和Danik是两位热爱下棋的朋友。他们在一系列对局中一决胜负&#xff0c;每局只有一个赢家&#xff0c;没有平局。现在&#xff0c;Anton想要知道他是否比Danik赢得更多。给定一系列比赛的结果&#xff0c;你的任务是帮助Anton确定谁赢得更多&#xff0c;或者他们…

【软考高级】系统架构设计师复习笔记-精华版

文章目录 前言0 系统架构设计师0.1 考架构还是考系分0.2 架构核心知识0.3 架构教材变化 1 计算机操作系统1.1 cpu 组成1.2 内核的五大功能1.3 流水线技术1.4 段页式存储1.5 I/O 软件1.6 文件管理1.7 系统工程相关 2 嵌入式2.1 嵌入式技术2.2 板级支持包&#xff08;BSP&#xf…

图解HTTP-HTTP报文

参考资料&#xff1a;图解HTTP HTTP报文 用于HTTP协议交互的信息被称为HTTP报文。请求端的HTTP请求报文&#xff0c;响应端&#xff08;服务器端&#xff09;的叫做响应报文。HTTP报文本身是由多行&#xff08;CR LF作为换行符&#xff09;数据行构成的文本。 请求报文及响…

Linux -- 同步与条件变量

目录 同步 条件变量 pthread_cond_t pthread_cond_init&#xff08;初始化条件变量&#xff09; pthread_cond_destroy&#xff08;销毁条件变量&#xff09; pthread_cond_wait&#xff08;线程等待条件变量&#xff09; 重要提醒 pthread_cond_boardcast&#xff08…

【源码编译】windows下mingw64安装以及cmake调用

最近因为安装MIRTK库&#xff0c;太多第三方依赖了&#xff0c;太折磨了&#xff0c;学习了使用Cmake&#xff0c;有些库又需要Fortran编译器&#xff0c;VS2022里面装了但又调用不了&#xff0c;也不知道为什么&#xff0c;最后装的mingw64&#xff0c;记录一下。 1、mingw64安…

6、mysql的MHA故障切换

MHA的含义 MHA&#xff1a;master high availability&#xff0c;建立在主从复制基础上的故障切换的软件系统。 主从复制的单点问题&#xff1a; 当主从复制当中&#xff0c;主服务器发生故障&#xff0c;会自动切换到一台从服务器&#xff0c;然后把从服务器升格成主&…

OSI 网络 7 层模型

问: 请你介绍一下OSI七层网络模型物理层解决什么问题?功能原理问题 数据链路层解决什么问题功能原理 网络层解决的问题功能原理 传输层解决什么问题功能原理会话层解决什么问题功能原理: 表示层解决什么问题 应用层解决什么问题如何展示? 问: 请你介绍一下OSI七层网络模型 物…

LeetCode:104.二叉树的最大深度

跟着carl学算法&#xff0c;本系列博客仅做个人记录&#xff0c;建议大家都去看carl本人的博客&#xff0c;写的真的很好的&#xff01; 代码随想录 LeetCode&#xff1a;104.二叉树的最大深度 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节…

力扣1358. 包含所有三种字符的子字符串数目

给你一个字符串 s &#xff0c;它只包含三种字符 a, b 和 c 。 请你返回 a&#xff0c;b 和 c 都 至少 出现过一次的子字符串数目。 示例 1&#xff1a; 输入&#xff1a;s "abcabc" 输出&#xff1a;10 解释&#xff1a;包含 a&#xff0c;b 和 c 各至少一次的子字…

简单整理下protobuf中常用的几个工具函数

文章目录 前言使用示例定义message结构结构体赋值ByteSizeLong()GetTypeName()DebugString()ShortDebugString()CopyFrom(const MessageLite& other)Clear() Ohters总结 前言 游戏项目中使用protobuf作为双端协议通讯的方式&#xff0c;算是一种中规中矩的方法了&#xff…

信息收集1224

系列博客目录 文章目录 系列博客目录1.针对十张足球图片求出的特征组成的张量&#xff0c;它的秩是不是比十张不同物体特征组成的张量的秩低针对问题的分析&#xff1a;1. 数据的模式和相似性2. 特征的独立性3. 数据的多样性4. 张量分解的数学本质5. 噪声和数据分布的影响结论 …

WebRTC服务质量(12)- Pacer机制(04) 向Pacer中插入数据

WebRTC服务质量&#xff08;01&#xff09;- Qos概述 WebRTC服务质量&#xff08;02&#xff09;- RTP协议 WebRTC服务质量&#xff08;03&#xff09;- RTCP协议 WebRTC服务质量&#xff08;04&#xff09;- 重传机制&#xff08;01) RTX NACK概述 WebRTC服务质量&#xff08;…

双指针——快乐数

一.题目描述 202. 快乐数 - 力扣&#xff08;LeetCode&#xff09; 二.题目解析 我们要判断一个数是不是快乐数要通过它的三个性质来进行判断。这个数会一直变化&#xff0c;由它的各个位的平方和重新构成这个数。如果这个数在变化的过程中变成了1&#xff0c;那么就是快乐数…