1.题目
#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;
}
WP:
这题的逻辑相当简单,需要知道的是read( )函数以及atoi( )函数的作用,很明显要拿到flag,需要将buf和“LETMEWIN”进行对比,相同则输出flag,fd是文件描述符,read( )的作用就是从fd指向的文件中读取字节到缓冲区中,当fd为0时,代表从标准输入读取,那么只要构造fd为0,fd = atoi( argv[1] ) - 0x1234,atoi( )函数是将字符串转化为整形数,那么我们只要找到一个字符串使它转换之后的结果为0x1234即可,写一个程序。
#include<stdio.h>
#include<stdlib.h>
int main(){
char str[10];
int b=0x1234;
sprintf(str,"%d",b);
printf("%s\n",str);
printf("%d\n",atoi(str)-0x1234);
}
运行后结果为:
4660
0
于是得到字符串,然后一条命令即可得到flag
echo LETMEWIN | ./fd 4660
本文介绍了一种通过构造特定字符串来控制文件描述符(fd)的方法,以实现Linux环境下特定程序的flag获取。通过理解read()函数及atoi()函数的工作原理,文章详细展示了如何寻找一个字符串,使其转换为整型后的值等于预设数值0x1234,并最终通过标准输入成功匹配目标字符串LETMEWIN,进而获得程序隐藏的flag。
348

被折叠的 条评论
为什么被折叠?



