pwnable.kr第一題:fd

pwnable.kr

一、要點

1.argcargv

對于C語言int main(int argc char *argv[])來說,argc保存的是命令行總的參數個數(包括程序名),argv這是傳入參數的數組.
舉個例子,當你執行: ./test 1 2 3 時,argc = 4argv[0] = test",argv[1] = 1,argv[2] = 2,argv[3] = 3

2.atoi()

atoi (表示 ascii to integer)是把字符串轉換成整型數的一個函數。char ======> int

3.read()

UNIX/Linux平臺上,對于控制臺(Console)的標準輸入標準輸出標準錯誤輸出,也對應了三個文件描述符(即fd = File Description )。它們分別是0,1,2。也就是說read(0,buf,32)表示從鍵盤讀入至多32個字節到buf

二、解題步驟

1,查看源碼

命令:cat 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;

}

2,分析

由源碼可知,首先agrc要大于等于2,根據提示我們要輸入一個數字argv[1],且 argv[1] - 0x1234 = fd = 0,因為 fd 影響read()函數,而我們需要輸入LETMIWIN才能完成解題,所以需要是fd = 0.

3,解題

注:0x1234 須轉換為十進制數 4660
flag = mommy! I think I know what a file descriptor is!!

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容