pwnable.kr 【fd】

本文介绍了一种通过构造特定字符串来控制文件描述符(fd)的方法,以实现Linux环境下特定程序的flag获取。通过理解read()函数及atoi()函数的工作原理,文章详细展示了如何寻找一个字符串,使其转换为整型后的值等于预设数值0x1234,并最终通过标准输入成功匹配目标字符串LETMEWIN,进而获得程序隐藏的flag。

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值