您的位置:首页 > 其它

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

2020-01-12 22:17 190 查看

下进程地址空间


上面两张图是linux下的。

Ollydbg基本操作

Ollydbg是一个Windows下用来反汇编以及动态调试的工具,这里我使用的吾爱破解版的ollydbg。

我们可以看到界面有四大块,载入可执行文件后得到以下界面:

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

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

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

简单例子

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

#include <iostream>
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运行结果如下:

为什么会出现一串奇怪的数字呢,我们可以看调用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组合读取任意漏洞

  • 点赞
  • 收藏
  • 分享
  • 文章举报
RayLee23333 发布了20 篇原创文章 · 获赞 1 · 访问量 1068 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: