2024羊城杯赛题:RUST语言程序逆向实战

admin 2024年12月25日18:37:55评论10 views字数 1526阅读5分5秒阅读模式

实战为主,2024年羊城杯出了一道Rust编写的题目,这里将会以此题目为例,演示Rust逆向该如何去做。

题目名称:sedRust_happyVm

题目内容:unhappy rust, happy vm

公众号后台回复 【h获取题目附件

关于Rust逆向,其实就是看汇编,考验选手的基础逆向能力。在汇编代码面前,任何干扰都会成为摆设。

1、初步分析

64为程序,使用IDA 64打开

2024羊城杯赛题:RUST语言程序逆向实战
通过字符串定位分析点
2024羊城杯赛题:RUST语言程序逆向实战
2024羊城杯赛题:RUST语言程序逆向实战

现在我们知道 inputflag的长度大于 0x15

2024羊城杯赛题:RUST语言程序逆向实战

接下来在汇编层面下一个断点,输入假flag,去观察相关寄存器的值

2024羊城杯赛题:RUST语言程序逆向实战
2024羊城杯赛题:RUST语言程序逆向实战
2024羊城杯赛题:RUST语言程序逆向实战

好像并没有什么内容

2024羊城杯赛题:RUST语言程序逆向实战

继续单步 步过,直到发现下一个要注意的地方!

2024羊城杯赛题:RUST语言程序逆向实战
2024羊城杯赛题:RUST语言程序逆向实战

字符串长度:0x28

我们继续单步步过跟踪

2024羊城杯赛题:RUST语言程序逆向实战

开辟空间的时候,说明快到真正函数处理过程了。

2024羊城杯赛题:RUST语言程序逆向实战
2024羊城杯赛题:RUST语言程序逆向实战
2024羊城杯赛题:RUST语言程序逆向实战
2024羊城杯赛题:RUST语言程序逆向实战

2、分析加密流程

2.1 base64分割模块

这里简单将 3 字节变成4字节的操作,称之为 base64分割模块

这里举个例子

输入的:"111"
->二进制字符串 001100010011000100110001
经过base64分割模块
->001100 010011 000100 110001
2024羊城杯赛题:RUST语言程序逆向实战

发现程序执行完后正好是这样的结果

2024羊城杯赛题:RUST语言程序逆向实战

2.2 组合

2024羊城杯赛题:RUST语言程序逆向实战

举个例子:

假如分割之后的4字节为:

0xC、0x13、0x4、0x31

那么组合后的字符串

rax = 0xC
rcx = 0x1300
edx = 0xB1130C18 
2024羊城杯赛题:RUST语言程序逆向实战

2.3 VM处理模块

2024羊城杯赛题:RUST语言程序逆向实战

发现func3 非常乱

并且频繁调用sub_40A800()

2024羊城杯赛题:RUST语言程序逆向实战

发现这是一道VM类型的题,那么VM的题加密应该会很简单,基本是异或之类。

2024羊城杯赛题:RUST语言程序逆向实战

在 sub_40A800 里面找到 异或,下断点

2024羊城杯赛题:RUST语言程序逆向实战
2024羊城杯赛题:RUST语言程序逆向实战
2024羊城杯赛题:RUST语言程序逆向实战
2024羊城杯赛题:RUST语言程序逆向实战

这个al每经过两次就是秘钥

2024羊城杯赛题:RUST语言程序逆向实战
2024羊城杯赛题:RUST语言程序逆向实战

解题脚本

int main(){
//提取的密文
unsignedchar 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};
//提取的秘钥
unsignedchar 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};

unsignedchar s3[128]={0};

for(int i =0; i <43; i++){
        s3[i]= s1[i]^ s2[i];
}
//还原base64分割模块
char s4[128]={0};
int j =0;
for(int i =0; i <44; i +=4, j +=3){
        s4[j]=(s3[i]<<2)|(s3[i +1]>>4);
        s4[j+1]=(s3[i+1]<<4)|(s3[i +2]>>2);
        s4[j+2]=(s3[i+2]<<6)| s3[i +3];

}

    printf("%s", s4);

return0;

}

2024羊城杯赛题:RUST语言程序逆向实战
学习网安实战技能课程,戳“阅读原文”

原文始发于微信公众号(蚁景网安):2024羊城杯赛题:RUST语言程序逆向实战

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年12月25日18:37:55
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   2024羊城杯赛题:RUST语言程序逆向实战https://cn-sec.com/archives/3552820.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息