实战为主,近日2024年羊城杯出了一道Rust编写的题目,这里将会以此题目为例,演示Rust逆向该如何去做。
题目名称:sedRust_happyVm
题目内容:unhappy rust, happy vm
关于Rust逆向,其实就是看汇编,考验选手的基础逆向能力。在汇编代码面前,任何干扰都会成为摆设。
1、初步分析
64为程序,使用IDA 64打开
通过字符串定位分析点
现在我们知道 inputflag的长度大于 0x15
接下来在汇编层面下一个断点,输入假flag,去观察相关寄存器的值
好像并没有什么内容
继续单步 步过,直到发现下一个要注意的地方!
字符串长度:0x28
【—-帮助网安学习,以下所有学习资料免费领!加vx:dctintin,备注 “博客园” 获取!】
① 网安学习成长路径思维导图
② 60+网安经典常用工具包
③ 100+SRC漏洞分析报告
④ 150+网安攻防实战技术电子书
⑤ 最权威CISSP 认证考试指南+题库
⑥ 超1800页CTF实战技巧手册
⑦ 最新网安大厂面试题合集(含答案)
⑧ APP客户端安全检测指南(安卓+IOS)
我们继续单步步过跟踪
开辟空间的时候,说明快到真正函数处理过程了。
2、分析加密流程
2.1 base64分割模块
这里简单将 3 字节变成4字节的操作,称之为 base64分割模块
这里举个例子
输入的:"111"
->二进制字符串 001100010011000100110001
经过base64分割模块
->001100 010011 000100 110001
发现程序执行完后正好是这样的结果
2.2 组合
举个例子:
假如分割之后的4字节为:
0xC、0x13、0x4、0x31
那么组合后的字符串
rax = 0xC
rcx = 0x1300
edx = 0xB1130C18
2.3 VM处理模块
发现func3 非常乱
并且频繁调用sub_40A800()
发现这是一道VM类型的题,那么VM的题加密应该会很简单,基本是异或之类。
在 sub_40A800 里面找到 异或,下断点
这个al每经过两次就是秘钥
解题脚本
int main() {
//提取的密文
unsigned char s1[] = { 0x00,0x82,0x11,0x92,0xa8,0x39,0x82,0x28,0x9a,0x61,0x58,0x8b,0xa2,0x43,0x68,0x89,0x4,0x8f,0xb0,0x43,0x49,0x3a,0x18,0x39,0x72,0xc,0xba,0x76,0x98,0x13,0x8b,0x46,0x33,0x2b,0x25,0xa2,0x8b,0x27,0xb7,0x61,0x7c,0x3f,0x58 };
//提取的秘钥
unsigned char s2[] = { 0x18,0xb1,0x9,0xa4,0xa6,0x2a,0x9e,0x1b,0x96,0x57,0x5d,0xad,0xae,0x75,0x65,0xac,0x9,0x8c,0xa0,0x76,0x47,0x2c,0x10,0x1,0x7c,0xf,0xba,0x47,0x95,0x30,0x9b,0x74,0x3f,0x2d,0x2d,0x9a,0x87,0x31,0xba,0x43,0x70,0x2c,0x4c };
unsigned char s3[128] = { 0 };
for (int i = 0; i > 4);
s4[j+1] = (s3[i+1] > 2);
s4[j+2] = (s3[i+2]
更多网安技能的在线实操练习,请点击这里>>
1.本站内容仅供参考,不作为任何法律依据。用户在使用本站内容时,应自行判断其真实性、准确性和完整性,并承担相应风险。
2.本站部分内容来源于互联网,仅用于交流学习研究知识,若侵犯了您的合法权益,请及时邮件或站内私信与本站联系,我们将尽快予以处理。
3.本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
4.根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”您需知晓本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24个小时之内从您的电脑中彻底删除上述内容,否则后果均由用户承担责任;如果您访问和下载此文件,表示您同意只将此文件用于参考、学习而非其他用途,否则一切后果请您自行承担,如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
5.本站是非经营性个人站点,所有软件信息均来自网络,所有资源仅供学习参考研究目的,并不贩卖软件,不存在任何商业目的及用途
暂无评论内容