-
-
[分享]pwnable.kr mistake day7
-
发表于: 2021-1-8 20:01 8321
-
此次题目带有提示:操作符优先级
我们的目标是程序可以执行 system("/bin/cat flag\n") 这需要满足 pw_buf 与 pw_buf2 前十个字节相等。
pw_buf2 是我们输入的字符串经过 xor() 函数处理得到。
xor() 将字符串中的每个字符与 1 异或。
pw_buf 是由 read(fd,pw_buf,PW_LEN) 完成赋值,其中 fd 在第 17 行完成赋值 fd=open("/home/mistake/password",O_RDONLY,0400) < 0
由于赋值运算符 '=' 的优先级小于 '<' 的优先级,所以先处理 open("/home/mistake/password",O_RDONLY,0400) < 0
open() 打开文件成功的返回值是 0,0 < 0 是假,所以 fd 的值应为 0,所以 pw_buf 的值也是我们手动输入的。
综上所述,只要我们两次输入的字符串异或的结果为 1111111111 即可,
为了方便,我们第一次输入十个 0,第二次输入十个 1。
执行结果,红框内为 flag
#include <stdio.h>
#include <fcntl.h>
#define PW_LEN 10
#define XORKEY 1
void xor(char
*
s,
int
len
){
int
i;
for
(i
=
0
; i<
len
; i
+
+
){
s[i] ^
=
XORKEY;
}
}
int
main(
int
argc, char
*
argv[]){
int
fd;
if
(fd
=
open
(
"/home/mistake/password"
,O_RDONLY,
0400
) <
0
){
printf(
"can't open password %d\n"
, fd);
return
0
;
}
printf(
"do not bruteforce...\n"
);
sleep(time(
0
)
%
20
);
char pw_buf[PW_LEN
+
1
];
int
len
;
if
(!(
len
=
read(fd,pw_buf,PW_LEN) >
0
)){
printf(
"read error\n"
);
close(fd);
return
0
;
}
char pw_buf2[PW_LEN
+
1
];
printf(
"input password : "
);
scanf(
"%10s"
, pw_buf2);
/
/
xor your
input
xor(pw_buf2,
10
);
if
(!strncmp(pw_buf, pw_buf2, PW_LEN)){
printf(
"Password OK\n"
);
system(
"/bin/cat flag\n"
);
}
else
{
printf(
"Wrong Password\n"
);
}
close(fd);
return
0
;
}
#include <stdio.h>
#include <fcntl.h>
#define PW_LEN 10
#define XORKEY 1
void xor(char
*
s,
int
len
){
int
i;
for
(i
=
0
; i<
len
; i
+
+
){
s[i] ^
=
XORKEY;
}
}
int
main(
int
argc, char
*
argv[]){
int
fd;
if
(fd
=
open
(
"/home/mistake/password"
,O_RDONLY,
0400
) <
0
){
printf(
"can't open password %d\n"
, fd);
return
0
;
}
printf(
"do not bruteforce...\n"
);
sleep(time(
0
)
%
20
);
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
赞赏
他的文章
- [原创]pwnable.kr horcruxes 10755
- [分享] pwnable.kr blukat 9975
- [分享] pwnable.kr unlink 9473
- [分享] pwnable.kr asm 10672
- [分享] pwnable.kr memcpy 10451
看原图
赞赏
雪币:
留言: