漏洞利用与渗透测试基础(PWN基础知识)

下进程地址空间

漏洞利用与渗透测试基础(PWN基础知识)_第1张图片



漏洞利用与渗透测试基础(PWN基础知识)_第2张图片
上面两张图是linux下的。

Ollydbg基本操作

Ollydbg是一个Windows下用来反汇编以及动态调试的工具,这里我使用的吾爱破解版的ollydbg。
漏洞利用与渗透测试基础(PWN基础知识)_第3张图片
我们可以看到界面有四大块,载入可执行文件后得到以下界面:
漏洞利用与渗透测试基础(PWN基础知识)_第4张图片

左上角:反汇编代码
左下角:内存空间
右上角:寄存器
右下角:栈

ollydbg比较好用的几个功能有:

  1. 在反汇编窗口右键查找所有引用的字符串可以看到代码中使用的一些常量
  2. 1中步骤有时候找不到想要的字符串,这时候可以使用操作:反汇编窗口中右键->中文搜索->智能搜索
  3. F7单步运行,F8也是单步进行,但不进入call或jmp的函数,ctrl+F9快速跳到return

简单例子

编译字符串漏洞代码并生成可执行文件:

#include 
using namespace std;
int main()
{
	int a = 1, b = 2, c = 3;
	char buf[] = "test";

	//char a[100];
	//scanf("%s", a);
	printf("%s %d %d %d %x\n",buf,a,b,c);
	return 0;
}

使用ollydbg后运行,我们会发现运行不了,因为它查看了一个未知空间的变量,这里具体原因可能有很多,像是权限等等,会引起程序错误。
相反,将上述代码printf中最后一个%s换成%x之后,生成可执行文件,再使用ollydebug运行结果如下:
漏洞利用与渗透测试基础(PWN基础知识)_第5张图片
为什么会出现一串奇怪的数字呢,我们可以看调用printf函数之前的栈如下所示:
在这里插入图片描述
函数参数压栈时是从右到左依次入栈,3,2,1依次入栈,然后是“test”在内存中的地址入栈,printf函数调用的时候,根据%s %d %d %d %x的顺序依次从栈中获取所需的参数变量,因此在最后一个%x的时候,直接输出了3后面的栈中的值。
接下来我们尝试修改读取任意内存的值

sprintf函数

sprintf可以做到这一点,比如以下代码:

int func(int argc,char * argv[])
{
	char buffer[100];
	sprintf(buffer,argv[1]);//(参数入栈是从右向左入栈)
}

注:在教科书中,传入argv[1]为aaaabbbccc%n时,首先将“aaaabbbccc”写入buffer,然后将10写入地址为0x61616161的内存空间,这是因为sprintf没有传入下一个参数,所以buffer的前四个字节被当做内存地址(这一部分内容在VS2010中无法实现,在sprintf中压根无法使用format格式的%n,参考链接:为什么printf中无法使用%n,其实就是因为出于安全考虑,这样子的%n会方便黑客进行利用。)
要想使用%n进行赋值,需要加入如下代码:

_set_printf_count_output(1);// 添加这句使%n可用

然而想试验成功过并不简单,因为相应的内存地址不一定可写?先记住这个用法吧,反正我不知道怎么做了- -

在使用fputs和printf组合读取任意漏洞

你可能感兴趣的:(漏洞利用与渗透测试基础(PWN基础知识))