ღ Miranda

Javascript DataView

DataView是一个可以从ArrayBuffer对象中读写多种数值类型的底层接口,在读写时不用考虑平台字节序问题。

示例代码:

测试平台是win10 x64 Edge在windbg里搜索DataView:

DataView::DataView就是DataView的构造函数,下断点调试示例代码。

确实得到了一个DataView对象,偏移0x20处为ArrayBuffer的长度0x10,偏移0x28处为ArrayBuffer对象的地址:

现在修改代码,添加对dataview的操作:

这次dataview如下:

ArrayBuffer:

ArrayBuffer对象偏移0x30处其实为缓冲区地址,对应到DataView对象偏移0x38处,在用setInt32设置值后缓冲区内容:

可以看到,用setInt32以小端序模式填入值0xc,用getInt32可以读出来:

不加true为默认字节序,得到结果如下:

DataView的成员函数还可以用如下方式调用,加call的话要带上this,也就是data_view:

DataView可以用来做地址读写,只要能够利用漏洞修改DataView对象的长度字段和缓冲区地址字段即可。

修改代码为:

DataView对象:

ArrayBuffer对象:

缓冲区:

在弹窗后break下来修改长度字段和缓冲区地址:

修改后的对象:

现在长度变成了0x00000000ffffffff,缓冲区地址0x000000ef00000000。现在可以读写的范围为[0x000000ef00000000, 0x000000efffffffff]

如果0x000000ef12345678地址可写,那么就会写入0xffffffff

  1. newbe说道:

    大佬能解惑下为啥dataview的对象地址是在rax寄存器里保存的么?

    1. sevie说道:

      对象构造函数返回值就是对象地址,返回值保存在rax中

发表评论

电子邮件地址不会被公开。