-
-
[原创]2020KCTF秋季赛第九题wp
-
发表于: 2020-12-7 23:22 6663
-
1.先看看程序开了哪些保护,发现没开PIE,程序基址固定。
2.程序里用到一些异或加密过的字符串,先把它们解密出来做好标记
解密结果:
3.init函数里先检测调试器,如果没发现调试器,就自修改一段代码
检测调试器的方式是读取/proc/pid/status文件里的TracerPid。
手动解一下smc:
解出来的汇编代码,是一个通过syscall的系统调用。手动把下面的汇编patch回去,接着nop掉smc函数的调用。
4.sys_ptrace(0,0,0)来测试是否处于docker中,如果不在会输出'Please run in docker'然后退出,当时看到还以为是个docker虚拟机逃逸的题吓了一跳,后来发现不是。sys_ptrace同时兼具反调试的功能,也需要patch掉。不然无法附加调试。
首先程序通过read读取最长0x200的数据到位于0x6020C0的全局buffer里。这一步没有问题。
接下来在栈上开了一个长度为96的buffer,把刚刚读取的数据copy过来,显然是一个栈溢出漏洞。但是因为有stack canary的存在,并不能直接溢出然后rop。
copy过后程序通过一个函数指针进行了一次调用(call rax)
rax是来自栈上的局部变量,所以我们可以通过溢出来控制rax,也就是控制住rip了。
能控制rip之后,栈上也有我们复制过来的数据,直接常规思路rop就好了。这里需要多调试一会。
ROPgadget找到的一些有用的gadget:
rop目标:execve("/bin/sh\x00",0,0)
[
*
]
'/home/srp8ve7ou2/Desktop/pwn/v'
Arch: amd64
-
64
-
little
RELRO: Partial RELRO
Stack: Canary found
NX: NX enabled
PIE: No PIE (
0x400000
)
[
*
]
'/home/srp8ve7ou2/Desktop/pwn/v'
Arch: amd64
-
64
-
little
RELRO: Partial RELRO
Stack: Canary found
NX: NX enabled
PIE: No PIE (
0x400000
)
c
=
[]
c.append((
"52 107 105 116 120 52 62 127 52 104 111 122 111 110 104"
,
0x1b
))
c.append((
"117 83 64 66 68 83 113 72 69"
,
0x21
))
c.append((
"94 67 93 95 68 67 89 75"
,
0x2d
))
c.append((
"81 83 66 70 95 82"
,
0x36
))
c.append((
"36 45 50 39 44"
,
0x42
))
c.append((
"93 92 94 79 72"
,
0x3b
))
c.append((
"60 59 61 60 59 61"
,
0x4f
))
c.append((
"57 44 55 49"
,
0x58
))
c.append((
"4 1 14 13 17 7"
,
0x62
))
c.append((
"113 108 110 115 104 121 127 104"
,
0x1c
))
c.append((
"91 94 85 84 25 68 88 25 1"
,
0x37
))
c.append((
"17 45 36 32 50 36 97 51 52 47 97 40 47 97 37 46 34 42 36 51 96 10"
,
0x41
))
c.append((
"126 84 91 109 64 80 21 112 123 113 20 63"
,
0x35
))
pt
=
[]
for
ct,key
in
c:
res
=
""
tmp
=
[
int
(s)
for
s
in
ct.split()]
for
x
in
tmp:
res
+
=
chr
(x^key)
pt.append(res)
print
(pt)
c
=
[]
c.append((
"52 107 105 116 120 52 62 127 52 104 111 122 111 110 104"
,
0x1b
))
c.append((
"117 83 64 66 68 83 113 72 69"
,
0x21
))
c.append((
"94 67 93 95 68 67 89 75"
,
0x2d
))
c.append((
"81 83 66 70 95 82"
,
0x36
))
c.append((
"36 45 50 39 44"
,
0x42
))
c.append((
"93 92 94 79 72"
,
0x3b
))
c.append((
"60 59 61 60 59 61"
,
0x4f
))
c.append((
"57 44 55 49"
,
0x58
))
c.append((
"4 1 14 13 17 7"
,
0x62
))
c.append((
"113 108 110 115 104 121 127 104"
,
0x1c
))
c.append((
"91 94 85 84 25 68 88 25 1"
,
0x37
))
c.append((
"17 45 36 32 50 36 97 51 52 47 97 40 47 97 37 46 34 42 36 51 96 10"
,
0x41
))
c.append((
"126 84 91 109 64 80 21 112 123 113 20 63"
,
0x35
))
pt
=
[]
for
ct,key
in
c:
res
=
""
tmp
=
[
int
(s)
for
s
in
ct.split()]
for
x
in
tmp:
res
+
=
chr
(x^key)
pt.append(res)
print
(pt)
'/proc/%d/status'
,
'TracerPid'
,
'snprintf'
,
'getpid'
,
'fopen'
,
'fgets'
,
'strstr'
,
'atoi'
,
'fclose'
,
'mprotect'
,
'libc.so.6'
,
'Please run in docker!K'
,
'KanXue END!\n'
'/proc/%d/status'
,
'TracerPid'
,
'snprintf'
,
'getpid'
,
'fopen'
,
'fgets'
,
'strstr'
,
'atoi'
,
'fclose'
,
'mprotect'
,
'libc.so.6'
,
'Please run in docker!K'
,
'KanXue END!\n'
from
capstone
import
*
key
=
[
0xC1
,
0xF4
,
4
,
0xC1
,
0xFC
,
0xF
,
0xC1
,
0xDC
,
0x22
,
0xC1
,
0xC4
,
0x3A
,
8
,
0
,
0x84
,
0xE3
,
0x8E
,
0x8C
,
0x3B
,
0xD1
,
0xC6
,
0xB4
,
0x37
]
src
=
bytes.fromhex(
"897DFC8975F88955F4894DF0448945EC8B45F899F77DF4"
)
dest
=
bytes([src[i]^key[i]
for
i
in
range
(
23
)])
md
=
Cs(CS_ARCH_X86, CS_MODE_64)
for
i
in
md.disasm(dest,
0x4017D0
):
print
(
"0x%x:\t%s\t%s"
%
(i.address, i.mnemonic, i.op_str))
from
capstone
import
*
key
=
[
0xC1
,
0xF4
,
4
,
0xC1
,
0xFC
,
0xF
,
0xC1
,
0xDC
,
0x22
,
0xC1
,
0xC4
,
0x3A
,
8
,
0
,
0x84
,
0xE3
,
0x8E
,
0x8C
,
0x3B
,
0xD1
,
0xC6
,
0xB4
,
0x37
]
src
=
bytes.fromhex(
"897DFC8975F88955F4894DF0448945EC8B45F899F77DF4"
)
dest
=
bytes([src[i]^key[i]
for
i
in
range
(
23
)])
md
=
Cs(CS_ARCH_X86, CS_MODE_64)
for
i
in
md.disasm(dest,
0x4017D0
):
print
(
"0x%x:\t%s\t%s"
%
(i.address, i.mnemonic, i.op_str))
0x4017d0
: mov rax, rdi
0x4017d3
: mov rdi, rsi
0x4017d6
: mov rsi, rdx
0x4017d9
: mov rdx, rcx
0x4017dc
: mov rcx, r8
0x4017df
: syscall
0x4017e1
: leave
0x4017e2
: ret
0x4017e3
: xor rcx, rcx
0x4017e6
: ret
0x4017d0
: mov rax, rdi
0x4017d3
: mov rdi, rsi
0x4017d6
: mov rsi, rdx
0x4017d9
: mov rdx, rcx
0x4017dc
: mov rcx, r8
0x4017df
: syscall
0x4017e1
: leave
0x4017e2
: ret
0x4017e3
: xor rcx, rcx
0x4017e6
: ret
.text:
0000000000401699
call copy_input
.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
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2020-12-7 23:46
被afa9040e编辑
,原因:
赞赏
他的文章
- [原创]v8利用初探 2019 StarCTF oob 复现分析 28459
- [原创]2020KCTF秋季赛第九题wp 6664
- [原创]2020KCTF秋季赛第八题wp 6724
- [原创]2020KCTF秋季赛第三题重返地球wp 4292
- [原创]2020KCTF秋季赛PWN题目 3253
看原图
赞赏
雪币:
留言: