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,一经查实,立即删除!

相关文章

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

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

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

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

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…

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

文章目录 前言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;然后把从服务器升格成主&…

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

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

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;那么就是快乐数…

【玩转OCR】 | 腾讯云智能结构化OCR在多场景的实际应用与体验

文章目录 引言产品简介产品功能产品优势 API调用与场景实践图像增强API调用实例发票API调用实例其他场景 结语相关链接 引言 在数字化信息处理的时代&#xff0c;如何高效、精准地提取和结构化各类文档数据成为了企业和政府部门的重要需求。尤其是在面对海量票据、证件、表单和…

nginx-rtmp服务器搭建

音视频服务器搭建 本文采用 nginx/1.18.0和nginx-rtmp-module模块源代码搭建RTMP流媒体服务器 流程 查看当前服务器的nginx版本下载nginx和nginx-rtmp-module源代码重新编译nginx&#xff0c;并进行相关配置&#xff08;nginx.conf、防火墙等&#xff09;客户端测试连接测试搭…

借助Aspose.html控件, 使用 Java 编程将 HTML 转换为 BMP

Aspose.HTML for .NET 不仅提供超文本标记语言 ( HTML ) 文件处理&#xff0c;还提供流行图像文件格式之间的转换。您可以利用丰富的渲染和转换功能将SVG文件渲染为PNG、JPG或其他广泛使用的文件格式。但是&#xff0c;我们将使用此C# 图像处理库以编程方式在 C# 中将 SVG 转换…

区块链期末复习1.1:密码学哈希函数

一、哈希函数应该具备的三个特性 1.输入可以为任意长度的字符串 2.产生固定大小输出&#xff08;比如256位&#xff09; 3.能进行有效计算。对于n位字符串&#xff0c;可以在O(n)的时间内计算出哈希值。 二.加密哈希函数的三个特性 1.collision-resistance(碰撞阻力&#x…

华为:数字化转型只有“起点”,没有“终点”

上个月&#xff0c;我收到了一位朋友的私信&#xff0c;他询问我是否有关于华为数字化转型的资料。幸运的是&#xff0c;我手头正好收藏了一些&#xff0c;于是我便分享给他。 然后在昨天&#xff0c;他又再次联系我&#xff0c;并感慨&#xff1a;“如果当初我在进行企业数字…

Android基于Path的addRoundRect,Canvas剪切clipPath简洁的圆形图实现,Kotlin(2)

Android基于Path的addRoundRect&#xff0c;Canvas剪切clipPath简洁的圆形图实现&#xff0c;Kotlin&#xff08;2&#xff09; import android.content.Context import android.graphics.BitmapFactory import android.graphics.Canvas import android.graphics.Path import a…

中化信息与枫清科技深化合作:共探“AI+”产业新生态

随着数字化转型的浪潮席卷全球&#xff0c;数据已成为推动创新和经济增长的关键力量。为持续深化数据要素价值挖掘与应用实践&#xff0c;推动打造行业交流平台&#xff0c;驱动产业创新共荣&#xff0c;2024 年 12 月 18 日 -19 日&#xff0c;由中国通信标准化协会主办的“20…

Matrix-Breakout 2 Morpheus

第一步 信息收集 (1)寻找靶场真实ip arp-scan -l 靶场真实 ip 为192.168.152.154 (2)探测端口及服务 nmap -p- -sV 192.168.52.135 第二步 开始渗透 (1)访问web服务 http://192.168.152.154and http://192.168.52.135:81 发现 81 端口的页面要登录 我们使用 dirb 扫描…