"Pwn"是一个黑可语法的俚语词,源自动词"own",表示攻破或控制设备或系统。它常用于描述成功利用系统或应用程序的漏动,绕过安全措施并获取系统权限的行为。在网络安全领域,"pwn"通常与二进制漏动利用相关,涉及分析程序、发现漏动并构造特定的输入或代码来触发这些漏动,从而实现对目标系统的控制。
"Pwn"这个词在不同的上下文中有不同的含义。在计算机科学和技术领域,它通常指的是通过利用软件缺陷(如缓冲区溢出、格式化字符串漏动等)来获得对计算机系统的控制权。在网络安全竞赛(如Capture The Flag, CTF)中,“pwn”题目通常涉及二进制漏动利用,测试参赛者在计算机系统和软件漏动方面的知识和技能。
总的来说,“pwn”表示对目标系统的完全控制或击败,强调了黑可或公鸡者在公鸡中的优势和成功。然而,需要注意的是,“Pwn”是一个非正式的术语,通常不在正式的技术文档或讨论中使用。
pwn=缓冲区溢出吗?
"Pwn"并不是直接等于"缓冲区溢出",但缓冲区溢出是实现pwn的一种常见手段。
"Pwn"是一个广义的概念,它指的是通过利用软件或系统的漏动来获得对系统的控制权,可以涉及到多种类型的漏动利用,包括但不限于缓冲区溢出、格式化字符串漏动、整数溢出、未初始化的变量、竞争条件等。
缓冲区溢出是一种特定的漏动利用方式,它通过向程序的缓冲区写入超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,造成程序崩溃或使程序转而执行其它指令,以达到公鸡的目的。缓冲区溢出是"Pwn"中常用的一种技术,但"Pwn"不仅仅局限于缓冲区溢出,还包括其他类型的漏动利用。
因此,可以说缓冲区溢出是实现"Pwn"的一种手段,但"Pwn"本身包含了更广泛的内容。
缓冲区溢出(Buffer Overflow)是指当计算机程序尝试向缓冲区(即一块连续的内存区域)写入的数据量超过了其分配的容量时,导致数据溢出到相邻的内存区域的现象。这种情况通常是由于程序员的编程错误造成的,比如没有正确地检查输入数据的长度或者没有实施边界检查。
示例讲解
让我们通过一个简单的 C 语言示例来说明缓冲区溢出的概念。假设我们有一个程序,它包含一个缓冲区和一个函数,该函数接受用户输入并将其复制到一个固定大小的数组中:
#include <stdio.h>
#include <string.h>
void vulnerable_function(char *input) {
char buffer[12]; // 假设这个缓冲区只有12个字节的容量
// 将用户输入复制到缓冲区,但没有检查输入的长度
strcpy(buffer, input);
printf("Buffer content: %s\n", buffer);
}
int main() {
char user_input[20];
printf("Enter some text: ");
fgets(user_input, sizeof(user_input), stdin);
// 调用存在漏动的函数
vulnerable_function(user_input);
return 0;
}
在这个例子中,vulnerable_function
函数使用了 strcpy
函数将用户提供的输入复制到一个只有12个字节大小的缓冲区中。如果用户输入的字符串长度小于或等于12个字节,那么一切都会正常。但是,如果用户输入的字符串长度超过了12个字节,strcpy
函数将继续复制数据,直到遇到字符串的结束符 '\0'
,这会导致数据溢出到缓冲区之外的内存区域。
例如,如果用户输入了超过12个字符的字符串,比如 "This is a very long string that will cause a buffer overflow!",那么溢出的数据将会覆盖掉紧随缓冲区之后的内存区域。如果这部分内存恰好包含了函数的返回地址或者其他重要的程序数据,就可能导致程序崩溃或者被公鸡者利用来执行恶意代吗。
防御措施
为了避免这种类型的漏动,应该采取以下措施:
- 使用安全的字符串复制函数,如
strncpy
或snprintf
,这些函数允许指定最大复制长度。 - 在复制数据之前,始终检查输入数据的长度,确保它不会超过目标缓冲区的容量。
- 使用编译器提供的保护措施,如栈保护(Stack Canaries)、NX位(No eXecute bit)和地址空间布局随机化(ASLR)。
- 进行代码审查和安全测试,以便尽早发现并修复潜在的缓冲区溢出漏动。
通过这些措施,可以大大降低缓冲区溢出漏动的风险,提高程序的安全性。
主要关注一下eip和ESP这两个
在python中将"A"*1000
然后再发送1000个A过去看看程序会不会崩溃
程序崩溃后可以看到内存和eip、esp都是A
可以多次验证是多少位的内存
可以将远程shell的payload插入进去,找到对应的路径直接连接远程shell
A已经注入到了EAX寄存器里,EIP位置里寄存器变成了42 42 42 ,也就是说偏移量为1902个字节之后被写入到EIP寄存器里
可以精准的控制EIP里出现那个内存地址
可以把反弹shell的二进制代码存在第一个具体位置,然后精准的定位到某个位置之后,把内存写到eip,cpu就会执行这个位置找到反弹shell并执行。
pwn环境搭建
vmware的乌班图安装,先按下不表,不会的自行找
版本别太高了,选6.5
选择好镜像
选择Ubuntu系统
这个位置是写帐户密码的
磁盘大小选择25GB-选择存储为单个文件
然后就可以一直下一步到完成
开机之后选择安装Ubuntu的
开机卡logo的话搜索这个技术博文
pwn环境搭建
sodu apt-get update#更新系统
sudo su #进入管理员
apt-get install python2.7 python pip python-dev git libssl-dev libffi-dev build-essential #安装python2.7
pip install --upgrade pip #升级一下pip
安装git,gdb和gdb-multiarch,同时安装binfmt用来识别文件类型
sudo apt-get install git gdb-multiarch
sudo apt-get install "binfmt*"
安装gdb的插件pwndbg(或者gef等gdb plugin)
git clone https://github.com/pwndbg/pwndbg
cd pwndbg
./setup
安装pwntools
pip install pwntools
如果要在64位linux下运行32位的程序,需要装multilib,如果在64位系统运行32位程序这个是必须装的
apt install gcc-multilib
完美搭建
cd Pwn/
ls
gdb DimpleRev_m
搭建之后的样子
出现这个pwndbg
输入start
这就是正常的调试了
pwn的学习环境
github里直接搜索ctf
就可以看到很多的ctf的资源啦
然后找到一个pwn
随便打开一个题目可以看到服务器的端口地址都给你列出来了还有对应的write-up解析,如果没有的话去搜索一下,都有的。在这里找题目来练习就可以了。