如今,“免费使用后”错误变得越来越严重。

我打算演示使用VTable覆盖来利用免费后使用bug。因此,我正在尝试使用Internet Explorer 9或10创建一个易于释放后使用的bug的ATL ActiveX控件。

我很难提出一个“释放后使用”的易受攻击的代码。这样可行。有没有人有这种bug的经验,有人可以尝试帮助我吗?

我也在尝试。如果我可以使用它,请在这里分享:

class User
{
  public:
    virtual void SetUsername() { }
};

class NewUser:public User
{
  char username[20];
  public:
    virtual void SetUserName(char* strUsername) { strcpy(username, strUsername); }
    virtual char* GetUserName() { return username; }
};

STDMETHODIMP CATLActivexControl::CreateUser(BSTR sUserName, DOUBLE* retVal)
{
  USES_CONVERSION;
  char *tmp = W2A(sUserName);
  NewUser *nuser = new NewUser;
  nuser->SetUserName(tmp);

  free(nuser);

  char *xyz = nuser->GetUserNameW();
  return S_OK;
}


我在上面的示例中进行了工作,并提出了一个更好的解决方案真正触发免费使用。

C ++代码

#include "stdafx.h"
#include "ATLStudentActiveXControl.h"

// Virtual Function defination
class User
{
public:
    virtual void Add(char* uName) = 0;
    virtual char* GetName() = 0;
};

class Student : public User
{
private:
    char s_name[30];

public:
    virtual void Add(char* uName) { strncpy(s_name, uName, sizeof(s_name)); }
    virtual char* GetName() { return s_name; }

};

Student *pStudent = new Student;

STDMETHODIMP CATLStudentActiveXControl::Add(BSTR sName)
{
    USES_CONVERSION;
    char *tStudent = W2A(sName);
    pStudent->Add(tStudent);
    return S_OK;
}

STDMETHODIMP CATLStudentActiveXControl::Delete()
{
    free(pStudent);
    return S_OK;
}

STDMETHODIMP CATLStudentActiveXControl::GetName(BSTR* sName)
{
    char *tStudent = pStudent->GetName();
    *sName = A2WBSTR(tStudent);
    return S_OK;
}


HTML代码

<HTML>
<HEAD>
<TITLE>Use After Free - Test Page</TITLE>
<script language="javascript" type="text/javascript">
    function UAF() {
        alert('Start');

        // Assign _studentActiveX variable to ATLStudentActiveXControl
        var _studentActiveX = document.getElementById("ATLStudentActiveXControl");

        // Add a student
        _studentActiveX.Add("StudentName");

        // Uncomment the below line to trigger Use After Free vulnerability
        // _studentActiveX.Delete();

        // Get the name of the added student
        var _studentName = _studentActiveX.GetName();
        alert(_studentName);

        // Delete the student
        _studentActiveX.Delete()

        alert('Done');
    }
</script>
</HEAD>
<BODY>
<OBJECT ID="ATLStudentActiveXControl" CLASSID="CLSID:9EACDFCF-1A2E-462E-9DF6-53E03936DB22"></OBJECT>
<div>
    <p>Demonstrating <b>Use After Free</b> vulnerability.</p>
    <input type="button" onclick="UAF();" value="Use After Free" />
</div>
</BODY>
</HTML>


请分享您的看法。谢谢。

评论

您可能已经找到了链接,但如果没有找到,就在这里。

是的,我看到了那个链接。该链接用于普通控制台程序,但是我正在尝试在ATL ActiveX控件中实现UAF。

#1 楼

我想到的第一件事是让您创建带有一些虚拟方法的类,这些类将用作测试主题。然后从ActiveX控件中公开用于操纵变量的方法,例如:


方法#1:分配测试对象并将指针保留在静态变量中
方法#2:调用测试对象提供的虚拟方法
方法3:释放测试对象实例,而无需将指针设置为NULL

有些方法分配了其他可重用的对象在以前的方法中释放的内存

然后鞭打执行给定方法的基本脚本:分配,调用方法以确保其按设计工作,释放实例,分配其他内容,再次调用虚拟方法并导致IE实例崩溃。 ;-)应该可以解决问题。

评论


那就是我想要达到的目标。但是我打算以易于开发的方式实施。这是我创建的一个小示例。但是仍然想知道那家伙是否​​能解决问题。

–john4tech
2014年7月1日在11:12

这就是我创造的。售后使用-垃圾示例

–john4tech
2014年7月1日在11:12



您应该在您的问题中包含此代码...这样做会更容易回答。

–恐怖
2014年7月1日在11:38

要点是,攻击者必须在要释放的对象(示例中的free(nuser);部分)与悬空指针的取消引用之间取得某种控制(我假设nuser-> GetUserNameW();调用为应该是“使用”部分)。在您的示例中,没有机会。最好公开一个ActiveX方法以单独执行nuser-> GetUserNameW();。调用,因此将CATLActivexControl :: CreateUser方法一分为二。这样,您实际上就有机会覆盖释放的内存。

–德米特里·雅努什凯维奇(Dmitry Janushkevich)
2014年7月2日在7:09

我已经编辑了答案,以反映那些必须是单独的方法。

–德米特里·雅努什凯维奇(Dmitry Janushkevich)
2014年7月2日在7:11