前言

担心有人不知道pwnable.kr是什么,所以觉得有必要简单介绍一下它。

pwnable.kr介绍

pwnable.kr是一个非商业性的Wargame网站 ,它提供有关系统开发的各种pwn挑战。pwnable.kr的主要目的是'有趣'。并把每个挑战视为游戏。地址:http://pwnable.kr/

该怎么玩

每个挑战都有对应的标记文件(类似于CTF),您需要阅读该文件并提交给pwnable.kr以获得相应的分数。为了读取标志文件,您需要一些有关编程,逆向工程,漏洞利用,系统知识,密码学的技能。每个挑战都有作者的预期解决方案,但是,还有许多意外的解决方案。

挑战分为四类:

  • 幼儿瓶:非常简单的挑战,都是一些简单的错误。
  • Rookiss:新手需要掌握的典型漏洞利用。
  • 怪诞:这些挑战是怪诞的,解决起来很痛苦,但获得Flag后,成就感满满。
  • 黑客的秘密:针对这些挑战的预期解决方案涉及特殊的黑客技术。

幼儿瓶第一道题:fd

0x00 问题描述

Mommy! what is a file descriptor in Linux?

  • try to play the wargame your self but if you are ABSOLUTE beginner, follow this tutorial link:

https://youtu.be/971eZhMHQQw

ssh fd@pwnable.kr -p2222 (pw:guest)

这道题名为fd(file descriptor,翻译过来就是文件描述符),顾名思义,其实考察的就是 Linux 的文件描述符的知识。

0x01 源码分析

连接到服务器上后,当前目录存放了几个文件:fd.c fd flag

通过ls -l,我们可以查看文件权限,发现当前用户没有权限查看flag文件,然后我们就分析fd.c文件,是一段代码,内容如下:

//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;
}

从源代码中,我们可以看到关键一句在于通过第 2 个 if 语句的检查,如果 buf 变量的值为 LETMEWIN 字符串,那么就可以顺利打开 flag 文件。buf 是从哪里来呢?向上溯源,可以看到,buf 的值来源于 read 函数读进来的内容。

C 语言中 read 函数的原型是:ssize_t read(int fd, void*buf, size_t count)。其中 fd 代表文件描述符,buf 为读出数据的缓冲区,count 是读取的字节数。也就是说,这句代码表示程序从文件描述符中读入数据并放到 buf 中。

fd 的值应该是什么呢?通过搜索,查到如下描述:Linux 系统将所有设备都当作文件来处理,而 Linux 用文件描述符来标识每个文件对象。比如说,我们用键盘输入数据,用显示器阅读显示的数据,那么键盘输入就是一个文件对象,显示器输出也是一个文件对象。对于每个不同的文件对象,Linux 会用不同数字标识并加以区分。

Linux 标准文件描述符是这样规定的:

数字 0 表示 STDIN,即标准输入,也就是我们通过运行程序之后,在命令行输入的数据。

数字 1 表示 STDOUT,即标准输出,也就是程序运行过程中,在终端显示的数据。

数字 2 表示 STDERR,即标准错误输入,也就是程序运行时如果发生错误,导致不能正常退出时,终端上会显示的信息。

在了解了这些知识以后,这道题就可以很顺利的解出了:我们只需要让 fd 的值等于 0,再通过终端命令行输入 LETMEWIN,就可以让 buf 的值等于我们输入的字符串,从而顺利通过 if 语句的检查。

对着代码,向上溯源,可以看到另外一个关键语句:

int fd = atoi( argv[1] ) - 0x1234;

这一句定义了 fd 的值,其中 argv 是 main 函数的一个参数,再加上 argc 和 envp,表示程序运行时在命令行输入的命令参数。argc 是一个整型,表示参数的个数(程序文件名也算在内,所以 argc 至少值应该大于等于 1),argv 是一个指针数组,其元素个数是 argc,存放的是指向每一个参数的指针,所以 argv[1] 就表示程序运行的第二个命令参数(第一个命令参数是 argv[0],也就是程序名)。envp 是一个指针数组,指向系统的环境变量字符串,这里没有用到。

所以,我们只需要让程序运行的第一个命令参数等于 0x1234 即可,转换成 10 进制的值是 4660。

0x02 解题方法

至此,解题思路就很明确了,终端输入如下:

$ ./fd 4660
LETMEWIN
good job :)
mommy! I think I know what a file descriptor is!!

0x03 知识点总结

本题考察了三个知识点:

  1. Linux 下的文件描述符 fd 的定义和用法;
  2. C 语言中 read 函数的原型和使用方法;
  3. main 函数三个参数 argc, argv 和 envp 的含义。

本文首发于BigYoung小站

