ida81输入密码验证算法分析以及破解思路

news2024/11/17 17:54:35

本文分析了ida81对输入密码的验证流程,分别对输入密码到生成解密密钥、密码素材的生成过程以及文件数据的加密过程这三个流程进行分析,并尝试找一些可利用的破绽。很遗憾,由于水平有限,目前也只是有个思路未能完全实现,故分享出来抛砖引玉。

1. 密码验证算法

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

proc m4ZQu {password LZQjH} {

    set ::maui::util::H6VeX ""

    set ::maui::util::EL0BW [string repeat \\0 32]

    package require tcltwofish

    package require sha256

    if {[string length $LZQjH] == 0} {

        error "Unable to initialize encryption - missing essential data"

    }

     

    //1.展开payload 获取相关参数

    if {[binary scan $LZQjH Ia16a32a64a32a* times iv passwordKey encryptedKey payloadIVsHash encryptedPayloadIVs] < 6} {

        error "Unable to initialize encryption - header missing or corrupt"

    }

    //2.使用输入的密码计算sha256,然后根据迭代次数times加密passwordkey,最后计算结果的sha256

    set iHcWR [a64bL $password $passwordKey $iv $times]

     

    //3.取上一步中的后32字节

    set BJvoG [string range [tcltwofish::decrypt $iHcWR $encryptedKey] 32 63]

     

    //4.使用上一步中的结果作为key 循环times/64次 解密encryptedPayloadIVs

    //这一步没有指定iv 实际过程为16个字节的0x00

    for {set 0} {$i < $times} {incr i 64} {

        set encryptedPayloadIVs [tcltwofish::decrypt $BJvoG $encryptedPayloadIVs]

    }

    //5.获取32字节后的数据

    set ZQpQw [string range $encryptedPayloadIVs 32 end]

    //6.计算上一步结果的sha256,和预置的hash比对,一致则密码正确

    if {[sha2::sha256 -bin $ZQpQw] != $payloadIVsHash} {

        maui::d_RUj "Invalid payload password"

    }

     

    //7.使用第五步中的结果作为后续选取iv的数据

    set ::maui::util::H6VeX $ZQpQw

    //8.使用第三步中的结果作为密钥

    set ::maui::util::EL0BW $BJvoG

}

在这个过程中,第一步需要的payload为4020字节,这是已知的。意味着可以获取到第六步中正确的hash结果。
然而,根据下面的帖子总结,ida的密码选取字符为58个,密码长度为14个字符,这个测试结果是非常大的。
破密行動: 以不尋常的角度破解 IDA Pro 偽隨機數 | DEVCORE 戴夫寇爾
[下载] ida 8.1-资源下载-看雪-安全社区|安全招聘|kanxue.com

而我在i9-13900K测试从随机生成输入密码到第六步验证hash整个过程,测试一个密码就需要0.045秒。所以手里有超算也不建议直接爆破。

2. 密码素材的生成过程

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

//根据输入密码生成payload

proc yOZ7q {password {times 16000}} {

        set ::maui::util::H6VeX ""

        set ::maui::util::EL0BW [string repeat \\0 32]

        package require tcltwofish

        package require sha256

         

        set BJvoG [qA4kM 32]

        set passwordKey [qA4kM 32]

        set ZQpQw [qA4kM [expr {16 * 256}]]

        set payloadIVsHash [sha2::sha256 -bin $ZQpQw]

        set encryptedPayloadIVs "[qA4kM 32]$ZQpQw"

        for {set 0} {$i < $times} {incr i 64} {

            set encryptedPayloadIVs [tcltwofish::encrypt $BJvoG $encryptedPayloadIVs]

        }

        set iv [qA4kM 16]

        set iHcWR [a64bL $password $passwordKey $iv $times]

         

        set encryptedKey [tcltwofish::encrypt $iHcWR "[qA4kM 32]$BJvoG"]

        set LZQjH [binary format Ia16a32a64a32a* $times $iv $passwordKey $encryptedKey $payloadIVsHash $encryptedPayloadIVs]

        set ::maui::util::H6VeX $ZQpQw

        set ::maui::util::EL0BW $BJvoG

         

        return $LZQjH

    }

