VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
查看: 5215|回复: 2

[原创] 玩坏VB编译器:VB手动构造栈溢出实现跳转到任意地址功能(实现函数指针)

[复制链接]
发表于 2013-9-19 18:00:25 | 显示全部楼层 |阅读模式
本帖最后由 菜鸟学飞 于 2013-9-19 18:02 编辑

话说很少听说VB语言有栈溢出漏洞且可以利用的例子,但是今天突发奇想 觉得VB也是可能存在这个问题的 逐写代码验证.

第一步 寻找溢出代码
栈溢出其实就是数组越界访问导致栈被破坏,而VB里面即使局部变量定义成定长数组 VB也会从堆里面分配内存,
经过一番实验发现 只有将一个定长数组放在一个自定义结构体中,这样局部变量在使用这个自定义结构体的时候VB才会从栈中申请.
为了进行数组越界访问,那么还必须在编译的是开启所有高级编译选项,并且不能调试运行,因为调试的时候会检查数组越界的.

写下如下代码进行测试

Type stack_exp
     a(0) As Long    '元素只有一个
End Type


Public Function CallAsm0(ByVal pf As Long, ByVal index As Long) As Long '
    Dim tmp As stack_exp    '这个变量会在栈里面申请
    VarPtr tmp.a(0)               '禁止编译器把这个结构体优化掉
    tmp.a(index) = 0             'index 为1 这里越界写入了数组 造成栈溢出
End Function

'调用
CallAsm0 0, 1

这个时候我们用OD来看看运行流程




地址00401F3A就是我们tmp.a(index) = 0这个数组越界操作的代码 ,从下方的窗口中可以看到 这条语句把0012FAC8这个地方 赋值为0而从上面的栈窗口中可以看到 0012FAC8 是函数的返回地址. bingo 返回地址被覆盖了..


当函数返回的时候在看看,返回的地址已经变成了0了

这个时候如果继续运行的话就会看到熟悉的提示
---------------------------
工程1.exe - 应用程序错误
---------------------------
"0x00000000" 指令引用的 "0x00000000" 内存。该内存不能为 "read"。


要终止程序,请单击“确定”。
要调试程序,请单击“取消”。
---------------------------
确定   取消   
---------------------------

第二步 利用溢出代码

通过前面的操作我们已经可以跳转到任意地址了,但是由于栈已经不平衡了所以问题 跳过去了就回不来了呀...而且传参数也有问题...
这个问题的话只有写一小段汇编代码来处理一下了(这里是一些栈平衡的一些工作  至于为什么这么写 好奇的同学 自己OD一下就知道了)

    'sub     esp, 0     '如果函数多参数 则这里需要改为 参数个数*4
    'push eax           'eax里面存的返回地址
    'jmp     dword ptr [esp-4]'存的函数指针

最后完整实现后的调用方式是这样的,参数个数及形式自己根据callasm0修改定义 将参数依次放在后面就行了 ,
这里有个小问题,如果是string类型的参数必须是引用传递,否则编译器会生成一大坨代码  还没处理这种情况 函数返回值也必须是long
    InitAsm
    CallAsm0 AddressOf pftest, 1
    CallAsm1 AddressOf pftest1, 1, "test pf call"
    CallAsm2 AddressOf pftest2, 1, "tset pf call2 ", "  OK"

Public Function pftest() As Long
    MsgBox "OK"
End Function

Public Function pftest1(a As String) As Long
    MsgBox a
End Function

Public Function pftest2(a As String, b As String) As Long
    MsgBox a + b
End Function

其实一开始想纯VB实现函数指针的 但是想了半天 为了栈平衡还是得嵌段汇编.而且还有一些小问题
但算是一种使用API最少的调用函数指针的方式了(只用了一个VirtualProtect避免DEP问题) 估计250应该不会报毒了...


源码在这



最后祝大家中秋快乐

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

点评

非常感谢  发表于 2015-1-8 19:48
往自己WriteProcessMemory好像250不会报毒的,一般都不会出太大问题  发表于 2013-9-20 00:06

评分

参与人数 6威望 +51 金钱 +20 人气 +14 收起 理由
bxc1995 + 8 + 1 很给力
wtywtykk + 10 + 2 神马都是浮云
eaaca1234 + 20 + 3
Apple_0 + 15 + 3
acme_pjz + 10 + 3 精品文章
19900603 + 8 + 2 神马都是浮云

查看全部评分

本帖被以下淘专辑推荐:

发表于 2013-9-20 20:39:17 | 显示全部楼层
还有种方法,把一个数当成参数传给一个无参数api导致堆栈不平衡,返回的时候会误打误撞返回到参数所指地址...http://www.vbgood.com/thread-120527-1-1.html EbLibraryUnload,KiFastSystemCallRet  应该也行

点评

lz的也要exe...  发表于 2013-9-21 08:45
编译成exe才有效果吧  发表于 2013-9-20 23:41
回复 支持 反对

使用道具 举报

发表于 2013-9-21 06:30:44 | 显示全部楼层

我最喜欢搞坏VB了,VB一天不给我崩10次我心里都欲求不满。

点评

AD:请用我的防崩补丁~~~  发表于 2013-9-21 08:44
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2022-6-26 04:24

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表