前文见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引发漏洞点的函数向上溯源后的最终函数)
如果推理没有出错的话,可以试着向上溯源这个虚表 (逆向过程中可以多结合正向观察得到的字符串)