杂谈 · 2024年7月26日

GOM Player Overflow复现

前文见https://www.z1r0.top/2024/07/06/GOM-Player-2-3-90-5360-Buffer-Overflow/

GOM Player 2.3.90.5360 – Buffer Overflow

# Software Link: https://cdn.gomlab.com/gretech/player/GOMPLAYERGLOBALSETUP_NEW.EXE
#  - Open GOM Player
#  - Click on the gear icon above to open settings
#  - From the meu that appears, select Audio   //preference::Audio
#  - Click on Equalizer 
#  - Click on the plus sign to go to the "Add EQ preset" screen
#  - Copy the contents of exploit.txt and paste it into the preset name box, then click OK
#  - Crashed!

正向分析思路

通过观察软件界面以及poc可知在此处注入

字符串中搜索Preference::Audio

进一步基本可以确定是Preference::Audio::CPrefPageEQ

前两个就是虚函数表 vftable

AI一下这些字符串什么意思

您提供的文本看起来像是从C++程序的内存转储中提取的C++运行时类型信息(RTTI,Runtime Type Information)的数据。RTTI是C++的一个特性,它允许程序在运行时识别对象的类型。这在多态性、异常处理和某些类型的调试中非常有用。

下面是对您提供的RTTI数据的解释:

    RTTI Base Class Array (00C2B1D4): 这通常是一个指针数组,包含了一个类的所有直接基类的类型信息。每个指针指向一个基类的类型描述符。
    RTTI Base Class Descriptor (00C2B1F0): 这是基类描述符的地址,它包含了基类的一些信息,比如基类在派生类中的偏移量、访问权限等。(0,-1,0,64)可能是描述符中的一些特定字段,但具体含义需要结合上下文来理解。
    RTTI Class Hierarchy Descriptor (00C2B20C): 这个描述符包含了类继承层次的信息,比如直接基类的数量和类型。
    RTTI Complete Object Locator (00C2B21C 和 00C2B230): 这是一个指向完整对象定位器(Complete Object Locator,COL)的指针。COL是一个结构,用于确定对象在内存中的位置,特别是在包含虚继承的情况下。它包含了指向最派生类类型的指针、指向基类描述符的指针、基类在对象中的偏移量等信息。
    RTTI Type Descriptor (00CDEA08): 这是类型描述符的地址,它包含了类的名称、属性、方法等信息。它是RTTI系统中用于识别和区分不同类型对象的核心部分。
Preference::Audio::CPrefPageEQ 看起来像是一个类名,它可能是一个设置界面的类,属于音频偏好设置的一部分。这个类可能包含了一些用于音频设置的页面或控件。

vftable代表虚函数表(Virtual Function Table),它是实现多态性的关键机制之一。每个具有虚函数的类都会有一个与之关联的虚函数表,用于在运行时确定应该调用哪个函数。
这里是对vftable的详细解释:

    虚函数表(vftable):是一个或多个函数指针的数组,每个指针指向类的虚函数实现。当一个类包含虚函数时,编译器会自动为这个类生成一个虚函数表。
    vftable的用途:当你调用一个虚函数时,程序会查找对象的虚函数表来确定应该调用哪个函数。这是多态性的基础,允许你通过基类指针或引用调用派生类重写的函数。
    vftable的布局:通常,虚函数表的第一个条目是一个指向类型信息的指针,这个类型信息用于支持RTTI。随后的条目是类中定义的虚函数的地址。
    vftable的地址:在你提供的例子中,Preference::Audio::CPrefPageEQ::vftable'可能表示CPrefPageEQ`类的虚函数表的地址。这个地址可以用于调试目的,例如检查类的多态性行为。
    vftable的实现:编译器会为每个具有虚函数的类生成一个唯一的虚函数表。如果一个类派生自另一个类,并且重写了虚函数,那么它的虚函数表将包含这些重写函数的地址。
    vftable和继承:在有继承的情况下,派生类的vftable可能包含指向基类vftable的指针,确保可以正确地调用基类的虚函数

