CTF必備技能丨Linux Pwn入門教程——環境配置

說在前面python

這是一套Linux Pwn入門教程系列,做者依據Atum師傅在i春秋上的Pwn入門課程中的技術分類,並結合近幾年賽事中出現的一些題目和文章整理出一份相對完整的Linux Pwn教程。linux

問:爲何要花費精力去整理這套系統的Linux Pwn教程?docker

答:網上關於Pwn的資料比較零散;常常會碰到解題過程略的Writeup和沒有註釋;存在大量硬編碼偏移的腳本;練習題目難找;調試環境難搭建;GDB沒有IDA好操做等等問題。shell

問:這個Linux Pwn教程適合新手學習嗎?ubuntu

答:本套課程很是適合萌新們進行入門學習,內容通俗易懂,化繁爲簡,同時結合歷年賽題,實操性強,對於快速提高技能可起到很大的幫助。bash

問:關於Linux Pwn教程是否有視頻講解?服務器

答:在i春秋官網的課程庫中有不少關於Pwn的視頻課程,當即去學習!https://www.ichunqiu.com/courses/pwn?from=weixintcp

CTF必備技能丨Linux Pwn入門教程——環境配置

 

本系列教程僅針對i386/amd64下的Linux Pwn常見的Pwn手法,如棧,堆,整數溢出,格式化字符串,條件競爭等進行介紹,全部環境都會封裝在Docker鏡像當中,並提供調試用的教學程序,來自歷年賽事的原題和帶有註釋的python腳本。函數

教程中的題目和腳本如有使用不妥之處,歡迎各位大佬批評指正。佈局

今天是Linux Pwn入門教程第一章:環境配置,閱讀用時約7分鐘。

CTF必備技能丨Linux Pwn入門教程——環境配置

 

1、Docker容器的使用與簡單操做

在搭建環境以前咱們須要準備一個裝有Docker的64位Linux系統,內核版本高於3.10(能夠經過uname -r查看),能夠運行在實體機或者是虛擬機中。關於Docker的安裝與啓動此處再也不贅述,讀者能夠根據本身的Linux發行版本自行搜索。

在成功安裝了Docker並驗證其可用性後,咱們就能夠定製本身的實驗用容器了。這部份內容能夠在各個地方找到教程,且與Pwn的學習不相關,此處再也不贅述。爲了方便實驗,我把實驗環境打包成了幾個容器快照,能夠直接導入成鏡像使用。

以ubuntu.17.04.amd64爲例,導入的命令爲:

cat ubuntu.17.04.amd64 | docker import - ubuntu/17.04.amd64

CTF必備技能丨Linux Pwn入門教程——環境配置

 導入成功後使用命令docker images會看到鏡像倉庫中出現了一個新的鏡像。

CTF必備技能丨Linux Pwn入門教程——環境配置

 運行docker run -it -p 23946:23946 ubuntu/17.04.amd64 /bin/bash

就能夠以這個鏡像建立一個容器,開啓一個shell,而且將IDA調試服務器監聽的23946端口轉發到本地的23946端口。

CTF必備技能丨Linux Pwn入門教程——環境配置

經過命令docker container ls -a 咱們發現容器列表裏多了一個剛剛建立的容器,而且被賦予了一個隨機的名字,在個人實驗中它是nostalgic_raman。

CTF必備技能丨Linux Pwn入門教程——環境配置

 咱們能夠經過命令docker container rename nostalgic_raman ubuntu.17.04.amd64把這個容器重命名爲ubuntu.17.04.amd64或者其餘你認爲合適的名字。

CTF必備技能丨Linux Pwn入門教程——環境配置

 使用docker exec -it ubuntu.17.04.amd64 /bin/bash 咱們能夠打開目標容器的一個新的bash shell。這使得咱們在後續的調試中能夠在容器中啓動IDA調試服務器並用socat部署Pwn題目。

CTF必備技能丨Linux Pwn入門教程——環境配置

此外,可使用docker container cp命令在docker容器內外雙向傳輸文件等等。須要注意的是,對容器的各類操做須要在容器運行時進行,若容器還沒有運行(運行docker container ls未顯示對應容器),需使用命令docker start運行對應容器。此外,若同時運行多個容器,爲了不端口衝突,在啓動容器時,能夠將命令docker run -it -p 23946:23946 ubuntu/17.04.amd64 /bin/bash 中的第一個端口號23946改成其餘數字。

2、IDA的簡單使用及遠程調試配置

成功搭建了Docker環境以後,咱們接下來熟悉一下IDA和IDA的遠程調試環境搭建。首先咱們在IDA所在的文件夾的dbgsrv文件夾下找到須要的調試服務器Linux_server(32位)和Linux_serverx64(64位)並複製到kali中。

CTF必備技能丨Linux Pwn入門教程——環境配置

而後使用命令:

docker container cp linux_server ubuntu.17.04.i386:/root/linux_server

將linux_server複製到32位容器中的/root目錄下。此時咱們登陸容器能夠看到linux_server,運行該server會提示正在監聽23946端口。

CTF必備技能丨Linux Pwn入門教程——環境配置

接着咱們打開32位的ida,載入一個後面會用於演示堆漏洞的程序heapTest_x86,在左側的Functions window中找到main函數,隨便挑一行代碼按F2下一個斷點。而後經過Debugger->Process options...打開選項窗口設置遠程調試選項。

CTF必備技能丨Linux Pwn入門教程——環境配置

在彈出的選項窗口中配置Hostname爲kali的ip地址,Port爲容器映射到kali中的端口。

CTF必備技能丨Linux Pwn入門教程——環境配置

 

CTF必備技能丨Linux Pwn入門教程——環境配置

