fd
人生第一次pwn
一、前言:
最近在瘋狂找pwn入門基礎。群上的師兄說,最好的入門就是找幾道ctf的題目復現別人的wp,所以開始接觸pwnable.kr(這是我在i春秋幻泉師傅的CTF入門視訊中找到的一個pwn平臺),
希望通過這個平臺的題目,可以讓我對pwn,有所瞭解。(路過的大佬請忽視小菜)
ssh連線進去即可
PS:flag檔案無許可權讀取。
二、分析原始碼:
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 char buf[32];
5 int main(int argc, char* argv[], char* envp[]){
6 if(argc<2){
7 printf("pass argv[1] a number\n");
8 return 0;
9 }
10 int fd = atoi( argv[1] ) - 0x1234;
11 int len = 0;
12 len = read(fd, buf, 32);
13 if(!strcmp(" LETMEWIN\n", buf)){
14 printf("good job :)\n");
15 system("/bin/cat flag");
16 exit(0);
17 }
18 printf("learn about Linux file IO\n");
19 return 0;
20
21 }
1、
(1)、編譯預處理命令:
#include <stdio.h> #include <stdlib.h> 和#include <string.h> 是程式在編譯之前要處理的內容,稱為編譯預處理命令。
其都以#開頭,並且不用分號結尾。
標頭檔案是拓展名為.h的檔案,包含了C函式宣告和巨集定義,被多個原始檔中引用共享。
(2)、標頭檔案:
stdio.h是標頭檔案,標準輸入輸出函式庫。
stdlib.h 標頭檔案,即standard library標準庫標頭檔案,stdlib裡面包含了C語言最常用的系統函式,包含了C語言標準庫函式的定義。
string.h標頭檔案,包含了字串處理函式。
2、char buf[32];
臨時申請了一個32位元組大小的名為buf的陣列。
3、int argc,char* argv[],char* envp[]
(1)int argc:獲取引數個數
在命令列輸入情況下,命令列總的引數個數。
C:\>test.exe 1 2 3
可執行檔名+引數1,引數2,引數3,argc的值一共為4。
(2)char* argv[]:獲取引數
獲取所輸入的引數。argv[0]是檔名、argv[1] = 1即第一個引數,以此類推。
(3)char* envp[]:獲取系統環境變數
獲取系統環境變數
4、程式主體
(1)如果程式沒有輸入數字,則提示輸入數字。
(2)
atoi()函式的作用是將字串轉為雙精度浮點型值
fd = 輸入的第一個數字的雙精度浮點型值-0x1234 (0x1234=4660)
(3)read(fd,buf,count)
fd:檔案描述符,用來指向要操作的檔案的檔案結構體。
但:fd == 0 為標準輸入,fd == 1 為標準輸出,fd == 2為標準錯誤輸出。
buf:一塊記憶體空間
count:希望讀取的位元組數
read(fd,buf,32):從fd檔案中讀取32個位元組傳到buf中
(4)
strcmp(str1,str2):比較兩個字串,<0即str1<str2。其他類推。
system(command):執行系統命令
exit(0):退出
三、利用程式碼:
1、利用思路:
目標:system("/bin/cat flag")
需要:strcmp("LETMEWIN\n",buf) = 0
則:buf = "LETMEWIN\n"
所以:read(fd,buf,32)中,fd ==0
需要:argv[1] == 0x1234即4660
總結:執行該程式,首先輸入4660改變read()函式為輸入狀態,然後輸入滿足達到目標條件的"LETMEWIN\n"。
3、利用程式碼:
2)
1 from pwn import *
2 ssh_fd = ssh(host ='pwnable.kr',user='fd',password='guest',port=2222)
3 print(ssh_fd.connected())
4 exe = ssh_fd.process(argv=['fd','4660'],executable='./fd')
5 exe.sendline('LETMEWIN')
6 print(exe.recvall())
3)解釋:
ssh(host,user,password,port):ssh連線。
connected():連線成功已否的檢視
process(argv,executable):argv,程序的引數。executable,執行檔案的路徑。
附:remote('url',port):遠端開啟指定url的埠。
sendlie():傳送一行資料,在後面加上了\n。
附:send(data):傳送資料。
recvall() :接收EOF
附:recvrepeat(timeout=default):接收EOF或timeout
四、整體總結:有待提高
1、C語言
2、python的pwn庫
3、常見的pwn技巧
五、參考連結:
https://www.cnblogs.com/spd2016/p/5487683.html
https://blog.csdn.net/u010334666/article/details/81192987