-
-
[分享] pwnable.kr blukat
-
2021-2-5 15:02 9067
-
blukat
0. 考察点
- 组权限
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!! |
[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。
赞赏
他的文章
[分享] pwnable.kr asm
9717
看原图