首页
社区
课程
招聘
[原创]2020KCTF秋季赛第九题wp
发表于: 2020-12-7 23:22 6663

[原创]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编辑 ,原因:
收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//