当前位置: 首页 > 后端技术 > Python

黑客入门-pwnable.kr—Children'sBottle—01-fd

时间:2023-03-26 12:06:01 Python

[TOC]前言担心有些人不知道pwnable.kr是什么,所以我觉得有必要简单介绍一下。介绍pwnable.krpwnable.kr是一个非商业性的Wargame网站,提供有关系统开发的各种pwn挑战。pwnable.kr的主要目的是“有趣”。并将每一次挑战都视为一场游戏。地址:http://pwnable.kr/###玩法每个挑战都有对应的marker文件(类似CTF),需要阅读文件提交到pwnable.kr即可获得对应的分数。为了读取标志文件,您需要一些编程、逆向工程、漏洞利用、系统知识和密码学方面的技能。每个挑战都有作者的预期解决方案,但也有许多意想不到的解决方案。挑战分为四类:ToddlerBottles:非常简单的挑战,都是由简单的错误造成的。Rookiss:新手需要掌握的典型漏洞利用。奇怪:这些挑战很奇怪,解决起来很痛苦,但是在拿到Flag之后,很有成就感。黑客秘密:应对这些挑战的前瞻性解决方案涉及特殊的黑客技术。幼儿奶瓶第一题:fd0x00问题描述妈咪!Linux中的文件描述符是什么?尝试自己玩兵棋,但如果您绝对是初学者,请点击此教程链接:https://youtu.be/971eZhMHQQwsshfd@pwnable.kr-p2222(pw:guest)此主题称为fd(文件描述符,它转换为文件描述符)。顾名思义,它其实考查的是Linux文件描述符的知识。0x01源码分析连接服务器后,当前目录下存放了几个文件:fd.cfdflag通过ls-l查看文件权限,发现当前用户没有查看flag文件的权限,然后我们分析fd.c文件,是一段代码,内容如下://fd.c#include#include#includecharbuf[32];intmain(intargc,char*argv[],char*envp[]){if(argc<2){printf("传递argv[1]一个数字\n");返回0;}intfd=atoi(argv[1])-0x1234;int长度=0;len=读取(fd,buf,32);if(!strcmp("LETMEWIN\n",buf)){printf("干得好:)\n");system("/bin/cat标志");退出(0);}printf("了解Linux文件IO\n");return0;}从源码中可以看出关键语句是通过第二个if语句的校验,如果buf变量的值为LETMEWIN字符串,那么flag文件就可以顺利打开了。buf从哪里来?向上追溯,我们可以看到buf的值来自read函数读取的内容。C语言中read函数的原型为:_ssize_tread(intfd,void*buf,size_tcount)_。其中,fd表示文件描述符,buf是读取数据的缓冲区,count是读取的字节数。也就是说,这段代码表示程序从文件描述符中读取数据,并放入buf中。fd的值应该是多少?通过搜索,我找到了如下描述:Linux系统把所有的设备都当作文件,Linux使用文件描述符来标识每一个文件对象。比如我们用键盘输入数据,用显示器读取显示的数据,那么键盘输入就是一个文件对象,显示器输出也是一个文件对象。对于每一个不同的文件对象,Linux都会使用不同的编号来识别和区分它。Linux标准文件描述符是这样规定的:数字0表示STDIN,也就是标准输入,也就是我们运行程序后在命令行输入的数据。数字1的意思是STDOUT,也就是标准输出,也就是程序运行过程中显示在终端上的数据。数字2的意思是STDERR,也就是标准错误输入,就是程序运行时出现错误,程序不能正常退出时,在终端上显示的信息。了解了这些知识之后,这个问题就可以顺利解决了:我们只需要让fd的值等于0,然后通过终端命令行输入LETMEWIN,这样buf的值就可以等于我们输入的字符串了。从而顺利通过if语句的检查。面对代码,追根溯源,可以看到另外一个关键句:intfd=atoi(argv[1])-0x1234;这句话定义了fd的值,其中argv是main函数的一个参数,加上argc和envp表示程序运行时在命令行输入的命令参数。argc是一个整数,表示参数个数(也包括程序文件名,所以argc的值至少要大于等于1),argv是一个指针数组,元素个数为argc,里面存放的是指向各个参数指针的指针,所以argv[1]代表程序运行的第二个命令参数(第一个命令参数是argv[0],也就是程序名)。envp是指向系统环境变量字符串的指针数组,这里没有使用。因此,我们只需要让程序运行的第一个命令参数等于0x1234,转换成十进制后的值为4660。0x02到此为止的解题思路,解题思路很清晰,终端输入为如下:$./fd4660LETMEWIN干得好:)妈妈!我想我知道文件描述符是什么了!!0x03知识点总结本题考查三个知识点:Linux下文件描述符fd的定义和使用;C语言中read函数的原型及功能用法;main函数的三个参数argc、argv、envp的含义。