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
2
3
4
5
查看当前用户,当前用户既不属于fd_pwn,也不上root,没有权限查看flag。
fd@pwnable:~$ id
uid=1002(fd) gid=1002(fd) groups=1002(fd)
1
2
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
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
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
#
编辑 (opens new window)
最后一次更新于: 2024/09/07, 22:30:21