//生成随机数据

 proc qA4kM {length} {

        set YKL8w ""

        if {[RLPut unix]} {

            foreach xML4B {/dev/urandom /dev/random} {

                if {[catch {

                    set WyLEv [open $xML4B r]

                    fconfigure $WyLEv -translation binary

                    set YKL8w [read $WyLEv $length]

                    close $WyLEv

                }]} {

                    catch {close $WyLEv}

                }  else  {

                    break

                }

            }

        }  else  {

         

        }

        if {[string length $YKL8w] != $length} {

            incr length -[string length $YKL8w]

            while {$length >= 2} {

                append YKL8w [binary format S [expr {int([maui::util::rand] * 0x10000)}]]

                incr length -2

            }

            if {$length > 0} {

                append YKL8w [binary format c [expr {int([maui::util::rand] * 0x100)}]]

            }

        }

        return $YKL8w

    }

    proc rand {} {

        if {[maui::util::RLPut "windows"] && [info commands ::bitrock::secure::rand_s] != ""} {

            if {[catch {

                set r [::bitrock::secure::rand_s]

            } V77Ls]} {

                maui::util::debug "failed to call rand_s: $V77Ls"

                set r [expr {rand()}]

            }

        else {

            set r [expr {rand()}]

        }

        return $r

    }

继续分析输入密码的时生成payload的算法,根据安装密码生成payload的过程中,很多数据包括最后解密数据用的密钥BJvoG也是随机生成的,如果这部分随机数生成流程能复现那也是可以破解的。仔细看随机数的生成,已经排除了以前的LCG随机数生成算法,换成了更安全的,前后状态无影响的方式,linux或unix下用/dev/random或者/dev/urandom,windows下调用rand_s。
rand_s | Microsoft Learn

3. 文件数据加密流程

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

proc MmyBM {compressionAlgorithm command data} {

        if {[catch {

            //1.压缩数据

            if {($compressionAlgorithm == "lzma") || ($compressionAlgorithm == "lzma-ultra") || ($compressionAlgorithm == "lzham") || ($compressionAlgorithm == "lzham-ultra")} {

                set data [eval [concat $command [list $data]]]

            }  else  {

                set data [vfs::zip -mode compress -nowrap 1 $data]

            }

            //2.1 前面添加四个字节的长度,然后末尾补全32的倍数

            //2.2 前面添加32字节的随机数据

            set data [qA4kM 32][UOijU $data 32

            //3.在H6VeX中截取16字节的iv

            set PG2JA [expr {int([maui::util::rand] * 0x100)}]

            set iv [string range $::maui::util::H6VeX [expr {$PG2JA * 16}] [expr {$PG2JA * 16 + 15}]]

            //4.计算crc32

            set hbA8n [format 0x%08x [expr {[zlib crc32 $data] & 0xffffffff}]]

             

            //5.使用EL0BW中的数据作为key 加密

            set data [tcltwofish::encrypt $::maui::util::EL0BW $data iv]

             

            //6. 前面填充四个字节的crc32以及选取iv的位置,共加了五个字节

            set YKL8w [binary format Ica* $hbA8n $PG2JA $data]

        } V77Ls]} {

            set ykaki $::errorCode

            set qXoNi $::errorInfo

            maui::util::debug "encryptPayload: error encrypting: $V77Ls"

            error $V77Ls $qXoNi $ykaki

        }

        return $YKL8w

    }

1

2

3

4

5

6

7

8

9

proc UOijU {data DeSRF} {

    //1. 将四字节的长度添加在数据前

    set data [binary format Ia* [string length $data] $data]

    //2. 计算末尾添加padding的长度

    set add [expr {($DeSRF - ([string length $data] % $DeSRF)) % $DeSRF}]

    //3. 生成随机padding并附加在末尾

    append data [qA4kM $add]

    return $data

}

再看看文件数据的加密流程。从上面的脚本中,可以看到加密前的数据结果为 32字节随机数据+4字节数据+$data+最后补全32字节的padding 然后使用twofish进行加密。而twofish是分组加密算法,所以加密过程就是下面这样的

通过在前面添加32字节的随机数据,猜测是为了避免明文攻击。因为很多文件前面都有固定字节的数据

比如sqlite3数据库的前16字节固定为SQLite format 3\x00,在ECB模式下,相同密钥加密任何sqlite3数据库的前16个字节都是一样的。所以衍生出了CBC模式,在每个分组加密之前用iv或者上一个密文分组异或明文以产生不一样的数据。

然而,这个例子中前面32个字节的随机数的使用却颇有点画蛇添足的味道。
首先,它不能掩盖明文数据或者阻止明文攻击(稍后提到),其次因为这32字节的加密数据,我们在后面进行密码分析的时候可以忽略了原本的初始iv,初始iv来自哪里,来自输入密码后进行的16000次twofish加密和256次twofish解密后生成的0x1000字节的encryptedPayloadIVs,而现在却可以跳过了,从而暴露了它的阿克琉斯之踵。根据密码算法,现在解密每一段文件数据时只需要从第三个分组的数据开始解密即可,输入iv来源于上一个分组的的密文(即第二个分组),输入的key对所有文件都是一样的(也就是本次要分析出来的目标)。

再回头说说有哪些明文,从脚本可知加密的第三个分组前四个字节为加密数据的长度。在安装过程中会生成installbuilder_installer_{random}.log文件,统计生成的文件数。

 

在hook解密函数的过程中也发现了同样数量的加密数据,而这些数据中最小长度为0x000012a0,最大为0x00040060。所以这1212个文件在相同的密钥解密之后的前四个字节肯定是
00 0x xx xx。如果能将每段加密数据对应到具体的文件,可能还会有更多的明文信息。

综上所述,根据解密的tcl安装脚本共分析了三种破解思路:
第一种,根据输入密码爆破,工作量太大,PC上几乎不可能成功。
第二种,随机数攻击。新版本的安装程序摒弃了LCG算法的使用,使用了更加安全的随机数生成方式。
第三种,根据部分明文信息和1212个样本数据爆破32字节密钥,爆破的过程中每次验证只需要一次twofish解密16个字节即可。再配合密码差分分析,可以减少一定的尝试次数。有熟悉angr的大佬也可以尝试一下形式化验证的方式去破解。

另外,ida安装脚本中的twofish算法来源于https://github.com/rageworx/libtwofish
,但是作了一些修改。文末附带校正后的版本,可以直接用。另外还有调试时用的frida脚本。

 

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

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

相关文章

查看当前cmake版本支持哪些版本的Visual Studio

不同版本的的cmake对Visual Studio的版本支持不同&#xff0c;以下图示展示了如何查看当前安装的cmake支持哪些版本的Visual Studio。 1.打开cmake-gui 2.查看cmake支持哪些版本的Visual Studio

28. 使用 k8e 玩转 kube-vip with Cilium‘s Egress Gateway 特性

因为在私有云环境下,我们需要保障集群服务 APIServer地址的高可用,所以提供的方案就是使用一个 VIP 让 API Server 的流量可以负载均衡的流入集群。另外,kube-vip 还支持 Service LB,方便SVC 服务的负载均衡,结合 cilium Egress Gateway 特性可以做到集群内的容器对外访问…

canvas绘制刮涂层抽奖效果

实现的效果&#xff1a;主要用到画布设置图层覆盖效果globalCompositeOperation属性 实现的源代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"…

canvas常用的几种重叠绘图设置globalCompositeOperation

globalCompositeOperation描述了2个图形交叉的时候是什么样子&#xff0c;它的值有很多&#xff0c;这里就盗一张很经典的图&#xff1a; 我们来看一个source-in的例子吧&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset&q…

论文-分布式-并发控制-Lamport逻辑时钟

目录 前言 逻辑时钟讲解 算法类比为面包店内取号 Lamport算法的时间戳原理 Lamport算法的5个原则 举例说明 算法实现 参考文献 前言 在并发系统中&#xff0c;同步与互斥是实现资源共享的关键Lamport面包店算法作为一种经典的解决并发问题的算法&#xff0c;它的实现原…

VTM/VVC 编译与测试-- YUV与RGB空间转换

环境配置:ubuntu 18.04 一、VVC测试 软件下载: 官网下载 VVC:http://jvet.hhi.fraunhofer.de/ 这里可以选择版本。 编译工具: 在开始编译前,需要电脑的环境中中有gcc、g++、cmake、make这四个工具。 sudo apt-get install gcc g++ sudo apt-get install cmake sudo …

Android微信逆向--实现发朋友圈动态

Android微信逆向--实现发朋友圈动态 0x0 前言# 最近一直在研究Windows逆向的东西&#xff0c;想着快要把Android给遗忘了。所以就想利用工作之余来研究Android相关的技术&#xff0c;来保持对Android热情。调用微信代码来发送朋友圈动态一直是自己想实现的东西&#xff0c;研…

Internet Download Manager 逆向分析

写在前面 文章仅供学习&#xff0c;切勿用于商业用途&#xff0c;出于版权原因&#xff0c;文章不提供资源下载。 论坛上较早之前已经有前辈对IDM的序列号算法进行过逆向分析 以及最近有师傅尝试对本篇文章对象相同的版本进行了逆向分析&#xff0c;但是比较遗憾的是该文章并…

瑞萨e2studio(26)----SPI驱动TFT-LCD屏

瑞萨e2studio.26--SPI驱动TFT-LCD屏 概述视频教学csdn课程样品申请完整代码下载屏幕接口接线方式新建工程工程模板保存工程路径芯片配置工程模板选择时钟配置开始SPI配置SPI属性配置IO配置头文件定义回调函数lcd_init.clcd.c设置区域颜色显示字符串显示汉字显示图片结果演示 概…

点击查看详情 | 网页版微信客户管理系统如何操作试用?

微信作为我们日常生活中最常用的社交应用之一&#xff0c;早已成为我们与朋友、家人和同事保持联系的重要工具&#xff0c;也是营销引流的重要平台。 通过微信营销&#xff0c;可以比较精准定向亲近用户。而微信的功能并没有很能满足做微信营销的人群&#xff0c;所以我们需要借…

S5PV210裸机(五):定时器

本文主要探讨210定时器相关知识&#xff0c;210定时器主要包含PWN定时器&#xff0c;系统定时器&#xff0c;看门狗&#xff0c;RTC。 PWM定时器 210有5个PWM定时器,timer0、1、2、3通过对应PIO产生PWM波形信号并输出,timer4没有GPIO只产生内部定时器中断 PWM…

Python 安装CSF(布料模拟滤波)的环境配置

一、环境配置 1.1 下载源码: Github下载CSF库源码 1.2 解压文件如下: 二、安装CSF库 2.1在解压文件中找到python文件夹所在目录 2.2 输入cmd并回车,来打开终端窗口 2.3激活虚拟环境 通过: activate +你的虚拟环境名称。来激活安装CSF库的虚拟环境。【不执行此

k8s镜像加devops

展示 1.配套资料2.devops 3.elk日志收集 4.grafana监控 5.dashboard![在这里插入图片描述](https://img-blog.csdnimg.cn/bf294f9fd98e4c038858a6bf5c34dbdc.png 目的 学习k8s来来回回折腾很久了&#xff0c;光搭个环境就能折腾几天。这次工作需要终于静下心来好好学习了一…

【USMA】N1CTF2022-praymoon

前言 本题主要利用 USMA 解题&#xff0c;当然还有其他做法&#xff0c;暂时不表 程序分析 启动脚本就不看了&#xff0c;该开的保护都开了。看下文件系统初始化脚本&#xff1a; #!/bin/shmkdir /tmp mount -t proc none /proc mount -t sysfs none /sys mount -t devtmpf…

codeforces (C++ Haunted House)

题目&#xff1a; 翻译&#xff1a; 思路&#xff1a; 1、由题目可知&#xff0c;他想让我们判断交换相邻字符位置后将二进制转为十进制后&#xff0c;能否整除2的次方。能整除即输出需要交换的次数&#xff0c;不能则输出-1。&#xff08;例&#xff1a;输入3和010这组数据就…

二分查找:如何快速定位IP对应的省份地址?

文章来源于极客时间前google工程师−王争专栏。 通过IP地址查找IP归属地功能&#xff1a; 这个功能是通过维护一个很大的IP地址库来实现。地址库中包含IP地址范围和归属地的对应关系。 当我们查询202.201.133.13这个IP地址归属地时&#xff0c;在地址库中搜索&#xff0c;这个…

真实感受:是智能家居在选择合适的技术!

科技从来都是为了让我们的生活更加的简单、舒适&#xff0c;而智能家居的智能&#xff0c;体现在如何更更更方便的使用我需要控制的家居。 例如&#xff1a;下班躺在床上想休息&#xff0c;房间和大厅的灯还开着&#xff0c;这时你会选择什么产品躺着解决问题&#xff1f; 红外…

【MySQL】逻辑架构

逻辑架构 逻辑架构剖析服务器处理客户端请求连接层服务层SQL Interface : SQL接口Parser : 解析器Optimizer : 查询优化器Caches&Buffers : 查询缓存组件 引擎层存储层 SQL执行流程MySQL查询流程查询缓存解析器词法分析语法分析 优化器执行器 数据库缓冲池 逻辑架构剖析 服…

云安全—责任共担

0x00 前言 云安全的职责范围实际上一直遵循的是&#xff0c;谁提供谁负责&#xff0c;如果交付给云消费者的时候&#xff0c;交付者使用过程中就要自行负责&#xff0c;也就是我们经常遇到的配置不当等问题&#xff0c;在三层服务模式中&#xff0c;责任互相嵌套&#xff0c;最…

软件测试(五)自动化 selenium

文章目录 自动化测试单元测试&#xff1a;单元测试&#xff1a;UI自动化 selenium工具定义特点&#xff1a;原理&#xff1a;seleniumjava环境搭建SeleniumAPI获取测试结果&#xff1a;添加等待浏览器操作键盘事件鼠标事件多层框架/窗口定位下拉框处理弹窗处理上传文件操作关闭…