pwnable.kr-fd

pwn-fd

被论文支配了n天后,抓紧开始新的学习。
这道题目是来自pwn题目练习,知识点:Linux文件描述符、SSH远程登录。

题目描述

题目描述
题目中提到Linux文件描述符,还有一行命令ssh fd@pwnable.kr -p2222 (pw:guest)。

知识准备

  1. Linux文件描述符

文件描述符(file descriptor),简称fd。

文件描述符 缩写 描述
0 STDIN 标准输入
1 STDOUT 标准输出
2 STDERR 标准错误输出

Linux文件描述符

  1. SSH

SSH是一种网络协议,用于计算机之间的加密登录。
如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即时被中途截获,密码也不会泄露。
基本用法:
SSH主要用于远程登录,假如要以用户名user,登录远程主机host,只要输入一条简单的命令就可以了:

1
$ ssh user@host

如果本地用户名与远程用户名一致,登录时可以省略用户名。

1
$ ssh host

SSH的默认端口是22,也就是说,你的登录请求会送进远程主机的22端口,使用p参数,会修改这个端口。

1
$ ssh -p 2222 user@host

上面这条命令表示,ssh直接连接远程主机的2222端口。
SSH原理与运用-远程登录

题目分析

  1. 直接输入题目中的命令,远程登录2222端口,密码是guest。
    ssh fd@pwnable.kr -p2222 (pw:guest)
    SSH远程登录
  2. 查看有哪些文件输入ls命令,有fd、fd.c、flag三个文件,看到有flag文件,直接cat查看试试,发现没有访问权限。
  3. 输入ls -l查看文件权限
    查看文件权限
    发现flag是只读的。
    上图结果中的各个解释
  4. 查看fd.c文件,找溢出点
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#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;
}

重点函数read(),这里的意思是把参数fd所指的文件中的32个字节传送到buf指针所指的内存中,若参数count为0,就是这里32变为0,则read()就不会有作用并返回0,返回值为实际读取到的字节数。

这里的atoi函数是把argv[1]的数据类型转换为int型,用man atoi查看
atoi函数
这里使fd=0就会在键盘上输入LETMEWIN,就可以获得flag。
让atoi( argv[1] )=0x1234,十进制为4660

  1. 查看fd文件类型,是ELF 32位文件
    运行fd,输入4660,可以在键盘键入数据,进入程序后输入LETMEWIN,得到flag
    获得flag
文章目录
  1. 1. pwn-fd
    1. 1.1. 题目描述
    2. 1.2. 知识准备
    3. 1.3. 题目分析