前言

担心有人不知道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. Spark sql 简单使用

    一.认识Spark sql 1.什么是Sparksql? spark sql是spark的一个模块,主要用于进行结构化数据的处理,它提供的最核心抽象就是DataFrame. 2.SparkSQL的作用 ...

  2. AtCoder Beginner Contest 188 F - +1-1x2 思维题

    题目描述 给你两个数 \(x\),\(y\) 可以对 \(x\) 进行 \(+1,-1\) 或 \(\times 2\) 的操作 问最少操作多少次后变为 \(y\) \(x,y \leq 10^{18 ...

  3. loj #6179. Pyh 的求和 莫比乌斯反演

    题目描述 传送门 求 \(\sum\limits_{i=1}^n\sum\limits_{j=1}^m \varphi(ij)(mod\ 998244353)\) \(T\) 组询问 \(1 \leq ...

  4. 【Nginx学习笔记】-初识Nginx

    Nginx 目录 Nginx Nginx 特点 Nginx 基本功能 Nginx 使用场景 Nginx 安装/卸载 Docker 方式运行 Ubuntu上安装 卸载Nginx Nginx 命令 Ngi ...

  5. 用隧道协议实现不同dubbo集群间的透明通信

    用隧道协议实现不同dubbo集群间的透明通信 前言 笔者最近完成了一个非常有意思的隧道机制(已在产线运行),可以让注册到不同zookeeper之间的dubbo集群之间能够正常进行通信.如下图所示: 例 ...

  6. 剑指offer 面试题0:扎实的基础:即编程语言、数据结构和算法

    编程语言: Q:如果写的函数需要传入一个指针,则是否需要为该指针加上const?把const加在指针不同的位置是否有区别? A:const是用来声明一个常量的,如果不想让一个值改变就应该加上const ...

  7. Linux 用户操作之用户管理 (用户增删改操作)

    目录 添加用户 删除用户 修改用户 切换用户 配置用户密码 查看配置文件 cat /etc/pwsswd 添加用户 可选项 -c comment 指定一段注释性描述. -d 目录 指定用户主目录,如果 ...

  8. maven打包项目

    使用maven可以对项目进行很方便的管理,方便体现之一便是项目的打包发布变得方便,本文主要是讲一下maven打包时的一些命令和注意事项(皆是自己从应用中总结的理解,或有不对之处). maven项目打包 ...

  9. 大文件上传FTP

    需求 将本地大文件通过浏览器上传到FTP服务器. 原有方法 将本地文件整个上传到浏览器,然后发送到node服务器,最后由node发送到FTP服务器. 存在问题 浏览器缓存有限且上传速率受网速影响,当文 ...

  10. CTFHub - Web(二)

    目录遍历: 法一: 依次查看目录即可: 法二: 利用脚本:  #!/usr/bin/python3  # -*- coding: utf-8 -*-  # --author:valecalida-- ...