Linux pwn入門教程(0)——環境配置
作者:[email protected]
0×00前言
作為一個畢業一年多的辣雞CTF選手,一直苦於pwn題目的入門難,入了門更難的問題。本來網上關於pwn的資料就比較零散,而且經常會碰到師傅們堪比解題過程略的writeup和沒有註釋,存在大量硬編碼偏移的指令碼,還有練習題目難找,除錯環境難搭建,GDB沒有IDA好操作等等問題。作為一個老萌新(霧),決定依據Atum師傅在i春秋上的pwn入門課程中的技術分類,結合近幾年賽事中出現的一些題目和文章整理出一份自己心目中相對完整的Linux pwn教程。
本系列教程僅針對i386/amd64下的Linux pwn常見的pwn手法,如棧,堆,整數溢位,格式化字串,條件競爭等進行介紹。為了方便和我一樣的萌新們進行學習,所有環境都會封裝在docker映象當中,並提供除錯用的教學程式,來自歷年賽事的原題和帶有註釋的python指令碼。教程歡迎各位師傅吐槽,若對題目和指令碼的使用有不妥之處,會在當事師傅反饋之後致歉並應要求進行處理。
0×01 docker容器的使用與簡單操作
在搭建環境之前我們需要準備一個裝有docker的64位Linux系統,核心版本高於3.10(可以通過uname -r檢視),可以執行在實體機或者是虛擬機器中。關於docker的安裝與啟動此處不再贅述,讀者可以根據自己的Linux發行版本自行搜尋。此處提供兩個連結,供Ubuntu和Kali使用者參考:
Kali:《kali Rolling安裝docker》http://www.cnblogs.com/Roachs/p/6308896.html
Ubuntu:《Ubuntu 16.04安裝Docker》http://blog.csdn.net/qq_27818541/article/details/73647797
在成功安裝了docker並驗證其可用性後,我們就可以定製自己的實驗用容器了。這部分內容可以在各個地方找到教程,且與pwn的學習不相關,此處不再贅述。為了方便實驗,我把實驗環境打包成了幾個容器快照,可以直接匯入成映象使用。
以ubuntu.17.04.amd64為例,匯入的命令為
cat ubuntu.17.04.amd64 | docker import – ubuntu/17.04.amd64
匯入成功後使用命令docker images會看到映象倉庫中出現了一個新的映象。
執行docker run -it -p 23946:23946 ubuntu/17.04.amd64 /bin/bash
就可以以這個映象建立一個容器,開啟一個shell,並且將IDA除錯伺服器監聽的23946埠轉發到本地的23946埠。
docker container ls -a
我們發現容器列表裡多了一個剛剛建立的容器,並且被賦予了一個隨機的名字,在我的實驗中它是nostalgic_raman。我們可以通過命令docker container rename nostalgic_raman ubuntu.17.04.amd64
把這個容器重新命名為ubuntu.17.04.amd64或者其他你認為合適的名字。使用docker exec -it ubuntu.17.04.amd64 /bin/bash
我們可以開啟目標容器的一個新的bash shell。這使得我們在後續的除錯中可以在容器中啟動IDA除錯伺服器並用socat部署pwn題目。此外,可以使用docker container cp
命令在docker容器內外雙向傳輸檔案等等。需要注意的是,對容器的各種操作需要在容器執行時進行,若容器尚未執行(執行docker container ls未顯示對應容器),需使用命令docker start
執行對應容器。此外,若同時執行多個容器,為了避免埠衝突,在啟動容器時,可以將命令docker run -it -p 23946:23946 ubuntu/17.04.amd64 /bin/bash
中的第一個埠號23946改為其他數字。
0×02 IDA的簡單使用及遠端除錯配置
成功搭建了docker環境之後,我們接下來熟悉一下IDA和IDA的遠端除錯環境搭建。首先我們在IDA所在的資料夾的dbgsrv資料夾下找到需要的除錯伺服器linux_server(32位)和linux_serverx64(64位)並複製到kali中。
然後使用命令docker container cp linux_server ubuntu.17.04.i386:/root/linux_server
將linux_server複製到32位容器中的/root目錄下。此時我們登入容器可以看到linux_server,執行該server會提示正在監聽23946埠。
接著我們開啟32位的ida,載入一個後面會用於演示堆漏洞的程式heapTest_x86,在左側的Functions window中找到main函式,隨便挑一行程式碼按F2下一個斷點。然後通過Debugger->Process options…開啟選項視窗設定遠端除錯選項。
在彈出的選項視窗中配置Hostname為kali的ip地址,Port為容器對映到kali中的埠。
填好後點擊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等。
切回到kali,我們會看到隨著程式執行,執行除錯伺服器的shell視窗會顯示出新的內容
當IDA中的程式執行完call ___isoc99_scanf
或者類似的等待輸入的指令後會陷入阻塞狀態,F4,F7,F8,F9等和執行相關的快捷鍵都不生效。此時我們可以在shell中輸入內容,IDA中的程式即可恢復執行。
0×03 使用pwntools和IDA除錯程式
在上一節中我們嘗試了使用IDA配置遠端除錯,但是在除錯中我們可能會有一些特殊的需求,比如自動化完成一些操作或者向程式傳遞一些包含不可見字元的地址,如\x50\x83\x04\x08(0×08048350)。這個時候我們就需要使用指令碼來完成此類操作。我們選用的是著名的python庫pwntools。 pwntools庫可以使用pip進行安裝,其官方文件地址為http://docs.pwntools.com/en/stable/ 。在本節中我們將使用pwntools和IDA配合除錯程式。
首先我們在kali中安裝pwntools,安裝完成後輸入python進入python環境,使用from pwn import * 匯入pwntools庫。
使用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埠上。我們可以看到我的容器中的IP地址是172.17.0.2。回到python中,使用io = remote("172.17.0.2", 10001)
開啟與heapTest_x86的連線。這個時候我們返回到IDA中設定斷點。需要注意的是此時heapTest_x86已經開始執行,我們的目標是附加到其執行的程序上,所以我們需要把斷點設定在call ___isoc99_scanf
等等待輸入的指令執行順序之後,否則由於計算機的執行速度,我們的斷點將會因為已經目標指令已經執行完而失效,達不到斷下來的效果。選擇Debugger->Attach to process…,附加到./heapTest_x86的程序上。此時EIP將指向vdso中的pop ebp指令上。
這幾行指令實際上是執行完sys_read後的指令,此處我們不需要關心它,直接按F9,選中標誌會消失。
回到python視窗,我們使用pwntools的recv/send函式族來與執行中的heapTest_x86進行互動。首先輸入io.recv(),我們發現原先會在shell窗口出現的選單被讀出到python窗口裡了。
同樣的,我們通過io.send()也可以向這個程序傳遞輸入。我們使用io.send(’1′)告訴這個程序我們要選擇選項1。這個時候我們切換到IDA視窗,發現IDA還是處於掛起狀態,這是為什麼呢?
回想一下我們通過shell與這個程序互動的時候,輸入選項後需要按回車鍵以“告訴”這個程序我們的輸入結束了。那麼在這裡我們同樣需要再發送一個回車,所以我們再執行io.send(‘\n’),切換到IDA視窗就會發現EIP停在了熟悉的程式領空。這時候我們再使用IDA的快捷鍵就可以進行除錯,隨心所欲地觀察程序的記憶體,棧,暫存器等的狀態了。當然,我們也可以直接使用io.sendline(),就可以直接在輸入的結尾自動加上’\n’了。
在上圖的狀態中,我們在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 密碼請閱讀原文
相關推薦
Linux pwn入門教程(0)——環境配置
作者:[email protected]0×00前言作為一個畢業一年多的辣雞CTF選手,一直苦於pwn題目的入門難,入了門更難的問題。本來網上關於pwn的資料就比較零散,而且經常會碰到師傅們堪比解題過程略的writeup和沒有註釋,存在大量硬編碼偏移的指令碼,還有練
Linux pwn入門教程——格式化字符串漏洞
發現 都是 檢查 循環 我們 編譯 bbs 阻止 可見 本文作者:Tangerine@SAINTSEC 原文來自:https://bbs.ichunqiu.com/thread-42943-1-1.html 0×00 printf函數中的漏洞printf函數族是一個在C編程
Linux pwn入門教程——CTF比賽
要想理解棧溢位,首先必須理解在彙編層面上的函式進入與返回。首先我們用一個簡單執行一次回顯輸入的程式hello開始。用IDA載入hello,定位到main函式後我們發現這個程式的邏輯十分簡單,呼叫函式hello獲取輸入,然後輸出“hello,”加上輸入的名字後退出。使用F5看反彙編後的C程式碼可以非常方便的看
Linux pwn入門教程(6)——格式化字串漏洞
0x00 printf函式中的漏洞 printf函式族是一個在C程式設計中比較常用的函式族。通常來說,我們會使用printf([格式化字串],引數)的形式來進行呼叫,例如 char s[20] = “Hello world!\n”; printf(“%s”, s);
duilib入門簡明教程 -- VS環境配置(2) (轉)
dem mil 國際 程序設計 界面 環境 消息 商業 href 原文轉自:http://www.cnblogs.com/Alberl/p/3342030.html 既然是入門教程,那當然得基礎點,因為搜索duilib相關資料時,發現有些小夥伴到處都是編譯錯誤,
ROS入門教程-安裝並配置ROS環境(Kinetic 版本)
**安裝並配置ROS環境(Kinetic 版本) ** 說明 本教程詳細描述了ROS的安裝與環境配置。 此為 Ubuntu16.04 + Kinetic安裝說明 官方安裝ROS說明 http://wiki.ros.org/Installation/Ubuntu?
vs2010開發linux平臺C++程式開發環境配置+用vs2010除錯linux程式 ----VisualGDB 使用教程
VIM 其實配置為IDE後,其實也是相當不錯的,編輯功能相當強大,偶爾看到有人提到了本文中的寫程式碼方式,於是就想嚐嚐新。 搜尋了一下,這個方式的帖子不是很多,稍微花了點時間,摸索了下,還行,在VS2010下編寫程式碼,到ubuntu下編譯,一切OK! 主機:
Spring Cloud 入門教程(三): 配置自動刷新
入門 stc pro 解決方案 con log clas ring color 之前講的配置管理, 只有在應用啟動時會讀取到GIT的內容, 之後只要應用不重啟,GIT中文件的修改,應用無法感知, 即使重啟Config Server也不行。 比如上一單元(Spring Clo
Linux下的網絡環境配置
fcm 方法 適用於 font nts pretty set span 但是 Linux下的網絡環境配置 在配置網絡環境之前必須是以root用戶身份: root@localhost ~# su - root@localhost ~# su root
Linux快速入門教程-進程管理ipcs命令學習
Linux Linux入門 Linux運維 Linux命令 使用Linux系統必備的技能之一就是Linux進程管理,系統運行的過程正是無數進程在運行的過程。這些進程的運行需要占用系統的內存等資源,做好系統進程的管理,對於我們合理分配、使用系統資源有非常大的意義。今天我們來看進程管理命令中的ip
PWN入門教程分享
Linux pwn入門教程(1)——棧溢位基礎 URL:https://bbs.ichunqiu.com/forum.php?mod=viewthread&tid=42241&highlight=pwn Linux pwn入門教程(2)——shellcode的使用,原理與變形
Linux—CentOS7下python開發環境配置
CentOS7下python開發環境配置 上一篇部落格講了如何在Centos7下安裝python3(https://www.cnblogs.com/zivli/p/9937608.html),這一次配置python開發環境 1.pip安裝 沒有找到python-pip的安裝包,為了成功安裝pip,我
雲伺服器linux系統啟動web專案環境配置_(一、jdk下載安裝)
官網下載jdk(linux) 檢視linux 多少位 命令:getconf LONG_BIT 下載對應jdk 1.上傳壓縮包 cd ..回
Linux系統安裝及python環境配置
Linux簡介 Linux是一款作業系統核心,是一個類Unix系統的的作業系統 Linux發行版 各個發行廠家基於Linux核心之上,和一些常用應用做成一個包,就是Linux發行版。常見的有Ubuntu、RedHat、CentOS、Debian、Fedora等等
Spring Cloud 入門教程(二): 配置管理
使用Config Server,您可以在所有環境中管理應用程式的外部屬性。客戶端和伺服器上的概念對映與Spring Environment和PropertySource抽象相同,因此它們與Spring應用程式非常契合,但可以與任何以任何語言執行的應用程式一起使用
python3 2018分散式爬蟲教程 -1 環境配置
安裝內容: python3 pycharm pyton3 2018分散式爬蟲視訊+原始碼下載地址(崔慶才):https://download.csdn.net/download/qymufeng/10842007 1.安裝python3 (1)windows下安裝python3
RabbitMQ訊息佇列入門篇(環境配置+Java例項+基礎概念)
一、訊息佇列使用場景或者其好處 訊息佇列一般是在專案中,將一些無需即時返回且耗時的操作提取出來,進行了非同步處理,而這種非同步處理的方式大大的節省了伺服器的請求響應時間,從而提高了系統的吞吐量。 在專案啟動之初來預測將來專案會碰到什麼需求,是極其困難的。訊息
vs2010+opencv3.0.0 環境配置 (以及配置技巧)
(1) 目前最新的opencv庫為opencv 3.0.0 庫,其下載地址為:http://opencv.org/downloads.html Vs最新的可能達到了vs2015,考慮軟體太大,且opencv中並沒有對應vs2015版本的opencv,所以選擇
C++14系列(1):Linux下C++14開發環境配置
g++安裝 當前Ubuntu的LTS版本為14.04,直接在apt-get命令安裝的g++到不了5.0版本,不能獲得全部的c++14的支援,所以必須安裝5.0以上版本的g++,這裡的方法如下: sudo add-apt-repository ppa:ub
linux安裝redis及phpredis環境配置(超詳細)
下載安裝包 cd /home/redis/tar wget http://redis.googlecode.com/files/redis-2.4.17.tar.gz tar zxvf redis-2.4.17.tar.gz cd redis-2.4.17 make cd