进一步分析vftable

.rdata:00BA1674                 dd offset ??_R4CPrefPageEQ@Audio@Preference@@6B@ ; const Preference::Audio::CPrefPageEQ::RTTI Complete Object Locator' .rdata:00BA1678 ; const Preference::Audio::CPrefPageEQ::vftable'
.rdata:00BA1678 ??_7CPrefPageEQ@Audio@Preference@@6B@ dd offset sub_606040
.rdata:00BA1678                                         ; DATA XREF: sub_606640+3B↑o
.rdata:00BA1678                                         ; EQ_vftable_1+2A↑o
.rdata:00BA167C                 dd offset EQ_vftable_2
.rdata:00BA1680                 dd offset nullsub_3
.rdata:00BA1684                 dd offset sub_909C7E
.rdata:00BA1688                 dd offset sub_906191
.rdata:00BA168C                 dd offset sub_9CE258
.rdata:00BA1690                 dd offset sub_464630
.rdata:00BA1694                 dd offset sub_45DA00
.rdata:00BA1698                 dd offset sub_45DA00
.rdata:00BA169C                 dd offset sub_909C76
.rdata:00BA16A0                 dd offset sub_5F42B0
.rdata:00BA16A4                 dd offset sub_909C4C
.rdata:00BA16A8                 dd offset sub_909C58
.rdata:00BA16AC                 dd offset sub_909C52
.rdata:00BA16B0                 dd offset sub_90566E
.rdata:00BA16B4                 dd offset sub_909C5E
.rdata:00BA16B8                 dd offset sub_9665C8
.rdata:00BA16BC                 dd offset sub_464630
.rdata:00BA16C0                 dd offset sub_464630
.rdata:00BA16C4                 dd offset sub_464630
.rdata:00BA16C8                 dd offset nullsub_2
.rdata:00BA16CC                 dd offset sub_904B60
.rdata:00BA16D0                 dd offset sub_904C9B
.rdata:00BA16D4                 dd offset sub_904CDF
.rdata:00BA16D8                 dd offset sub_904E53
.rdata:00BA16DC                 dd offset sub_9073CF
.rdata:00BA16E0                 dd offset sub_9048B1
.rdata:00BA16E4                 dd offset sub_905674
.rdata:00BA16E8                 dd offset sub_907D8C
.rdata:00BA16EC                 dd offset sub_9068A3
.rdata:00BA16F0                 dd offset sub_464630
.rdata:00BA16F4                 dd offset sub_90824B
.rdata:00BA16F8                 dd offset sub_905B31
.rdata:00BA16FC                 dd offset sub_9081F9
.rdata:00BA1700                 dd offset sub_904B59
.rdata:00BA1704                 dd offset sub_90508A
.rdata:00BA1708                 dd offset sub_9060F1
.rdata:00BA170C                 dd offset sub_9050B2
.rdata:00BA1710                 dd offset sub_909355
.rdata:00BA1714                 dd offset sub_908E0E
.rdata:00BA1718                 dd offset sub_908D6C
.rdata:00BA171C                 dd offset sub_9092B3
.rdata:00BA1720                 dd offset sub_9095D5
.rdata:00BA1724                 dd offset sub_908F56
.rdata:00BA1728                 dd offset sub_9093EB
.rdata:00BA172C                 dd offset sub_909523
.rdata:00BA1730                 dd offset sub_90908E
.rdata:00BA1734                 dd offset sub_909149
.rdata:00BA1738                 dd offset sub_909201
.rdata:00BA173C                 dd offset sub_908FF8
.rdata:00BA1740                 dd offset sub_90948D
.rdata:00BA1744                 dd offset sub_908EA4
.rdata:00BA1748                 dd offset sub_908C49
.rdata:00BA174C                 dd offset sub_908AD7
.rdata:00BA1750                 dd offset sub_908B9E
.rdata:00BA1754                 dd offset sub_908A1A
.rdata:00BA1758                 dd offset sub_908978
.rdata:00BA175C                 dd offset sub_9096B5
.rdata:00BA1760                 dd offset sub_9096B5
.rdata:00BA1764                 dd offset sub_907DA7
.rdata:00BA1768                 dd offset sub_904BA9
.rdata:00BA176C                 dd offset sub_905E85
.rdata:00BA1770                 dd offset sub_9066CF
.rdata:00BA1774                 dd offset sub_905848
.rdata:00BA1778                 dd offset nullsub_3
.rdata:00BA177C                 dd offset sub_449CB0
.rdata:00BA1780                 dd offset sub_449CA0
.rdata:00BA1784                 dd offset sub_90743B
.rdata:00BA1788                 dd offset sub_90AAB7
.rdata:00BA178C                 dd offset sub_9082C0
.rdata:00BA1790                 dd offset sub_906ABF
.rdata:00BA1794                 dd offset sub_904DD5
.rdata:00BA1798                 dd offset nullsub_2
.rdata:00BA179C                 dd offset sub_905E38
.rdata:00BA17A0                 dd offset sub_906916
.rdata:00BA17A4                 dd offset sub_464DA0
.rdata:00BA17A8                 dd offset sub_A10AD5
.rdata:00BA17AC                 dd offset sub_464DB0
.rdata:00BA17B0                 dd offset sub_4A9F70
.rdata:00BA17B4                 dd offset sub_4A9F70
.rdata:00BA17B8                 dd offset sub_48B260
.rdata:00BA17BC                 dd offset sub_464DB0
.rdata:00BA17C0                 dd offset sub_9665C8
.rdata:00BA17C4                 dd offset sub_45DA00
.rdata:00BA17C8                 dd offset sub_904C67
.rdata:00BA17CC                 dd offset sub_904C81
.rdata:00BA17D0                 dd offset sub_464630
.rdata:00BA17D4                 dd offset sub_45DA00
.rdata:00BA17D8                 dd offset sub_606DD0
.rdata:00BA17DC                 dd offset sub_607270
.rdata:00BA17E0                 dd offset sub_607360
.rdata:00BA17E4                 dd offset sub_5FAB70
.rdata:00BA17E8                 dd offset nullsub_4
.rdata:00BA17EC                 dd offset sub_607700
.rdata:00BA17F0                 dd offset sub_607750
.rdata:00BA17F4                 dd offset sub_6077E0  //poc向上溯源函数
.rdata:00BA17F8                 dd offset nullsub_4
.rdata:00BA17FC                 dd offset nullsub_4
.rdata:00BA1800                 dd offset nullsub_4
.rdata:00BA1804                 dd offset nullsub_4
.rdata:00BA1808                 dd offset nullsub_4
.rdata:00BA180C                 dd offset nullsub_4
.rdata:00BA1810                 dd offset nullsub_4
.rdata:00BA1814                 dd offset nullsub_4
.rdata:00BA1818                 dd offset nullsub_4
.rdata:00BA181C                 dd offset nullsub_4
.rdata:00BA1820                 dd offset nullsub_4
.rdata:00BA1824                 dd offset sub_607840
.rdata:00BA1828                 dd offset nullsub_4
.rdata:00BA182C                 dd offset nullsub_3
.rdata:00BA1830                 dd offset nullsub_2
.rdata:00BA1834                 dd offset sub_464DC0
.rdata:00BA1838                 dd offset sub_6078A0
.rdata:00BA183C                 dd offset nullsub_3
.rdata:00BA1840                 dd offset nullsub_3

此处疑似是一个跳转表,有点像虚函数的作用,然后在这个表里面,我看了一下前两个函数都和eq有关系。

随后也是找到了sub_6077E0函数(就是poc引发漏洞点的函数向上溯源后的最终函数)

如果推理没有出错的话,可以试着向上溯源这个虚表 (逆向过程中可以多结合正向观察得到的字符串)

 

苏ICP备2024067700号 | 苏公网安备32098202000238号