首页
论坛
课程
招聘
[分享] pwnable.kr blukat
2021-2-5 15:02 3145

[分享] pwnable.kr blukat

2021-2-5 15:02
3145

blukat

0. 考察点

  1. 组权限

1. 题目

1
2
3
4
Sometimes, pwnable is strange...
hint: if this challenge is hard, you are a skilled player.
 
ssh blukat@pwnable.kr -p2222 (pw: guest)

2. 解题过程

1. 查看文件列表并 checksec 目标程序

1
2
3
4
5
6
7
8
9
10
11
12
13
blukat@pwnable:~$ ls -l
total 20
-r-xr-sr-x 1 root blukat_pwn 9144 Aug  8  2018 blukat
-rw-r--r-- 1 root root        645 Aug  8  2018 blukat.c
-rw-r----- 1 root blukat_pwn   33 Jan  6  2017 password
 
blukat@pwnable:~$ checksec ./blukat
[*] '/home/blukat/blukat'
    Arch:     amd64-64-little
    RELRO:    Partial RELRO
    Stack:    Canary found
    NX:       NX enabled
    PIE:      No PIE (0x400000)

通过执行 blukat 文件可临时读取 password 文件的内容

2. 查看 blukat.c 源码

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
27
28
29
30
31
32
33
34
35
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
char flag[100];
char password[100];
char* key = "3\rG[S/%\x1c\x1d#0?\rIS\x0f\x1c\x1d\x18;,4\x1b\x00\x1bp;5\x0b\x1b\x08\x45+";
void calc_flag(char* s){
        int i;
        for(i=0; i<strlen(s); i++){
                flag[i] = s[i] ^ key[i];
        }
        printf("%s\n", flag);
}
int main(){
        FILE* fp = fopen("/home/blukat/password", "r");
 
        /* char * fgets(char * s, int size, FILE * stream);
        ** fgets()从参数 stream 所指的文件内读入字符并存到参数 s 所指的内存空间, 直到出现换行字符、读到文件尾或是已读了 size-1 个字符, 最后会加上NULL 作为字符串结束.
        ** 返回值:fgets() 若成功则返回 s 指针, 返回 NULL 则表示有错误发生.
        */
        fgets(password, 100, fp);   // /home/blukat/password 文件的内容存至 password 变量中
        char buf[100];
        printf("guess the password!\n");
        fgets(buf, 128, stdin);     // 将输入的内容存志 buf 中
        if(!strcmp(password, buf)){     // 输入的 buf 与 password 的值相同
                printf("congrats! here is your flag: ");
                calc_flag(password);    // 计算并输出 flag
        }
        else{
                printf("wrong guess!\n");
                exit(0);
        }
        return 0;
}

我们的目标是执行 calc_flag() 函数
这要求我们手动输入的 buf 由 /home/blukat/password 中的内容相同
由于 flag 是 key 与 password 文件的内容异或产生的,所以 password 里的文件如果被修改会导致得不到正确的 flag
所以我们需想办法读取 password 里的内容
本题有一个提示 hint: if this challenge is hard, you are a skilled player.
所以这题可能不需要用到常用的解题方法

 

我们已知 password 文件只有 root 用户和 blukat_pwn 组内的用户可读
所以首先查看登录用户的所属组

1
2
3
4
blukat@pwnable:~$ whoami
blukat
blukat@pwnable:~$ groups blukat
blukat : blukat blukat_pwn

发现我们登录的用户本身就属于 blukat_pwn 组,拥有对 password 文件的读权限
于是直接将 password 文件内容输入到程序中获得 flag

3. pwn

输入 password 文件内容获得 flag:Pl3as_DonT_Miss_youR_GrouP_Perm!!

这里有一个迷惑人的地方:password 的文件内容是 cat: password: Permission denied 他故意伪装成没有权限读

1
2
3
4
5
6
blukat@pwnable:~$ cat password
cat: password: Permission denied
blukat@pwnable:~$ xxd password
00000000: 6361 743a 2070 6173 7377 6f72 643a 2050  cat: password: P
00000010: 6572 6d69 7373 696f 6e20 6465 6e69 6564  ermission denied
00000020: 0a
1
2
3
blukat@pwnable:~$ cat password | ./blukat
guess the password!
congrats! here is your flag: Pl3as_DonT_Miss_youR_GrouP_Perm!!

[公告]5月14日腾讯安全零信任发展趋势论坛重磅开幕!邀您一起从“零”开始,共建信任!!

收藏
点赞0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回