我打算演示使用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>
请分享您的看法。谢谢。
#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
评论
您可能已经找到了链接,但如果没有找到,就在这里。是的,我看到了那个链接。该链接用于普通控制台程序,但是我正在尝试在ATL ActiveX控件中实现UAF。