无代码执行溢出攻击

安全 黑客攻防
对于溢出攻击来说,有时除了运行溢出代码以外,我还发现了其它一些利用溢出方式,而且并不是所有的溢出都会弹出异常。某些溢出不允许攻击者获得控制权,但是肯能允许他们读取或操纵额外数据。

对于溢出攻击来说,有时除了运行溢出代码以外,我还发现了其它一些利用溢出方式,而且并不是所有的溢出都会弹出异常。某些溢出不允许攻击者获得控制权,但是肯能允许他们读取或操纵额外数据。例如,Logon.exe,这是一个允许管理员登录某个服务的工具。由于登录的密码每次都是随机产生的,很难猜测得到。如果不知道密码,要想登录服务就需要查看内存(我假设这是没有限制的)或使用某些狡猾的计策。让我们看看Logon.exe是如何工作的。

C:\Documents and Settings\Czy>Logon.exe

USAGE: Logon.exe <username> <password>

试试输入伪造的参数:

C:\Documents and Settings\Czy>Logon.exe spy W7g6351a

Access Denied.

再试试输入长字符串:

有点奇怪,当全部为字母a时,服务允许你登录。再检查一下,看看这种情况是否还会发生:

使用同一个用户名、不同的密码,登录仍然有效!只要你指定了一个长密码,无论这个密码是否正确,程序都允许你登录,这样看来,你必须不把这种行为作为一个漏洞进行汇报。让我们看看为什么会发生这样的事。

Logon.exe中的类是如下定义的:

www.2cto.com

#define CREDENTIAL_LENGTH 64

class Login {

public:

Login();

void ClearCreds();

bool IsLoggedIn();

bool TryCreds(char *Username, char *Password);

virtual ~Login();

private:

char UserName[CREDENTIAL_LENGTH];

char PassPhrase[CREDENTIAL_LENGTH];

char CorrectPassPhrase[CREDENTIAL_LENGTH];

char Buffer[521];

};

这个类的定义中有几个非常有趣的地方:PassPhrase和CorrectPassPhrase是顺序存储在内存中的。查看一下用于检查密码是否正确的代码:

bool Password::IsLoggedIn()

{

return(0==memcmp(passPhrase,CorrectPassPhrase,CREDENTIAL_LENGTH));

}

看起来一切正常。再来看看调用者。

bool Login::TryCreds(char *User, char *Password)

{

FillMemory(UserName,CREDENTIAL_LENGTH,0x00);

strcpy(UserName,User);

FillMemory(PassPhrase,CREDENTIAL_LENGTH,0x00);

strcpy(PassPhrase,Password);

retrun IsLoggedIn();

}

注意到了吗?strcpy(PassPhrase,Password);这行代码看起来很可疑。如果PassPhrase[]缓冲区溢出会怎样呢?由于CorrectPassPhra[]缓冲区在内存中的位置刚好在PassPhrase[]缓冲区的后面,很显然,溢出的数据会覆盖CorrectPassPhra[]缓冲区。如果Password的字节长度为2*CREDENTIAL_LENGTH,而且该密码的前半部分和后半部分完全一样,那么不管CorrectPassPhrase的真实数值是多少,函数IsLoggedIn返回的值都是true。

修补这个漏洞非常容易:只要检查一下输入的长度,如果过长,返回false就可以了。

bool Login::TryCreds(char *User, char *Password)

{

if ((strlen(User) < CREDENTIAL_LENGTH) &&

(STRLEN(pASSWORD) < CREDENTIAL_LENGTH)

{

FillMemory(UserName,CREDENTIAL_LENGTH,0x00);

strcpy(UserName,User);

FillMemory(PassPhrase,CREDENTIAL_LENGTH,0x00);

strcpy(PassPhrase,Password);

retrun IsLoggedIn();

}

else

{

retrun false;

}

}

尾声:

测试一下修订后的版本,你可以发现这个演示中的漏洞已经得到了修补。如果你经过仔细研究,其实它并不难。

责任编辑:蓝雨泪 来源: 红黑联盟
相关推荐

2014-07-30 11:21:46

2009-09-24 18:29:12

2013-06-28 13:35:37

2022-02-22 09:33:38

LIFO数据结构

2018-12-19 08:52:55

无文件攻击信息安全恶意代码

2009-09-24 18:16:40

2011-02-28 09:34:55

2019-04-10 10:03:52

2019-03-26 09:11:32

无文件恶意软件

2022-03-10 12:17:02

植入LaserShark无接触

2020-05-21 09:14:36

无代码代码开发

2021-09-22 10:05:58

OpenOffice漏洞代码

2010-10-09 14:45:48

2022-05-07 08:27:42

缓冲区溢出堆栈

2011-11-15 16:00:42

2018-01-20 22:01:11

2021-03-09 09:06:33

PythonBug漏洞

2021-04-14 11:20:04

无代码APPNo Code

2009-09-17 14:11:53

2010-09-29 15:10:58

点赞
收藏

51CTO技术栈公众号