目录

pwnable

# pwnable.kr wp

刷下pwnable学习pwn

# fd 文件描述符

kali ssh连接靶机

ssh fd@pwnable.kr -p2222
1

列出文件

fd@pwnable:~$ ls -l
total 16
-r-sr-x--- 1 fd_pwn fd   7322 Jun 11  2014 fd
-rw-r--r-- 1 root   root  418 Jun 11  2014 fd.c
-r--r----- 1 fd_pwn root   50 Jun 11  2014 flag
1
2
3
4
5

查看当前用户,当前用户既不属于fd_pwn,也不上root,没有权限查看flag。

fd@pwnable:~$ id
uid=1002(fd) gid=1002(fd) groups=1002(fd)
1
2

查看fd文件属性,是一个二进制可执行文件。fd可以查看fd.c和执行fd文件

fd@pwnable:~$ file fd
fd: setuid ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.24, BuildID[sha1]=c5ecc1690866b3bb085d59e87aad26a1e386aaeb, not stripped
1
2

查看源码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char buf[32];
// argc 是命令行参数的数量。
// argv 是一个字符串数组,包含命令行参数。
// envp 是一个环境变量的字符串数组
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;
    // fd=0 表示标准输入
    // 1 表示标准输出
    // 2 表示错误输出
	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;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

分析可知,fd文件需要传入一个参数,参数的值减去0x1234(十进制4660)后,作为文件描述符,读取32个字节到buf中,如果buf中内容为"LETMEWIN\n",则输出flag。

exp

./fd 4660
1

#

最后一次更新于: 2024/09/07, 22:30:21