2019.08.17|新坑记录pwnable.kr题目fd

发表于 2019-08-17  93 次阅读


文章目录

假期开新坑,练了这么久题了该记录一下了。

不得不说pwn题确实挺有意思的嘿嘿嘿

先来第一个

fd

题目地址:ssh fd@pwnable.kr -p2222 (pw:guest)

核心考点:LInux IO

连上后:

先看一波源码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;

}

分析一下,大概知道题目要比较LETMEWIN和buf相等就可以拿到flag,那么想办法输入buf就可以了。

题目下方有linux IO的提示,于是乎查一下


函数解释:

1 int argc 表示的是命令行中输入的参数

2 char* argv[]表示的是包括文件名在内的参数,文件名是argv[0]

3 char* envp[]是环境变量,比如path=c:\windows之类的东西。它没有一个整数来为它记数是通过最后一个evnp[i]==NULL来表示结尾的。

4 atoi:

【函数说明】atoi() 函数会扫描参数 str 字符串,跳过前面的空白字符(例如空格,tab缩进等,可以通过 isspace() 函数来检测),直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时('\0')才结束转换,并将结果返回。

 

【返回值】返回转换后的整型数;如果 str 不能转换成 int 或者 str 为空字符串,那么将返回 0。

5 read()

read()会把参数fd所指的文件传送nbyte个字节到buf指针所指的内存中。若参数nbyte为0,则read()不会有作用并返回0。返回值为实际读取到的字节数,如果返回0,表示已到达文件尾或无可读取的数据。错误返回-1,并将根据不同的错误原因适当的设置错误码。

在这里是从fd指向的文件中读取32个字节写到Buf中。len是表示都回来的字节数。

6 strcmp

设这两个字符串为str1,str2,

若str1==str2,则返回零;

若str1>str2,则返回正数;

若str1<str2,则返回负数。

read核心要点

fd == 0为标准输入
fd == 1为标准输出
fd == 2为标准错误输出
所以我们可以使fd == 0,然后从终端输入LETMEWIN后回车


要让fd==0,直接fd=0x1234就行,但是此处的坑是,终端并不接受0x的写法,于是乎要转化成十进制的数4660

Get flag.

本站文章基于国际协议BY-NA-SA 4.0协议共享;
如未特殊说明,本站文章皆为原创文章,请规范转载。

0

From XDU.Doing and Listening.