-
-
[分享] 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直播授课
赞赏
他的文章
- [原创]pwnable.kr horcruxes 10755
- [分享] pwnable.kr blukat 9975
- [分享] pwnable.kr unlink 9473
- [分享] pwnable.kr asm 10671
- [分享] pwnable.kr memcpy 10451
看原图
赞赏
雪币:
留言: