格式化字符串攻击(3)

2019-09-01 19:52

4.2.2用printf向指定内存写数据

printf的%n格式符用法:写入数据。

这个格式符的作用是将在这格式符之前已经打印出的字符个数写入到对应的参数中。注意:这里的已经打印出来的字符是指在该格式化字符串中,实际打印到控制台的字符的数目。 代码如下:

图2.4-程序C的代码

说明:在编译运行后,得到结果如下图:

可以看到在“a=53”有4个字符长度,故b的值由54改为了4.

图2.5-程序C的执行结果

4.2.3用printf向指定内存写入指定数据

由4.3可以知道写入内存的数据大小等于%n之前的格式字符串输出的字符个数,该格式符之前已经打印出的字符个数写入到对应的参数中。然后我们怎样控制printf()已输出的的字符数量就可以决定数据大小了。一般地址值都是比较大的数字,难道为了写内存,我们要输入浩大的数量的字符么?这时printf()的域宽说明字符派上了大用处,比如printf(\;以100字符宽度输出整数i。而用printf(\的形式则是以100位的小数输出i;

于是可以编写代码如下:

11

图2.6-程序D的代码

编译运行结果:

图2.7-程序D的执行结果

说明:“a=”再加上以60字符宽度输出整数,故共62个字符输出到控制台,因此,b=62。

4.3攻击之一-利用漏洞植入shellcode

由系统栈的工作过程可知,在函数调用完成后有一个关键的值-EIP,因为EIP,让程序转到母函数的代码中执行,如果在此期间,我们修改保持的EIP的值,让其为我们存放shellcode的地址,这样程序就可以直接转到shellcode中执行了!

因此我们要解决的问题: ①编写一定功能shellcode,并将其以二进制代码的字符数组形式存放在内存。 ②写一段程序,涉及到子函数的调用。

③获得我们编写的shellcode存放的内存地址

④找到在函数调用中存放函数返回地址的内存地址。

⑤利用printf函数将④步中找到的地址内容改为第③中获得的地址。

4.3.1编写shellcode

1、shellcode 中LoadLibrary和system 函数的地址也可能因系统不同而不同。 利用老师给的GetAddr.exe程序,在cmd中查看相关函数地址:

图3.1-查看系统函数地址

12

2、修改老师给的shellcode模板中的相关地址后得到的代码:

图3.2-编写shellcode代码

4.3.2编写程序

图3.3-编写程序代码

main函数调用function函数。预期效果为:在function函数调用返回时转到执行shellcode,而不是继续执行主函数的return函数。

在后面的分析中将具体解释在function函数中的3个printf函数的作用。 在vc6.0中进入调试状态,选择如下选项,进入汇编代码:

13

图3.4-进入汇编代码

4.3.3获得shellcode存放的内存地址

在主函数中找到shellcode的地址:

图3.5-找到shellcode的首地址

图3.6-找到shellcode的末尾地址

由图可知存放shellcode的单元为:0x0012FF14-0x0012FF7E 因此shellcode地址为0x0012FF14。

14

4.3.4找到存放函数返回地址的内存地址

1、单步调试,查看代码段:可知函数返回地址是0x00401EB

图3.7-查看函数的返回地址

2、进入call函数调用程序中:

图3.8-看到存放返回地址的内存

由函数调用的过程可知在function函数中函数的返回地址在buff后。在汇编代码中可以看到EBP-4为buff的地址,(EBP为0x0012FEB8),如此buff地址为0x0012FEB4,在初始化buff后在内存中查看,可以发现里面内容真的是字符‘1’!由此我们确定的buff地址是正确的!

在附近找寻返回地址0x00401EB,发现在8字节后出现了该字符串! 因此存放返回地址的单元为0x0012FEBC-0x0012FEBF.

4.3.5将存放返回地址单元内容修改为shellcode地址

由4.3.3知shellcode的地址为0x0012FF14,因此在0x0012FEBC-0x0012FEBF(由4.3.4知)单元应分别改为 14 FF 12 00.

现在关键是怎么改写这四个单元的内容呢? 当然,用到了printf函数:

现在就分析在4.3.2中function函数中三个printf函数的功能:

图3.9-解释程序代码

第一个printf是将值20(10)=14(16)写入buff+8,(buff=0x0012FEB4)即0x0012FEBC单元;

第二个printf将值255(10)=FF(16)写入buff+9,即0x0012FEBD单元 第三个printf将值18(10)=12(16)写入buff+10,即0x0012FEBE单元

15


格式化字符串攻击(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:青海畜牧兽医职业技术学院自主招生面试试题综合素质答案技巧

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: