一公黑、學習資料
首先當然是先學習一波理論知識哆致,這種入門的東西百度上一大堆绕德,我就不一一列舉了,這里只放一下我的參考資料摊阀。僅供參考耻蛇。
二、學習實踐
在了解了基本知識之后胞此,當然是要實踐一下臣咖,我采用了Pwnable.kr,需要先自己注冊一下,這里有不同難度的題目,內容涵蓋多個領域漱牵,界面很可愛夺蛇。youtube上也有相應的視頻教程,這里有百度云的,提取碼: 74ue不過建議先自己做酣胀,做出來之后可以再去看一看刁赦,學習一下新思路。
Pwnable.kr-01 fd
首先ssh連上闻镶,ls看一下都有什么東西甚脉,
可以看到有個flag文件,我們看看里面有什么铆农,
發(fā)現(xiàn)沒有權限牺氨,這可怎么辦呢?
從上面的圖中顿涣,我們也能看到波闹,我們對flag這個文件的權限是0。既然這個文件我們沒有權限涛碑,那我么們就看看還有什么其他東西吧精堕。我們發(fā)現(xiàn)還有一個fd.c和一個fd文件,我們對fd.c是有讀取權限的蒲障,可以先看一下里面是什么(這里我做了注釋歹篓,源文件是沒有注釋的瘫证,不懂的請自行百度谷歌):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char buf[32];
int main(int argc, char* argv[], char* envp[]){
if(argc<2){//這里判斷命令行參數(shù)個數(shù)是否小于2
printf("pass argv[1] a number\n");
return 0;
}
int fd = atoi( argv[1] ) - 0x1234;//把第二個命令行參數(shù)轉成數(shù)字,再減0x1234
int len = 0;
len = read(fd, buf, 32);//以fd為文件描述符讀取32個字節(jié)內容
if(!strcmp("LETMEWIN\n", buf)){//比較buf是否與"LETMEWIN\n"相等
printf("good job :)\n");
system("/bin/cat flag");//這里會輸出flag文件的內容
exit(0);
}
printf("learn about Linux file IO\n");
return 0;
}
經過分析源碼庄撮,我們可以知道背捌,只需要讓fd程序替我們把flag打印出來就行了,這里涉及到了linux用戶特殊權限的問題洞斯,不懂的同學可以自行百度谷歌毡庆,或者點擊這個鏈接,Linux系統(tǒng)中的文件的s權限烙如。這里fd程序就擁有SGID權限么抗,可以以fd組的權限運行,自然就能查看flag文件的內容亚铁。
那怎么才能讓fd程序幫助我們查看flag的內容呢蝇刀?我們先隨便運行一下看看效果。
發(fā)現(xiàn)并沒有什么卵用徘溢,還叫我們去了解一下Linux的文件IO吞琐,好吧,那就去學習一下然爆,FILE I/O站粟。
學習之后我們終于明白了,原來標準輸入stdin的文件描述符是0曾雕,所以我們的命令行第二個參數(shù)應該是0x1234的十進制形式卒蘸,也就是4660,然后就可以從標準輸入翻默,也就是鍵盤讀取了,我們只需要再輸入LETMEWIN恰起,然后敲回車就可以看到flag了修械。
這里并沒有用的我們前面學習資料里講的知識,因為這只是第一個題检盼,比較簡單肯污,是新手入門的,后面我們就會逐漸用到前面的知識了吨枉。