概念:在计算机中,当要表示的数据超出计算机使用的数据表示范围时,产生数据的溢出
原因:使用非类型安全的语言入C/C++等
以不可靠的方式存取或者复制内存缓冲区
编译器设置内存缓冲区太靠近关键数据结构
“pwn"是一个黑客俚语词,指攻破设备或者系统。发音类似"砰”。就是向目标发送特定的数据,使其执行我们发送的错误代码。
(请点击) 用于提权
请点击
用于对编写的程序进行编译得到可执行文件
disass main反汇编出来main函数的汇编代码
设置断点
设置断点可以通过b或者break设置断点,断点的设置可以通过函数名、行号、文件名+函数名、文件名+行号以及偏移量、地址等进行设置。
break 函数名
break 行号
break 文件名:函数名
break 文件名:行号
break +偏移量
break -偏移量
r是运行(run)
n是单步执行,next遇到函数不会进入函数内部
si是步入,step会执行到函数内部
c是继续运行,调试时,使用continue命令继续执行程序。程序遇到断点后再次暂停执行;如果没有断点,就会一直执行到结束。
删除断点
删除断点通过命令包括:
delete <断点id>:删除指定断点
delete:删除所有断点
clear
clear 函数名
clear 行号
clear 文件名:行号
clear 文件名:函数名
查看断点
info br
栈帧其实就是一个函数执行的环境,就是一个函数执行的时候,他的函数参数、函数的局部变量,函数执行完返回的地址。
具体效果:当启用栈保护后,函数开始执行的时候会先往栈里插入cookie信息,当函数真正返回的时候会验证cookie信息是否合法,如果不合法就停止程序运行。攻击者在覆盖返回地址的时候往往也会将cookie信息给覆盖掉,导致栈保护检查失败而阻止shellcode的执行。在Linux中我们将cookie信息称为canary,所以这种保护方式也被称为CANNAPY。
NX即No-eXecute(不可执行)的意思。
基本原理:将数据所在内存页标识为不可执行,当程序溢出成功转入shellcode时,程序会尝试在数据页面上执行指令,此时CPU就会抛出异常,而不是去执行恶意指令。
注:NX等同于Windows下的DEP。
基本原理:标准的可执行程序需要固定的地址,并且只有被装载到这个地址才能正确执行,PIE能使程序像共享库一样在主存任何位置装载,这需要将程序编译成位置无关,并链接为ELF共享对象。
注:一般情况下NX和地址空间分布随机化ASLR会同时工作。内存地址随机化机制(address space layout randomization),有以下三种情况
0 - 表示关闭进程地址空间随机化。
1 - 表示将mmap的基址,stack和vdso页面随机化。
2 - 表示在1的基础上增加栈(heap)的随机化。
可以防范基于Ret2libc方式的针对DEP的攻击。ASLR和DEP配合使用,能有效阻止攻击者在堆栈上运行恶意代码。
checksec+文件名 |
博客详细记录
注:默认不开启
gcc -fstack-protector -o hello hello.c //启用堆栈保护,不过只为局部变量中含有 char 数组的函数插入保护代码
gcc -fstack-protector-all -o test test.c //启用堆栈保护,为所有函数插入保护代码
gcc -fno-stack-protector -o test test.c //禁用栈保护
gcc编译器默认开启了NX选项,如果需要关闭NX选项,可以给gcc编译器添加-z execstack参数。
例如:
gcc -z execstack -o hello hello.c
如果关闭后要开启NX,输入指令:
gcc -z noexecstack -o test test.c // 开启NX保护
注:默认不开启
gcc -fpie -pie -o test test.c // 开启PIE,此时强度为1
gcc -fPIE -pie -o test test.c // 开启PIE,此时为最高强度2
objdump命令是用查看目标文件或者可执行的目标文件的构成的gcc工具。(linux命令大全)
objdump -t -j .text hello//查看hello程序的.text段有哪些函数
各个表示:
-j name
–section=name 仅仅显示指定名称为name的section的信息
-t
–syms 显示文件的符号表入口。类似于nm -s提供的信息
什么是exp?payload是什么?怎么使用python获取?
渗透中 PoC、Exp、Payload 与 Shellcode 的区别
exp解析及pwntools相关使用
简单来说,canary保护就是在返回地址之前插入一个随机数据,在返回前先校验此数据是否被更改,如果被更改则je跳转到不可执行。
复习一下:栈保护的开启与关闭(上方)
实战演示:
可以发现:程序运行后,先将一个数据入栈到栈底(最后出去)。
在函数结束前,会使用xor指令进行校验,不一致则je跳转,无法返回。
https://bbs.ichunqiu.com/thread-42943-1-1.html?from=bkyl
+https://bbs.pediy.com/thread-250858.htm