黑客练手入门| pwnable.kr—幼儿瓶—01:fd的更多相关文章

  1. Python入门、练手、视频资源汇总,拿走别客气!

    摘要:为方便朋友,重新整理汇总,内容包括长期必备.入门教程.练手项目.学习视频. 一.长期必备. 1. StackOverflow,是疑难解答.bug排除必备网站,任何编程问题请第一时间到此网站查找. ...

  2. 微信小程序初体验,入门练手项目--通讯录,部署上线(二)

    接上一篇<微信小程序初体验,入门练手项目--通讯录,后台是阿里云服务器>:https://www.cnblogs.com/chengxs/p/9898670.html 开发微信小程序最尴尬 ...

  3. 微信小程序初体验,入门练手项目--通讯录,后台是阿里云服务器(一)

    内容: 一.前言 二.相关概念 三.开始工作 四.启动项目起来 五.项目结构 六.设计理念 七.路由 八.部署线上后端服务 同步交流学习社区: https://www.mwcxs.top/page/4 ...

  4. 推荐:一个适合于Python新手的入门练手项目

    随着人工智能的兴起,国内掀起了一股Python学习热潮,入门级编程语言,大多选择Python,有经验的程序员,也开始学习Python,正所谓是人生苦短,我用Python 有个Python入门练手项目, ...

  5. Xamarin入门,开发一个简单的练手APP

    之前周末用Xamarin练手做了个简单APP,没有啥逻辑基本就是个界面架子,MVVM的简单使用,还有Binding,Command的简单使用,还有一个稍微复杂点两个界面交互处理(子页面新增后关闭,父页 ...

  6. web前端学习部落22群分享给需要前端练手项目

    前端学习还是很有趣的,可以较快的上手然后自己开发一些好玩的项目来练手,网上也可以一抓一大把关于前端开发的小项目,可是还是有新手在学习的时候不知道可以做什么,以及怎么做,因此,就整理了一些前端项目教程, ...

  7. Python之路【第二十四篇】:Python学习路径及练手项目合集

      Python学习路径及练手项目合集 Wayne Shi· 2 个月前 参照:https://zhuanlan.zhihu.com/p/23561159 更多文章欢迎关注专栏:学习编程. 本系列Py ...

  8. 练手项目:利用pygame库编写射击游戏

    本项目使用pygame模块编写了射击游戏,目的在于训练自己的Python基本功.了解中小型程序框架以及学习代码重构等.游戏具有一定的可玩性,感兴趣的可以试一下. 项目说明:出自<Python编程 ...

  9. 10个Python基础练习项目,你可能不会想到练手教程还这么有趣

    美国20世纪最重要的实用主义哲学家约翰·杜威提出一个学习方法,叫做:Learning By Doing,在实践中精进.胡适.陶行知.张伯苓.蒋梦麟等都曾是他的学生,杜威的哲学也影响了蔡元培.晏阳初等人 ...

随机推荐

  1. 腾讯消息队列CMQ部署与验证

    环境 IP 备注 192.168.1.66 node1 前置机 192.168.1.110 node2 192.168.1.202 node3 架构图 组件介绍 组件 监听端口 access 1200 ...

  2. Azure Terraform(三)部署 Web 应用程序

    一,引言 上一节关于 Terraform 的文章讲到 Terraform 使用到的一些语法,以及通过演示使用 Terraform 在Azure 上部署资源组,极大的方便了基础设施实施人员,也提高了基础 ...

  3. Kafka 探险 - 架构简介

    Kafka 探险 - 架构简介 这个 Kafka 的专题,我会从系统整体架构,设计到代码落地.和大家一起杠源码,学技巧,涨知识.希望大家持续关注一起见证成长! 我相信:技术的道路,十年如一日!十年磨一 ...

  4. RedHat6.1通过配置yum server安装软件包

    1.获取镜像RHEL_6.1\ x86_64\ Disc\ 1 2.配置yum server #cd /etc/yum.repos.d #tar -cvf 20141114bak.tar *.repo ...

  5. Windows下如何玩转火热的go-zero

    作者:阿啄debugIT 前言 go-zero 是一个集成了各种工程实践的 web 和 rpc 框架.通过弹性设计保障了大并发服务端的稳定性,经受了充分的实战检验. go-zero 包含极简的 API ...

  6. LeetCode141-环形链表检测

    题目 给定一个链表,判断链表中是否有环. 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置 ...

  7. C#中的异步和多线程

    许多开发人员对异步代码和多线程以及它们的工作原理和使用方法都有错误的认识.在这里,你将了解这两个概念之间的区别,并使用c#实现它们. 我:"服务员,这是我第一次来这家餐厅.通常需要4个小时才 ...

  8. 温故而知新--day2

    温故而知新--day2 类 类与对象 类是一个抽象的概念,是指对现实生活中一类具有共同特征的事物的抽象.其实列化后称为对象.类里面由类属性组成,类属性可以分为数据属性和函数属性(函数属性又称为类方法) ...

  9. Git软件安装过程

    Git程序安装过程 官网: https://git-scm.com/ 下载: https://git-scm.com/downloads 我的操作系统是 Windows + 64位的 https:// ...

  10. Log4j日志记录

    1.导入log4j的jar包 2.写log4j.properties文件,配置日志记录参数,一般参数如下所示: 第二行指定了输出日志的目录,此处用的相对路径,也可换成绝对路径: 第三行指定了输出的记录 ...