首页
社区
课程
招聘
[分享] pwnable.kr blukat
发表于: 2021-2-5 15:02 9974

[分享] pwnable.kr blukat

2021-2-5 15:02
9974

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

我们的目标是执行 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 组内的用户可读
所以首先查看登录用户的所属组

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

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

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

Sometimes, pwnable is strange...
hint: if this challenge is hard, you are a skilled player.
 
ssh blukat@pwnable.kr -p2222 (pw: guest)
Sometimes, pwnable is strange...
hint: if this challenge is hard, you are a skilled player.
 
ssh blukat@pwnable.kr -p2222 (pw: guest)
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@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)
#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;
}
#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);

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//