首页
论坛
专栏
课程

[原创]PwnKr第一站

6天前 370

[原创]PwnKr第一站

6天前
370

题目源码:

        #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;

        }


解题步骤:

    SSH连接成功后输入题目内对应的PassWorld


进入题目:



输入ls命令,查看当前路径下的文件:

    


可以看到,有三个文件,使用cat命令显示fd.c文件:



 得到源码,从题目可知此题是为了让我们学习linux系统下的文件描述符。在windows系统下也有类似的东西,叫做文件句柄。 这里不多赘述。


我们现在开始分析源码...


Londoing.....


从main函数数起,第八行的if语句是关键的判断语句。因为它一旦判断通过,就可以输出flag了!


这里的strcmp("LETMEWIN\n",buf)是用于比较字符串的。如果"LETMEWIN\n"和buf一致


则返回0,如果不一致则返回正数。


buf是一个长度为32的字符型数组。


我们记住buf往上找,又一次看见了buf它出现在第七行的read(fd,buf,32)中。


read函数用来从文件中的读取内容,

        fd的位置上会出现三种情况,

            0:代表stdin(标准输入)

            1:代表 stdout(标准输出)


            2:代表 stderr(标准错误)


        buf的位置是一个指向缓冲区的字符指针


        32的位置是要取出的字节数


我们现在需要向buf里输入字符,所以我们需要让read函数的fd参数为0。


Lucky!这条语句直接的向fd进行了赋值。atoi函数是把字符串转化从整型数的一个函数。

  


所以我们现在只要输入一个和十六进制的1234一样大小的十进制数(4660)即可。



现在我们就可以输入buf的字符了



出现了flag,我特意没有截全。留作练习。



[公告]安全服务和外包项目请将项目需求发到看雪企服平台:https://qifu.kanxue.com

最新回复 (2)
Editor 5天前
2
0
感谢分享哦~ 期待更多!
Re_Dog 4天前
3
0
Editor 感谢分享哦~ 期待更多!
谢谢大佬关注,之后会继续分享的
最后于 4天前 被Re_Dog编辑 ,原因: 错别字
游客
登录 | 注册 方可回帖
返回