漏洞利用与渗透测试基础(PWN基础知识)
2020-01-12 22:17
190 查看
下进程地址空间
上面两张图是linux下的。
Ollydbg基本操作
Ollydbg是一个Windows下用来反汇编以及动态调试的工具,这里我使用的吾爱破解版的ollydbg。
我们可以看到界面有四大块,载入可执行文件后得到以下界面:
左上角:反汇编代码 左下角:内存空间 右上角:寄存器 右下角:栈
ollydbg比较好用的几个功能有:
- 在反汇编窗口右键查找所有引用的字符串可以看到代码中使用的一些常量
- 1中步骤有时候找不到想要的字符串,这时候可以使用操作:反汇编窗口中右键->中文搜索->智能搜索
- 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组合读取任意漏洞
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- Kali Linux渗透基础知识整理(三):漏洞利用
- Kali Linux渗透基础知识整理(三):漏洞利用
- IOS渗透测试第一步-基础知识统一放送
- 渗透测试之漏洞利用开启篇
- 坐拥IT高薪安全工程师职位必备知识——web前端黑客与渗透测试基础
- 渗透测试之手动漏洞利用
- Kali Linux渗透基础知识整理(二):漏洞扫描
- 小白日记24:kali渗透测试之提权(四)--利用漏洞提权
- 渗透测试漏洞利用之漏洞攻击
- 【渗透测试】如何利用burpsuite测试无回显漏洞
- Redis 基础梳理以及其在渗透测试中的利用
- Kali Linux渗透基础知识整理(二)漏洞扫描
- Redis 基础梳理以及其在渗透测试中的利用
- 渗透测试之Msf利用ms12_020漏洞进行攻击
- 软件测试基础知识
- 测试基础知识
- Web渗透测试之逻辑漏洞挖掘
- 软件测试(美)Ron Patton 基础知识整理 1
- 软件测试中的那些不可遗忘的基础知识
- 2016.6.15笔记(1)-测试的基础知识