填好後點擊OK,按快捷鍵F9運行程序。若鏈接正常可能提示Input file is missing:xxxxx,一路OK就行,IDA會將被調試的文件複製到服務器所在目錄下,而後彙編代碼所在窗口背景會變成淺藍色而且窗口布局發生變化。若IDA僵死一段時間後跳出Warning窗口,則須要檢查IDA所在機器與kali是否能ping通,容器對應端口是否映射,參數是否填錯等問題。

調試器鏈接成功後咱們就可使用各類快捷鍵對目標程序進行調試,經常使用的快捷鍵有如下斷點/取消斷點F2,運行程序F9,單步跨過函數F8,單步進入函數F7,運行到選中位置F4等等。在調試模式下主要使用到的窗口有彙編窗口IDA View-EIP,寄存器窗口General registers,棧窗口Stack view,內存窗口Hex View,系統日誌窗口Output window等。

CTF必備技能丨Linux Pwn入門教程——環境配置

切回到kali,咱們會看到隨着程序運行,運行調試服務器的shell窗口會顯示出新的內容:

CTF必備技能丨Linux Pwn入門教程——環境配置

當IDA中的程序執行完call ___isoc99_scanf或者相似的等待輸入的指令後會陷入阻塞狀態,F4,F7,F8,F9等和運行相關的快捷鍵都不生效。此時咱們能夠在shell中輸入內容,IDA中的程序便可恢復執行。

3、使用Pwntools和IDA調試程序

在上一節中咱們嘗試了使用IDA配置遠程調試,可是在調試中咱們可能會有一些特殊的需求,好比自動化完成一些操做或者向程序傳遞一些包含不可見字符的地址,如\x50\x83\x04\x08(0x08048350)。這個時候咱們就須要使用腳原本完成此類操做。咱們選用的是著名的python庫pwntools。pwntools庫可使用pip進行安裝,其官方文檔地址爲http://docs.pwntools.com/en/stable/ 。在本節中咱們將使用pwntools和IDA配合調試程序。

首先咱們在kali中安裝pwntools,安裝完成後輸入python進入python環境,使用from pwn import * 導入pwntools庫。

CTF必備技能丨Linux Pwn入門教程——環境配置

使用docker exec在32位的容器中新開一個bash shell,跳轉到heapTest_x86所在目錄/root,查看容器的IP地址,而後執行命令socat tcp-listen:10001,reuseaddr,fork EXEC:./heapTest_x86,pty,raw,echo=0

將heapTest_x86的IO轉發到10001端口上。

CTF必備技能丨Linux Pwn入門教程——環境配置

咱們能夠看到個人容器中的IP地址是172.17.0.2。回到python中,使用io = remote("172.17.0.2", 10001)打開與heapTest_x86的鏈接。

CTF必備技能丨Linux Pwn入門教程——環境配置

這個時候咱們返回到IDA中設置斷點。須要注意的是此時heapTest_x86已經開始運行,咱們的目標是附加到其運行的進程上,因此咱們須要把斷點設置在call ___isoc99_scanf等等待輸入的指令運行順序以後,不然因爲計算機的運行速度,咱們的斷點將會由於目標指令已經執行完而失效,達不到斷下來的效果。

選擇Debugger->Attach to process...,附加到./heapTest_x86的進程上。

CTF必備技能丨Linux Pwn入門教程——環境配置

此時EIP將指向vdso中的pop ebp指令上。

CTF必備技能丨Linux Pwn入門教程——環境配置

這幾行指令其實是執行完sys_read後的指令,此處咱們不須要關心它,直接按F9,選中標誌會消失。

回到python窗口,咱們使用pwntools的recv/send函數族來與運行中的heapTest_x86進行交互。首先輸入io.recv( ),咱們發現原先會在shell窗口出現的菜單被讀出到python窗口裏了。

CTF必備技能丨Linux Pwn入門教程——環境配置

一樣的,咱們經過io.send( )也能夠向這個進程傳遞輸入。咱們使用io.send('1')告訴這個進程咱們要選擇選項1。這個時候咱們切換到IDA窗口,發現IDA仍是處於掛起狀態,這是爲何呢?

回想一下咱們經過shell與這個進程交互的時候,輸入選項後須要按回車鍵以「告訴」這個進程咱們的輸入結束了。那麼在這裏咱們一樣須要再發送一個回車,因此咱們再執行io.send(' '),切換到IDA窗口就會發現EIP停在了熟悉的程序領空。這時候咱們再使用IDA的快捷鍵就能夠進行調試,爲所欲爲地觀察進程的內存,棧,寄存器等的狀態了。固然,咱們也能夠直接使用io.sendline( ),就能夠直接在輸入的結尾自動加上' '了。

CTF必備技能丨Linux Pwn入門教程——環境配置

在上圖的狀態中,咱們在python中再次輸入io.recv( ),發現並無讀取到輸出,而且python處於阻塞狀態。這是由於程序此時沒有輸出可讀取。咱們在IDA中按F8到call mallocChunk一行,此時按F7進入函數,在函數中運行到call _fflush的下一行,就會發現python的阻塞狀態解除了。

當咱們但願結束調試時,應該使用io.close( )關閉掉這個io。不然下一次試圖attach時會發現有兩個./heapTest_x86進程。在IDA中按Ctrl+F2便可退出調試模式。

配置實驗環境打包以下:
連接:https://pan.baidu.com/s/1xr9n9EBs2dALOkmIFaIdcQ
密碼:bcd6

以上是今天的內容,你們看懂了嗎?後面咱們將持續更新Linux Pwn入門教程的相關章節,但願你們及時關注。

相關文章
相關標籤/搜索