-
-
[原创] KCTF2020 秋季赛 第九题 命悬一线
-
发表于: 2020-12-15 00:31 7074
-
运行就提示要在docker里跑,打开main看看也没发现啥,看看init,fini。
init_array里有个函数有反调试的逻辑,检查TracerPid,如果没被调试就patch一个关键函数。这个函数没被patch的话就是个算数运算,可能导致除0异常。如果被patch的话,就会变成一个syscall。后续的ptrace,read,write都是通过调用这个syscall。
搞清楚这一点后,把这一处检查是否调试的地方patch掉。
然后,从main函数看起。
第一个函数判断是否能ptrace,不能的话,就可以继续运行题目,要不然就告诉你去docker。
尝试qemu就可以跑,qemu好像是没实现ptrace,所以可以过掉这个check。为了能直接调试,把这处也patch掉。
之后就是把输入读到bss。
然后把bss的输入copy到stack上。然后这里有个栈溢出。
但有canary,一时不知道怎么办,但一想就这么一个输入点。就测一下,发现长度大于160的时候可以控制PC了。
然后因为有execve,所以getshell的方式就想着用execve起sh,但转了一圈,发现RCX比较难控制。
之后想着SROP一下,发现SROP需要的空间200大几,有点太长了,程序读超过255就会提前crash了,不太行。
然后还是找找怎么控制rcx,搜到一个这个,将就着用吧。
然后就可开开心心execve了。
__int64 __fastcall main(__int64 a1, char
*
*
a2, char
*
*
a3)
{
unsigned
int
v4[
6
];
/
/
[rsp
+
20h
] [rbp
-
30h
]
unsigned __int64 v5;
/
/
[rsp
+
38h
] [rbp
-
18h
]
v5
=
__readfsqword(
0x28u
);
test_ptrace();
read_inp(v4);
copy_input_to_stack(v4, input_buf_512);
/
/
漏洞就在这里...栈溢出
destructor(v4);
sub_400DFC();
return
0LL
;
}
__int64 __fastcall main(__int64 a1, char
*
*
a2, char
*
*
a3)
{
unsigned
int
v4[
6
];
/
/
[rsp
+
20h
] [rbp
-
30h
]
unsigned __int64 v5;
/
/
[rsp
+
38h
] [rbp
-
18h
]
v5
=
__readfsqword(
0x28u
);
test_ptrace();
read_inp(v4);
copy_input_to_stack(v4, input_buf_512);
/
/
漏洞就在这里...栈溢出
destructor(v4);
sub_400DFC();
return
0LL
;
}
unsigned __int64 __fastcall copy_input_to_stack(char
*
*
a1, char
*
input
)
{
__int64 v2;
/
/
rcx
char buf_68[
96
];
/
/
[rsp
+
10h
] [rbp
-
70h
]
unsigned __int64 v5;
/
/
[rsp
+
78h
] [rbp
-
8h
]
v5
=
__readfsqword(
0x28u
);
memset(buf_68,
0
, sizeof(buf_68));
v2
=
*
(a1
+
2
);
copy_from_bss(a1, buf_68,
input
);
(
*
(
*
a1
+
3
))(a1, buf_68);
/
/
sub_4016CC(a1, &a2)
/
/
作用:输出 KanXue END!
return
__readfsqword(
0x28u
) ^ v5;
}
unsigned __int64 __fastcall copy_input_to_stack(char
*
*
a1, char
*
input
)
{
__int64 v2;
/
/
rcx
char buf_68[
96
];
/
/
[rsp
+
10h
] [rbp
-
70h
]
unsigned __int64 v5;
/
/
[rsp
+
78h
] [rbp
-
8h
]
v5
=
__readfsqword(
0x28u
);
memset(buf_68,
0
, sizeof(buf_68));
v2
=
*
(a1
+
2
);
copy_from_bss(a1, buf_68,
input
);
(
*
(
*
a1
+
3
))(a1, buf_68);
/
/
sub_4016CC(a1, &a2)
/
/
作用:输出 KanXue END!
return
__readfsqword(
0x28u
) ^ v5;
}
.text:
0000000000401699
call copy_from_bss
.text:
000000000040169E
mov rax, [rbp
+
a1]
.text:
00000000004016A2
mov rax, [rax]
.text:
00000000004016A5
add rax,
18h
.text:
00000000004016A9
mov rax, [rax]
.text:
00000000004016AC
mov rdx, [rbp
+
a1]
.text:
00000000004016B0
mov rdi, rdx
.text:
00000000004016B3
call rax
.text:
0000000000401699
call copy_from_bss
.text:
000000000040169E
mov rax, [rbp
+
a1]
.text:
00000000004016A2
mov rax, [rax]
.text:
00000000004016A5
add rax,
18h
.text:
00000000004016A9
mov rax, [rax]
.text:
00000000004016AC
mov rdx, [rbp
+
a1]
.text:
00000000004016B0
mov rdi, rdx
.text:
00000000004016B3
call rax
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
赞赏
他的文章
看原图
赞赏
雪币:
留言: