Hexo

  • Home

  • About

  • Tags

  • Categories

  • Archives

  • Schedule

java基础-java网络编程课程简单题

Posted on 2019-12-26

1) 程序、进程和线程的概念及其之间的关系。

线程与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。

程序是含有指令和数据的文件,被存储在磁盘或其他的数据存储设备中,也就是说程序是静态的代码。

进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。简单来说,一个进程就是一个执行中的程序,它在计算机中一个指令接着一个指令地执行着,同时,每个进程还占有某些系统资源如CPU时间,内存空间,文件,文件,输入输出设备的使用权等等。换句话说,当程序在执行时,将会被操作系统载入内存中。

线程 是 进程 划分成的更小的运行单位。线程和进程最大的不同在于基本上各进程是独立的,而各线程则不一定,因为同一进程中的线程极有可能会相互影响。从另一角度来说,进程属于操作系统的范畴,主要是同一段时间内,可以同时执行一个以上的程序,而线程则是在同一程序内几乎同时执行一个以上的程序段。

2)什么是阻塞通信?非阻塞通信?

Socket通信有阻塞和非阻塞两者模式;

阻塞模式:

阻塞模式从某种意义上来说也是一种同步模式,当发送消息一端,未收到服务器确认收到消息的返回时,线程会被一直挂起,直到接收到反馈;所以,当Socket处于阻塞模式时,如果创建连接或者发送消息放在主线程,则主线程会一直处于挂起状态;如果不想主线程一直等待,就需要创建新的线程处理;

非阻塞模式:

同阻塞模式相反,类似于异步模式,当一端发送消息时,发出消息的线程不会挂起,而是继续执行;

3)C/S 模式通信的一般过程。

1.启动服务器端,监听指定端口,等待客户端的连接请求。

2.启动客户端,发起请求连接服务器的指定端口。

3.服务器端收到连接请求,建立与客户端通信的socket连接。

4.之后两端都打开两个流,建立流连接之后就可以双向通信。

5.当通信完毕之后就可以各自断开连接。

4)Java 流被分为字节流、字符流两大流类,两者有什么区别?

字节流操作的基本单元为字节;字符流操作的基本单元为Unicode码元。 字节流默认不使用缓冲区;字符流使用缓冲区。 字节流通常用于处理二进制数据,实际上它可以处理任意类型的数据,但它不支持直接写入或读取Unicode码元;字符流通常处理文本数据,它支持写入及读取Unicode码元。

5)什么是节点流?什么是处理流?如何区分节点流和处理流?

(1)节点流可以从或向一个特定的地方(节点)读写数据;处理流是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写

(2)处理流的构造方法总是以一个其他的流对象做参数。一个流对象经过其他流的多次包装,称为流的链接。

6)并行与并发?

并发(Concurrent),**在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行。**

并行(Parallel),**当系统有一个以上CPU时,当一个CPU执行一个进程时,另一个CPU可以执行另一个进程,两个进程互不抢占CPU资源,可以同时进行,这种方式我们称之为并行(Parallel)。**决定并行的因素不是CPU的数量,而是CPU的核心数量,比如一个CPU多个核也可以并行。

并发不是真正意义上的“同时进行”,只是CPU把一个时间段划分成几个时间片段(时间区间),然后在这几个时间区间之间来回切换,由于CPU处理的速度非常快,只要时间间隔处理得当,即可让用户感觉是多个应用程序同时在进行。如:打游戏和听音乐两件事情在同一个时间段内都是在同一台电脑上完成了从开始到结束的动作。那么,就可以说听音乐和打游戏是并发的。

并发是在一段时间内宏观上多个程序同时运行,并行是在某一时刻,真正有多个程序在运行。

并行和并发的区别:

并发,指的是多个事情,在同一时间段内同时发生了。
并行,指的是多个事情,在同一时间点上同时发生了。

并发的多个任务之间是互相抢占资源的。
并行的多个任务之间是不互相抢占资源的、

只有在多CPU或者一个CPU多核的情况中,才会发生并行。否则,看似同时发生的事情,其实都是并发执行的。

7) 线程为什么需要调度?为什么引入优先级?

应用程序中的多个线程能够并发执行,但从系统的内部来看,所有线程仍然是串行的一个一个地执行,那么如何来决定哪一个线程先执行,哪一个线程后执行呢?

Java引入了优先级的概念,优先级就是线程获得CPU而执行的优先程度,优先级越高,获得CPU的权力越大,执行的机会越多,执行的时间也越长

8) 线程的生命期内包括哪些状态?(框图)

img

9) 创建线程的两种方式。

(1)创建Thread子类

实现多线程的一种方式:

* 第一步:继承Java.lang.Thread

* 第二步:重写run方法

生成Thread类的子类。

class MyThread extends Thread

在子类中重写run()方法。

​ public void run()

生成子类的对象,并且调用start()方法启动新线程。

​ MyThread thread = new MyThread();

​ thread.start();

start()方法将调用run()方法执行线程。

(2)生成一个类,声明实现Runnable接口

实现多线程的一种方式:

* 第一步:实现Java.lang.Runnable

* 第二步:实现run方法

实现Runnable接口的主要步骤:

定义一个类实现Runnable接口,

​ class FirstThread implements Runnable

并且在该类中实现run()方法。

​ public void run()

生成这个类的对象。

​ FirstThread first = new FirstThread();

用Thread(Runnable target)构造函数生成Thread对象,然后调用start()方法启动线程。

​ Thread thread1 = new Thread(first);

​ thread1.start();

10) 对象锁、sleep、wait、notify、notifyall 概念。

对象锁也叫方法锁,是针对一个对象实例的,它只在该对象的某个内存位置声明一个标识该对象是否拥有锁,所有它只会锁住当前的对象,而并不会对其他对象实例的锁产生任何影响,不同对象访问同一个被synchronized修饰的方法的时候不会阻塞

Sleep():静态方法强制当前正在执行的线程休眠(暂停执行),以“减慢线程”。当线程睡眠时,它睡在某个地方,在苏醒之前不会返回到可运行状态。

当睡眠时间到期,则返回到可运行状态。

wait():让当前线程进入等待状态,同时,wait()也会让当前线程释放它所持有的锁。“直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法”,当前线程被唤醒(进入“就绪状态”)

notify()和notifyAll():唤醒当前对象上的等待线程;notify()是唤醒单个线程,而notifyAll()是唤醒所有的线程。

11.为什么需要线程同步?

线程有可能和其他线程共享一些资源,比如内存,文件,数据等等。当多个线程同时读写的时候可能会发生冲突,这时候需要引入线程同步机制,即各个线程都得有个先来后到。同步的含义也就是排队的意思,一个一个对资源进行操作

​

\12. 如何使用 NetworkInterface 获取本机网络接口的 IPV4 地址?

通过 API 文档可知,使用 getNetworkInterfaces 方法即可得到当前机器上所有的网络接口。getInetAddresses 方法返回绑定到该网卡的所有的 IP 地址。(虽然一个网络接口确实可以绑定多个 IP 地址,然而通常情况下,一个网络接口都是只对应一个 IP 地址)

l NetworkInterface可以获取本机网络接口的相关信息,包括硬件地址,MTU,所有的IP地址等信息,需要获取本机IP时,最好使用NetworkInterface对配置的IP地址进行筛选。

\13. 如何实现 IP 地址分类识别?

img

img)

所有的IP地址划分为 A,B,C,D,E五类。

使用InetAddress类的四个静态方法创建InetAddress对象后,可以通过getAddress返回的byte数组判断是IPv4还是IPv6。如果是IPV4地址,提取byte数组address【0】的值分别于0x80,0Xc0,0XE0,0XF0,0XF8做与运算。

0x80=1000 0000 ,0xc0 = 1100 0000 0xE0 = 1110 0000 0Xf0=1111 0000 0XF8= 1111 1000

(具体如上图)

\14. 什么是 URL?URL 由哪些部分组成? URL 与 URI 有何异同

URL**统一资源定位符**,是Internet上用来描述信息资源的字符串,是具体的URI。
一个完整的URL包括:协议部分、域名部分、端口部分、虚拟目录部分、文件名部分、参数部分、锚部分

img

img)

16.什么是 cookie?cookie 有什么作用?

类型为“小型文本文件”,是某些网站为了辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息。

作用:

cookie文件与特定的 Web 文档关联在一起, 保存了该客户机访问这个Web 文档时的信息, 当客户机再次访问这个 Web 文档时这些信息可供该文档使用。

1、记录用户的登录状态,譬如你登录了一个界面会显示“记住我”或者“自动登录的选项”。2、cookie起到识别用户身份的作用。3、保存客户的信息,起到简单缓存的作用。

17)URLConnection 类与 URL 类有何异同?利用 URLConnection 从网络中获取 网页数据。

在 java.net 包中包含专门用来处理 URL 的类 URL,可以获得 URL 的相关信息,例如 URL 的协议名和主机名等。

完成了 URL 的定义,接下来就可以获得 URL 的通信连接。在 java.net 包中,定义了专门的 URLConnection 类来表示与 URL 建立的通信连接,URLConnection 类的对象使用 URL 类的 openConnection() 方法获得。

利用 URLConnection 从网络中获取 网页数据:

1) 构造一个 URL 对象;

2) 调用这个 URL 对象的 openConnection()方法,获取对应该该 URL 的

URLConnection 对象;

3) 调用这个 URLConnection 的 getInputStream()方法;

4) 使用通常的流 API 读取输入流;getInputStream()方法返回一个通用

InputStream,可以读取和解析服务器发送的数据

18) Java 提供了流 socket 和数据报 socket,流 socket 和数据报 socket 各自的作用?

流 socket:实现面向连接的TCP通信

数据包 socket: 实现无连接的UDP通信

19)用一个 Java 建立一个简单的服务器需要几个步骤?

20) URLConnection 类的 doInput 属性和 doOutput 属性含义及使用方法

doInput属性:如果取值为true,表示允许获得输入流,读取远程服务器发送的数据。该属性的默认值为true。程序可通过getDoInput()和setDoInput()方法来读取和设置该属性。

doOutput属性:如果取值为true,表示允许获得输出流,向远程服务器发送数据。该属性的默认值为false。程序可通过getDoOutput()和setDoOutput()方法来读取和设置该属性。

21)JDBC 概念及其作用。JDBC 主要 API 接口功能

JDBC是Java程序操作数据库的API,也是Java程序与数据库相交互的一门技术。JDBC是Java操作数据库的规范,由一组用Java语言编写的类和接口组成,它对数据库的操作提供基本方法,但对于数据库的细节操作由数据库厂商进行实现,使用JDBC操作数据库,需要数据库厂商提供数据库的驱动程序。

其主要作用概括起来有如下3个方面:
建立与数据库的连接。
向数据库发起查询请求。
处理数据库返回结果。

JDBC API中的重要接口,接口作用:

java.sql.DriverManager 处理驱动程序的加载和建立新数据库连接

java.sql.Connection 处理与特定数据库的连接

java.sql.Statement 在指定连接中处理SQL语句

java.sql.ResultSet 处理数据库操作结果集

java-socket编程

Posted on 2019-12-14 | Edited on 2019-12-15 | In java基础

socket

TCP

单线程

示例一

简单的一个实例,服务器收到客户端发送的问候。结束。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
import org.junit.Test;

import java.io.*;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

/**
* @author lh
* create 2019-12-13-19:30
*/
public class TCPtest1 {
//客户端
@Test
public void client() {
Socket socket = null;
OutputStream os = null;
try {
socket = new Socket("localhost", 8888);
os = socket.getOutputStream();
os.write("你好,我是客户端".getBytes());
} catch (IOException e) {
e.printStackTrace();
} finally {
if (os != null) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}

}
}

}

@Test
public void server() {
ServerSocket serverSocket = null;
Socket socket = null;
InputStream is = null;
ByteArrayOutputStream byteArrayOutputStream = null;
try {
//1.创建服务器端的ServerSocket,指明自己的端口号
serverSocket = new ServerSocket(8888);
//2.掉用accept()表示接收来自客户端的socke
socket = serverSocket.accept();
//3.获取输入流
is = socket.getInputStream();

byteArrayOutputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[5];
int len;
while ((len = is.read(buffer)) != -1) {
byteArrayOutputStream.write(buffer, 0, len);
}
System.out.println(byteArrayOutputStream.toString());
} catch (IOException e) {
e.printStackTrace();
} finally {
//关闭资源
if (byteArrayOutputStream != null) {
try {
byteArrayOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}

}
if (serverSocket != null) {
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}

if (socket != null) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}


}


}

示例二

服务器收到后,给客户端反馈信息。结束

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import com.sun.xml.internal.messaging.saaj.util.ByteOutputStream;
import org.junit.Test;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

/**
* @author lh
* create 2019-12-13-20:20
*
* 这里就不做try catch了 实际是要的
*/
public class TCPtest2 {
@Test
public void client() throws IOException {
//1.
Socket socket = new Socket("127.0.0.1",8889);
//2.
OutputStream os = socket.getOutputStream();
//3.
FileInputStream fis = new FileInputStream(new File("1.jpg"));
//4.
byte[] buffer = new byte[1024];
int len ;
while ((len = fis.read(buffer))!= -1) {
os.write(buffer,0,len);
}
socket.shutdownOutput();
//5.接收来自于服务器的信息
InputStream inputStream = socket.getInputStream();
ByteOutputStream byteOutputStream = new ByteOutputStream();
byte[] buf= new byte[20];
int lenth;
while ((lenth = inputStream.read(buf)) != -1) {
byteOutputStream.write(buf,0,lenth);
}
System.out.println(byteOutputStream.toString());
//6.
fis.close();
os.close();
socket.close();
}

@Test
public void server() throws IOException {
//1.
ServerSocket ss = new ServerSocket(8889);
//2.
Socket socket = ss.accept();
//3.
InputStream is = socket.getInputStream();
//4.
FileOutputStream fileOutputStream = new FileOutputStream(new File("socket.jpg"));
//5.
byte[] buffer = new byte[1024];
int len ;
while ((len = is.read(buffer)) != -1) {
fileOutputStream.write(buffer,0,len);
}
System.out.println("shoudao");
//6.服务器给客户端反馈
OutputStream outputStream = socket.getOutputStream();
outputStream.write("服务器已经收到了".getBytes());
//7.
fileOutputStream.close();
is.close();
socket.close();
ss.close();
}
}

示例三(简单聊天)

TCP 实现客户端和服务器简单聊天

使用TCP实现简单的聊天功能

客户端部分代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import java.io.*;
import java.net.Socket;
import java.util.Scanner;

/**
* TCP 实现客户端和服务器简单聊天
* 客户端
*/
public class Client {
public static void main(String[] args) throws IOException {
// 指定服务器的IP地址 端口号
Socket socket=new Socket("localhost",7832);
System.out.println("***********客户端界面*************");
System.out.println("与服务器连接成功!");
InputStream is=socket.getInputStream();//得到Socket自带的输入流
OutputStream os=socket.getOutputStream();//得到Socket自带的输出流

BufferedReader br=new BufferedReader(new InputStreamReader(is));//将输入流 放入 缓存中
PrintWriter pw=new PrintWriter(os,true);//通过输出流向服务器发消息

Scanner input=new Scanner(System.in);
String str=null;

do{
str=input.nextLine();
pw.println(str);//发消息
System.out.println("服务器:"+br.readLine());//收消息
}while (!str.equalsIgnoreCase("bye"));
}
}

服务器部分代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

/**
* TCP 实现客户端和服务器简单聊天
* 服务器
*/
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket server=new ServerSocket(7832);//Socket的服务器 并且指定端口号
Socket socket=server.accept();//侦听连接请求,等待连接
System.out.println("************服务器端界面************");
System.out.println("与客户端连接成功!");
InputStream ins=socket.getInputStream();//返回此套接字的输入流。
OutputStream ous=socket.getOutputStream();//返回此套接字的输出流。

BufferedReader br=new BufferedReader(new InputStreamReader(ins));//将客户端那边的信息 放入缓存流
PrintWriter pw=new PrintWriter(ous,true);//通过Socket自带的流将数据输出到客户端

Scanner input=new Scanner(System.in);
String str=null;
do{ //让客户端和服务器一直发送消息
System.out.println("客户端:"+br.readLine());//显示客户端的信息
str=input.nextLine();
pw.println(str); //将信息输出到客户端
}while (!str.equalsIgnoreCase("bye"));
}
}

TCP聊天室

https://blog.csdn.net/sinat_42483341/article/details/97987329

多线程

客户端代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;


/**
*
* 客户端
* 建两个类读、写
*/
public class Client1{

public static void main(String[] args) {
try {

Socket client = new Socket("127.0.0.1", 8888);
System.out.println("***********客户端界面*************");
System.out.println("与服务器连接成功!");
new ClientRead(client).start();
new ClientWrite(client).start();
}catch (IOException e){
e.printStackTrace();
}
}
}

//读服务器信息
class ClientRead extends Thread {
private Socket client;

public ClientRead(Socket client) {
this.client = client;
}

@Override
public void run() {
super.run();
try {
BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream()));
String line = "";
while (true) {
line = br.readLine();
if (!line.isEmpty()) {
System.out.println("服务器说:" + line);
}
if (line.equals("bye")) { //读到bye结束
System.out.println("聊天结束!");
return;
}
}
} catch (IOException e) {
e.printStackTrace();
}

}

}
//写到服务器信息,回应
class ClientWrite extends Thread {
private Socket client;

public ClientWrite(Socket client) {
this.client = client;
}

@Override
public void run() {
super.run();
BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
try {
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
String str = "";
while (true) {
str = input.readLine();
bw.write(str);
bw.newLine();
bw.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

服务器代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;


/**
*
* 服务器
* 建两个类,读写
*/
public class Server1 {

public static void main(String[] args) {
try {
ServerSocket ss = new ServerSocket(8888);
System.out.println("************服务器端界面************");
Socket accept = ss.accept();
System.out.println("与客户端连接成功!");
new ServerRead(accept).start();
new ServerWrite(accept).start();
} catch (IOException e) {
e.printStackTrace();
}

}
}
//读客户端信息线程
class ServerRead extends Thread {
private Socket s;

public ServerRead(Socket s) {
this.s = s;
}

@Override
public void run() {
super.run();
try {
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
String line = "";
while (true) {
line = br.readLine();
if (!line.isEmpty()) {
System.out.println("客户端说:" + line);
}
if (line.equals("bye")) { //读到bye结束
System.out.println("聊天结束!");
return;
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
//回应客户端信息线程,写
class ServerWrite extends Thread {
private Socket socket;

public ServerWrite(Socket socket) {
this.socket = socket;
}

@Override
public void run() {
super.run();
BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
try {
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
String str = "";
while (true) {
str = input.readLine();
bw.write(str);
bw.newLine();
bw.flush();
}

} catch (IOException e) {
e.printStackTrace();
}
}
}

img

img

UDP

示例一

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import org.junit.Test;

import javax.sql.DataSource;
import java.io.IOException;
import java.net.*;

/**
* @author lh
* create 2019-12-15-14:56
*/
public class UDPtest {
@Test
public void sender() throws IOException {
DatagramSocket datagramSocket = new DatagramSocket();
String str = "我是UDP发送";
byte[] data = str.getBytes();
InetAddress inetAddress = InetAddress.getLocalHost();

DatagramPacket datagramPacket = new DatagramPacket(data, data.length, inetAddress, 9090);
datagramSocket.send(datagramPacket);
datagramSocket.close();
}

@Test
public void receiver() throws IOException {
DatagramSocket socket = new DatagramSocket(9090);
byte[] buffer = new byte[100];
DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);
socket.receive(packet);
System.out.println(new String(packet.getData(),0,packet.getLength()));
}
}

示例二

基于UDP的socket编程 单向聊天 与 双向聊天

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
import java.lang.*;

import java.io.IOException;
import java.net.*;
import java.util.Scanner;

/**
* @author lh
* create 2019-12-15-15:43
* UDP 实现客户端和服务器简单聊天
*/
public class UDPClient {
static DatagramSocket socket;
private int port = 8080;
static DatagramPacket packet;

public static void main(String[] args) throws IOException {
new UDPClient().service();
}

private void service() throws IOException {
socket = new DatagramSocket();
System.out.println("************客户端端界面************");
int flag;
while (true) {
flag =send();
if (flag == -1){
System.out.println("程序结束");
return;
}
receive();
}
}

private int send() throws IOException{
Scanner input = new Scanner(System.in);
String context = input.nextLine();
byte[] bytes = context.getBytes();
try {
socket.connect(InetAddress.getByName("localhost"), port);
} catch (UnknownHostException e) {
e.printStackTrace();
}
packet = new DatagramPacket(bytes, bytes.length);
try {
socket.send(packet);
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("client:" + context);
if (context.equals("bye")) {
return -1;
}else return 0;
}

private void receive() {
byte[] b = new byte[100];
packet = new DatagramPacket(b, 0, b.length);
try {
socket.receive(packet);
} catch (IOException e) {
e.printStackTrace();
}
byte[] data = packet.getData();
System.out.println("server:" + new String(data));
if (new String(data).equals("bye")) {
System.out.println("程序结束");
return;
}
}



}

心得体会

  1. 基于Socket的TCP编程:

客户端Socket的工作过程包含以下三个步骤:

(1)创建 Socket :根据指定服务端的 IP 地址或端口号构造 Socket 类对象

(2)打开连接到 Socket 的输入/出流;按照一定的协议对 Socket 进行读/写操作:使用 getInputStream()方法获得输入流,使用 getOutputStream()方法获得输出流,进行数据传输

(3)关闭Socket

服务器程序的工作过程包含以下四个基本的步骤:

(1)调用 ServerSocket(int port) :创建一个服务器端套接字,并绑定到指定端口 上。用于监听客户端的请求

(2)调用 accept():监听连接请求

(3)调用 该Socket类对象的 getOutputStream() 和 getInputStream ():获取输出流和输入流

(4)关闭ServerSocket和Socket对象

2.编程中用到了IO 流的一些知识。socket编程中用Socket类对象的 getOutputStream() 和 getInputStream ()获取输出流和输入流,之后要用别的流来包装它。在读取字符时,使用字节流比较好,因此可以先用转换流inputstreamread包装getInputStream (),然后再用缓冲流包装。OutputStream功能并不强大,但是可以和java.io.PrintStream类配合使用,使之能够输出一行。

3.UDP是不可靠的,如果你先运行UDP客户端,它是不会有异常的,它只管发;而使用TCP的时候,它是会去握手的,如果没有连接上会抛出异常。

4.写代码的时候要记得写好程序结束的代码。单线程可以用retrun返回特殊值来标识结束。

参考:

https://blog.csdn.net/Chianz632/article/details/80018531

https://blog.csdn.net/qq_40791843/article/details/90675746

https://blog.csdn.net/sinat_42483341/article/details/97987329

简单的排序算法(数组,链表存储)

Posted on 2019-12-11 | In 算法

冒泡排序:

数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
void bublletSort(int a[],int len)

{

int temp;

for(int i=0;i<len-1;i++)

{

for(int j=0;j<len-i;j++)

{

if(a[j]>a[j+1])

{

temp = a[j];

a[j] = a[j+1];

a[j+1] = temp;

}

}

}

}

链表

1
2
3
4
5
6
7
8
9
10
11
12
13
void BubbletSort(LNode *head) 
{
LNode *p,*q;
int s;
for(p=head->next;p!=NULL;p=p->next)
for(q=p->next;q!=NULL;q=q->next)
if((p->data)>(q->data))
{
s=p->data;
p->data = q->data;
q->data = s;
}
}

插入

(原理)[https://blog.csdn.net/huangyimo/article/details/80888999]

数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
void insertSort(int a[],int n)

{

for(int i=1;i<n;i++)

{

int key=a[i];//key 为哨兵 待插入的数据放入哨兵中

int j=i-1;

while(j>=0&&a[j]>key)//从哨兵开始从右往左开始遍历

{

a[j+1] = a[j];//数据往后移动一个位置

j--;//从key开始遍历,j--表示往前移动一个位置,直至寻找到一个a[j]小于key

}

a[j+1] = key;

}

}

链表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
void InsertSort(LNode *L){

LNode *p,*r,*q;

p=L->next; //表头的下一个,就是第一个,看作已经排好

q=p->next;//q保存p的后继 //q是第二个

p->next=NULL; //已排好的部分的最后一个元素的next为null,这样就能知道一次比较是否到头。

p=q;

while(p!=NULL){

q=p->next; //每次保存等待比较元素的下一条

r=L;

while(r->next!=NULL&&r->next->data<p->data){

r=r->next; //比他小就下一个,从左往右

}
//开始勾连,维护链表

p->next = r->next; //插进去

r->next = p;

p=q; //利用保存的q,将p指向下一个要排序的

}

}

选择排序

原理参考:

[[选择排序(数组实现)]]: https://blog.csdn.net/weixin_41362649/article/details/81901091

数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void selectSort(int a[],int len)
{
int minindex,temp;//minindex-哨兵 temp-暂存空间
for(int i=0;i<len;i++)
{
minindex=i;//设置哨兵为当前位置元素
for(int j=i+1;j<len;j++)
{
if(a[j]<a[minindex]) minindex=j;//从左往右遍历哨兵(当前位置元素)往右的元素
//找到比哨兵(当前位置元素)小的元素,把哨兵的位置让给它
//找到的这个元素是数组中最小的元素
}

//a[i]与哨兵(最小的元素)交换位置
temp = a[i];//a[i]为当前位置的元素,temp为暂存空间
a[i] = a[minindex];
a[minindex] = temp;
}
}

链表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52

void SelectSort(LinkList &L)//简单选择排序

{

LinkList p = L->next;

LinkList minindex;//设置一个节点minindex

LinkList q;

int temp;

while(p)//从第一个节点开始遍历

{

q=p->next;//第一个节点往右的节点

minindex=p;//设置当前p指针为最小,为这一趟选择排序开始的位置

while(q)//

{

if(q->data<minindex->data) minindex=q;//在本趟中寻找最小的那个数



q=q->next;



}

if(minindex!=p)//判断最小的数是否为当前的节点p

{

temp = minindex->data;

minindex->data = p->data;

p->data = temp;

}

p=p->next;

}

}

快速排序

(快速排序原理)[https://www.cnblogs.com/CBDoctor/articles/4077574.html]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# include<iostream>
# include<cstdlib>
using namespace std;

void quickSort(int a[],int left,int right)
{
int i,j,t,temp;
if(left>=right) //作为后面递归结束的判断依据
return;
temp=a[left];//temp为基准数,该
i=left;//i相当于左边的哨兵
j=right;//j相当于右边的哨兵
while(i!=j)
{
//从右往左开始寻找比temp小的数,直至找到为止
while(a[j]>=temp&&i<j) j--;

//从左往右开始寻找比temp大的数,直至找到为止
while(a[i]<=temp&&i<j) i++;
if(i<j)//交换位置
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
a[left]=a[i];//基准数归位
a[i]=temp;
quickSort(a,left,i-1);
quickSort(a,i+1,right);
}

int main()
{
int a[] = { 3,1,4,5,2,8,7,9,6,0 };

int n=10;
quickSort(a,0,9);

for (int i = 0; i < 10; i++)
{
cout << a[i] << " ";

}
cout << endl;
return 0;
}

摘自:

https://c0okb.github.io/2019/11/19/%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95%E6%80%BB%E7%BB%93/

java基础-IO流

Posted on 2019-11-25 | Edited on 2019-11-30 | In java基础

file类

文件需要用一个对象表示,那这就需要file类来创建对象了。

java.io.File类:文件和文件目录路径的抽象表示形式,与平台无关

file类的理解

1.File类的一个对象,代表一个文件或一个文件目录

2.File类声明在java.io下

3.File类中涉及到关于文件或文件目录的创建、删除、重命名、修改时间、文件大小等方法,并未涉及到写入或读取文件内容的操作。如果需要读取或写入文件内容,必须使用IO流来完成。

4.后续File类的对象常会作为参数传递到流的构造器中,指明读取或写入的“终点”。

file类的实例化

1.常用构造器

File(String filepath)

File(String parentPath,String childPath)

File(File parentFile,String childPath)

2.路径:

相对路径,绝对路径

注意:

IDEA下:

如果使用JUnit中的单元测试方法测试,相对路径即为当前Module下。

如果使用main方法测试,相对路径即为当前的Project下。

eclipse下:

相对路径都是Project下

3.路径分隔符

windows和DOS系统默认使用“\”来表示

UNIX和URL使用“/”来表示

Java程序支持跨平台运行,因此路径分隔符要慎用。

4.常用方法

File类的获取功能

public String getAbsolutePath():获取绝对路径

public String getPath() :获取路径

public String getName() :获取名称

public String getParent():获取上层文件目录路径。若无,返回null

public long length() :获取文件长度(即:字节数)。不能获取目录的长度。

public long lastModified() :获取最后一次的修改时间,毫秒值

public String[] list() :获取指定目录下的所有文件或者文件目录的名称数组

public File[] listFiles() :获取指定目录下的所有文件或者文件目录的File数组

File类的重命名功能

public boolean renameTo(File dest):把文件重命名为指定的文件路径

File类的判断功能

public boolean isDirectory():判断是否是文件目录

public boolean isFile() :判断是否是文件

public boolean exists() :判断是否存在

public boolean canRead() :判断是否可读

public boolean canWrite() :判断是否可写

public boolean isHidden() :判断是否隐藏

File类的创建功能

public boolean createNewFile() :创建文件。若文件存在,则不创建,返回false

public boolean mkdir() :创建文件目录。如果此文件目录存在,就不创建了。 如果此文件目录的上层目录不存在,也不创建。

public boolean mkdirs() :创建文件目录。如果上层文件目录不存在,一并创建
注意事项:如果你创建文件或者文件目录没有写盘符路径,那么,默认在项目 路径下。

File类的删除功能

public boolean delete():删除文件或者文件夹 删除注意事项: Java中的删除不走回收站。 要删除一个文件目录,请注意该文件目录内不能包含文件或者文件目录

JavaIO流

原理

输入input:读取外部数据(磁 盘、光盘等存储设备的数据)到 程序(内存)中。
输出output:将程序(内存) 数据输出到磁盘、光盘等存储设 备中。

我们应该站在程序(内存)的角度,分清使用输入还是输出。

流的分类

按操作数据单位不同分为:字节流(8 bit),字符流(16 bit)

字符流适用于文本 (例如 .txt,.cpp),

字节流适用于 图,视频等

按数据流的流向不同分为:输入流,输出流

按流的角色的不同分为:节点流,处理流

直接作用于文件上的是节点流

包了一层流的,外面的流就是处理流。

1574940557657

其中前面两行(抽象基类,访问文件)是节点流

InputStream & Reader
  • InputStream 和 Reader 是所有输入流的基类。
  • InputStream(典型实现:FileInputStream)
    • int read()

    • int read(byte[] b)

    • int read(byte[] b, int off, int len)

  • Reader(典型实现:FileReader)

    • int read()
    • int read(char [] c)

    • int read(char [] c, int off, int len)

  • 程序中打开的文件 IO 资源不属于内存里的资源,垃圾回收机制无法回收该资 源,所以应该显式关闭文件 IO 资源。

  • FileInputStream 从文件系统中的某个文件中获得输入字节。FileInputStream 用于读取非文本数据之类的原始字节流。要读取字符流,需要使用 FileReader

InputStream
  • int read() 从输入流中读取数据的下一个字节。返回 0 到 255 范围内的 int 字节值。如果因 为已经到达流末尾而没有可用的字节,则返回值 -1。

  • int read(byte[] b) 从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。如果因为已 经到达流末尾而没有可用的字节,则返回值 -1。否则以整数形式返回实际读取 的字节数。

  • int read(byte[] b, int off,int len) 将输入流中最多 len 个数据字节读入 byte 数组。尝试读取 len 个字节,但读取 的字节也可能小于该值。以整数形式返回实际读取的字节数。如果因为流位于 文件末尾而没有可用的字节,则返回值 -1。

  • public void close() throws IOException 关闭此输入流并释放与该流关联的所有系统资源

Reader
  • int read() 读取单个字符。作为整数读取的字符,范围在 0 到 65535 之间 (0x00-0xffff)(2个 字节的Unicode码),如果已到达流的末尾,则返回 -1
  • int read(char[] cbuf) 将字符读入数组。如果已到达流的末尾,则返回 -1。否则返回本次读取的字符数。

  • int read(char[] cbuf,int off,int len) 将字符读入数组的某一部分。存到数组cbuf中,从off处开始存储,最多读len个字 符。如果已到达流的末尾,则返回 -1。否则返回本次读取的字符数。

  • public void close() throws IOException 关闭此输入流并释放与该流关联的所有系统资源

Reader
  • int read() 读取单个字符。作为整数读取的字符,范围在 0 到 65535 之间 (0x00-0xffff)(2个 字节的Unicode码),如果已到达流的末尾,则返回 -1
  • int read(char[] cbuf) 将字符读入数组。如果已到达流的末尾,则返回 -1。否则返回本次读取的字符数。
  • int read(char[] cbuf,int off,int len) 将字符读入数组的某一部分。存到数组cbuf中,从off处开始存储,最多读len个字 符。如果已到达流的末尾,则返回 -1。否则返回本次读取的字符数。
  • public void close() throws IOException 关闭此输入流并释放与该流关联的所有系统资源。
OutputStream & Writer
  • OutputStream 和 Writer 也非常相似:

    • void write(int b/int c);

    • void write(byte[] b/char[] cbuf);

    • void write(byte[] b/char[] buff, int off, int len); void flush(); void close(); 需要先刷新,再关闭此流

  • 因为字符流直接以字符作为操作单位,所以 Writer 可以用字符串来替换字符数组, 即以 String 对象作为参数

    • void write(String str);
    • void write(String str, int off, int len);
  • FileOutputStream 从文件系统中的某个文件中获得输出字节。FileOutputStream 用于写出非文本数据之类的原始字节流。要写出字符流,需要使用 FileWriter
OutputStream
  • void write(int b) 将指定的字节写入此输出流。write 的常规协定是:向输出流写入一个字节。要写 入的字节是参数 b 的八个低位。b 的 24 个高位将被忽略。 即写入0~255范围的。

  • void write(byte[] b) 将 b.length 个字节从指定的 byte 数组写入此输出流。write(b) 的常规协定是:应该 与调用 write(b, 0, b.length) 的效果完全相同。

  • void write(byte[] b,int off,int len) 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。

  • public void flush()throws IOException 刷新此输出流并强制写出所有缓冲的输出字节,调用此方法指示应将这些字节立 即写入它们预期的目标。

  • public void close() throws IOException 关闭此输出流并释放与该流关联的所有系统资源

Writer
  • void write(int c) 写入单个字符。要写入的字符包含在给定整数值的 16 个低位中,16 高位被忽略。 即 写入0 到 65535 之间的Unicode码。
  • void write(char[] cbuf) 写入字符数组。
  • void write(char[] cbuf,int off,int len) 写入字符数组的某一部分。从off开始,写入len个字符
  • void write(String str) 写入字符串。
  • void write(String str,int off,int len) 写入字符串的某一部分。
  • void flush() 刷新该流的缓冲,则立即将它们写入预期目标。
  • public void close() throws IOException 关闭此输出流并释放与该流关联的所有系统资源

节点流

读写文件

读取文件

1.建立一个流对象,将已存在的一个文件加载进流。

FileReader fr = new FileReader(new File(“Test.txt”));
2.创建一个临时存放数据的数组。

char[] ch = new char[1024];
3.调用流对象的读取方法将流中的数据读入到数组中。

fr.read(ch);

4.关闭资源。

fr.close();

注意点

  • 定义文件路径时,注意:可以用“/”或者“\”。
  • 在写入一个文件时,如果使用构造器FileOutputStream(file),则目录下有同名文 件将被覆盖。  如果使用构造器FileOutputStream(file,true),则目录下的同名文件不会被覆盖, 在文件内容末尾追加内容。
  • 在读取文件时,必须保证该文件已存在,否则报异常。
  • 字节流操作字节,比如:.mp3,.avi,.rmvb,mp4,.jpg,.doc,.ppt
  • 字符流操作字符,只能操作普通文本文件。最常见的文本文 件:.txt,.java,.c,.cpp 等语言的源代码。尤其注意.doc,excel,ppt这些不是文 本文件

写入文件

1.创建流对象,建立数据存放文件

FileWriter fw = new FileWriter(new File(“Test.txt”));
2.调用流对象的写入方法,将数据写入流

fw.write(“atguigu-songhongkang”);
3.关闭流资源,并将流中的数据清空到文件中。

fw.close();

字符流

练习 FileReaderWriter

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
package IO;

import org.junit.Test;
import sun.reflect.generics.tree.VoidDescriptor;

import javax.annotation.processing.Filer;
import java.io.*;

/**
* @author lh
* create 2019-11-28-19:54
*/
public class FileReaderWriterTest {
/*
1.read的理解:返回读入的一个字符,如果达到文件末尾,返回-1; 如:读a 返回97,所以我们可以使用(char)转一下,就是a了
2.异常的处理:为了保证流资源一定可以执行关闭操作。需要使用try-catch-finally处理
3.读入的文件要存在,不然报异常
*/

@Test
public void testFileReader() {
FileReader fileReader = null;
try {
//1.实例对象
File file = new File("hello.txt");
//2.提供具体的流
fileReader = new FileReader(file);

//3.数据读入
int data;
while ((data = fileReader.read()) != -1) {
System.out.print((char) data);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fileReader != null)
fileReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

//对read()操作升级:使用read的重载方法
@Test
public void testFileReadeer1() {
FileReader fileReader = null;
try {
File file = new File("hello.txt");
fileReader = new FileReader(file);

char[] cbuf = new char[5];
int len;
while ((len = fileReader.read(cbuf)) != -1) {
//方式一:
//错误的写法,因为数组是覆盖的写入,空的没进行覆盖,就会输出之前的字符
// for (int i = 0; i < cbuf.length; i++) {
// System.out.print(cbuf[i]);
// }
//输出:
/*
hello word

hello123lo1
*/
// for (int i = 0; i < len; i++) { //正确写法
// System.out.print(cbuf[i]);
// }
//方式二:
//错误的,和上面错误一样
// String str = new String(cbuf);
// System.out.print(str);
//正确写法:
String str = new String(cbuf, 0, len);
System.out.print(str);

}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fileReader != null) {

try {
fileReader.close();
} catch (IOException e) {
e.printStackTrace();
}

}
}


}

/*
输出操作对应的file可以不存在,在输出的过程中自动创建。
如果存在,
1.如果构造器是:FileWriter(file,false)或者FileWriter(file) :
覆盖。(文件覆盖,就算覆盖前文件比较长,也全覆盖。)
2.如果构造器是:FileWriter(file,true),原有的基础上追加输出

*/
@Test
public void testFileWrite() {
FileWriter fw = null;
try {
File file = new File("hello1.txt");
fw = new FileWriter(file, false);
fw.write("have gg");
// fw.write("good" );
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fw != null) {
try {
fw.close(); //不关闭的话,会发现文件创建了但是空的。
} catch (IOException e) {
e.printStackTrace();
}
}
}

}

@Test
public void testFileReaderWriter() throws IOException {
FileReader fr = null;
FileWriter fw = null;
try {
File src = new File("hello.txt");
File des = new File("hello2.txt");

fr = new FileReader(src);
fw = new FileWriter(des);

//数据的读入和写出操作
char[] cbuf = new char[5];
int len;
while ((len = fr.read(cbuf))!= -1 ){
//每次写出len个字符
fw.write(cbuf,0,len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//关闭流
//1.
/*
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
*/

//2
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

}

字节流

FileIOstream

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
package IO;

import org.junit.Test;

import java.io.*;

/**
* @author lh
* create 2019-11-26-20:16
*/
public class FileIOstream {
@Test
//使用字节流 FileInput处理字节文件可能出现乱码
public void testFileInputOutputStreamTest() {
FileInputStream fileInputStream = null;
FileInputStream fis = null;

try {
//1.造文件
File file = new File("hello.txt");

//2.造流
fis = new FileInputStream(file);

//3.读数据
byte[] buffer = new byte[5];
int len;
while ((len = fis.read(buffer)) != -1) {
String str = new String(buffer, 0, len);
System.out.print(str);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Test
/*
实现对图的复制操作
*/
public void testFileInputOutputStream(){
FileInputStream fis = null;
FileOutputStream fos = null;
try {
File src = new File("1.jpg");
File des = new File("2.jpg");

fis = new FileInputStream(src);
fos = new FileOutputStream(des);

//复制
int len;
byte[] buffer =new byte[5];
while ((len = fis.read(buffer)) != -1) {

fos.write(buffer,0,len);
//因为不能字节输出数组到屏幕,所以创建一个str字符串来获取数据用以输出或者for来完成,但是write有处理数组的能力所以不用。
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

//指定路径改下文件的复制
public void copeFile(String srcpath,String despath){
FileInputStream fis = null;
FileOutputStream fos = null;
try {
File src = new File(srcpath);
File des = new File(despath);

fis = new FileInputStream(src);
fos = new FileOutputStream(des);

//复制
int len;
byte[] buffer =new byte[1024];
while ((len = fis.read(buffer)) != -1) {

fos.write(buffer,0,len);
//因为不能字节输出数组到屏幕,所以创建一个str字符串来获取数据用以输出或者for来完成,但是write有处理数组的能力所以不用。
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}

}
@Test
public void testCopefile(){
long start = System.currentTimeMillis();
String srcpath = "C:\\Users\\华\\Desktop\\1.avi";
String descpath = "C:\\Users\\华\\Desktop\\2.avi";
copeFile(srcpath,descpath);

long end =System.currentTimeMillis();

System.out.println("复制操作花费的时间为" +(end - start));
}
}

1.read的理解:

2

最简单的read():

返回读入的一个字符,如果达到文件末尾,返回-1; 如:读a 返回97,所以我们可以使用(char)转一下,就是a了

read(char[] buf):返回每次读入数值的字符个数,如果到末尾,返回-1,每次将读到的赋给buf数组

1574944758898

2.异常的处理:

为了保证流资源一定可以执行关闭操作。需要使用try-catch-finally处理

文件复制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
//指定路径改下文件的复制
public void copeFile(String srcpath,String despath){
FileInputStream fis = null;
FileOutputStream fos = null;
try {
File src = new File(srcpath);
File des = new File(despath);

fis = new FileInputStream(src);
fos = new FileOutputStream(des);

//复制
int len;
byte[] buffer =new byte[1024];
while ((len = fis.read(buffer)) != -1) {

fos.write(buffer,0,len);
//因为不能字节输出数组到屏幕,所以创建一个str字符串来获取数据用以输出或者for来完成,但是write有处理数组的能力所以不用。
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}

}
@Test
public void testCopefile(){
long start = System.currentTimeMillis();
String srcpath = "C:\\Users\\华\\Desktop\\1.avi";
String descpath = "C:\\Users\\华\\Desktop\\2.avi";
copeFile(srcpath,descpath);

long end =System.currentTimeMillis();

System.out.println("复制操作花费的时间为" +(end - start));
}

字符流与字节流的使用:

1.对于文本文件(.txt, .java, .cpp, .c)使用字符流处理

2.对于非文本文件(.jpg, .mp3, .mp4, .avi, .doc, .ppt, ……)使用字节流处理

处理流

缓冲流buffer

1.

BufferedInputStream
BufferedOutputStream
BufferedReader
BufeeredWriter

2.作用:
提供流的读取,写入的速度

3.处理流,就是“套接”在已有的流的基础上

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
package IO;

import org.junit.Test;

import java.io.*;

/**
* 1.
* BufferedInputStream
* BufferedOutputStream
* BufferedReader
* BufeeredWriter
* <p>
* 2.作用:
* 提供流的读取,写入的速度
* <p>
* 3.处理流,就是“套接”在已有的流的基础上
*
* @author lh
* create 2019-11-29-19:03
*/
public class BufferedTest {
/*
实现非文件的复制
*/
@Test
public void testcopy() {
long start = System.currentTimeMillis();
String srcpath = "C:\\Users\\华\\Desktop\\1.avi";
String descpath = "C:\\Users\\华\\Desktop\\3.avi";
copyBufferedStreamTest(srcpath, descpath);
long end = System.currentTimeMillis();

System.out.println("复制操作花费的时间为" + (end - start));
}

public void copyBufferedStreamTest(String srcpath, String despath) {
BufferedInputStream bufferedInputStream = null;
BufferedOutputStream bufferedOutputStream = null;


try {
//1.造文件
File srcf = new File(srcpath);
File descf = new File(despath);

//2.造流
//2.1 造节点流
FileInputStream fileInputStream = new FileInputStream(srcf);
FileOutputStream fileOutputStream = new FileOutputStream(descf);

//2.2造缓冲流
bufferedInputStream = new BufferedInputStream(fileInputStream);
bufferedOutputStream = new BufferedOutputStream(fileOutputStream);


//3.复制的细节:读取,写入
byte[] buffer = new byte[1024];
int len;
while ((len = bufferedInputStream.read(buffer)) != -1) {
bufferedOutputStream.write(buffer, 0, len);

}
} catch (IOException e) {
e.printStackTrace();
} finally {
//资源的关闭
//要求:先关闭外层的流,再关闭,内层的流
if (bufferedInputStream != null) {

try {
bufferedOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bufferedInputStream != null) {
try {
bufferedInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}

}
//说明:在关闭外层的流的同时,内层流也会自动的进行关闭。关于内层流的关闭,可以省略
// fileInputStream.close();
// fileOutputStream.close();
}

}

@Test
public void testBufferedRW() {
BufferedReader bufferedReader = null;
BufferedWriter bufferedWriter = null;

try {
/*
使用BufferedReader和BufferedWriter
*/
bufferedReader = new BufferedReader(new FileReader(new File("hello.txt")));
bufferedWriter = new BufferedWriter(new FileWriter(new File("hello3.txt")));

//读写
// //方式一:使用char[]数组
// char[] cbuf = new char[1024];
//
// int len;
// while ((len = bufferedReader.read(cbuf)) != -1) {
// bufferedWriter.write(cbuf, 0, len);
// // bufferedWriter.flush();
// }

//方式二
String data;
while ((data = bufferedReader.readLine()) != null) {
// //方法一
// bufferedWriter.write(data +"\n"); //data中不包含换行符

//方法二
bufferedWriter.write(data);
bufferedWriter.newLine();

}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (bufferedReader != null) {
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bufferedWriter != null) {
try {
bufferedWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}

转换流

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package IO;
import org.junit.Test;

import java.io.*;

/**
* 处理流之二:转换流的使用
* 1.转换流 :属于字符流
* InputStreamReader:将一个字节的输入流转换为字符的输入流
* OutputSreamWriter:将一个字符的输出流转换为字节的输出流
* <p>
* 2.作用:提供字节流与字符流之间的转换
* <p>
* 3.解码:字节、字节数组 -->字符数组、字符串
* 编码:字符数组、字符串 -->字节、字节数组
*
* 4.字符集
* ASCII美国信息交换标准代码。
* 用1个字节的7可以表示。
* ISO8859-1:拉丁码表。欧洲码表
* 用一个字节的8位表示。
* GB2312:中国中文编码表。最多两个字节编码所有字符。
* GBK:中国的中文编码表升级,融合了更多的中文文字符号。最多两个字节编码。
* Unicode:国际标准编码,融合了目前人类使用的所有字符。为每个字符分配唯一的字符码。所有的文字都用两个字节来表示。2 16
* UTF-8:变长的编码方式,可以用1-4个字节来表示一个字符。(中文3个字节)
*
*
* @author lh
* create 2019-11-30-12:42
*/
public class InputsreamReaderTest {
@Test
//实现字节输入流到字符输出流的转换
//处理异常应该使用try-chatch-finnally,这里就不改了
public void test1() throws IOException {
FileInputStream fis = new FileInputStream("dbcp.txt");
// InputStreamReader isr =new InputStreamReader(fis);//使用系统默认的字符集
//参数2指明了字符集
InputStreamReader isr = new InputStreamReader(fis, "UTF-8"); //使用哪个字符集取决于文件本身的字符集

char[] cbuf = new char[20];
int len;
while ((len = isr.read(cbuf)) != -1) {
String str = new String(cbuf, 0, len);
System.out.print(str);
}
if (isr != null) {
isr.close();
}
}

@Test
//处理异常应该使用try-chatch-finnally,这里就不改了
public void test2() throws IOException {
//1.造文件、造流
File file1 = new File("dbcp.txt");
File file2 = new File("dbcp_gbk.txt");

FileInputStream fis = new FileInputStream(file1);
FileOutputStream fos = new FileOutputStream(file2);

InputStreamReader isr = new InputStreamReader(fis,"utf-8");
OutputStreamWriter osw= new OutputStreamWriter(fos,"gbk");

//2.读写过程
char[] cbuf = new char[20];
int len;
while ((len = isr.read(cbuf)) != -1) {
osw.write(cbuf, 0, len);
}

//3.关闭
isr.close();
osw.close();
//关闭操作时要注意关闭的对象,关错了会导致复制的文件为空。

}
}

标准输入输出流

  • System.in和System.out分别代表了系统标准的输入和输出设备

  • 默认输入设备是:键盘,输出设备是:显示器

  • System.in的类型是InputStream

  • System.out的类型是PrintStream,其是OutputStream的子类

    FilterOutputStream 的子类

  • 重定向:通过System类的setIn,setOut方法对默认设备进行改变。

    • public static void setIn(InputStream in)

    • public static void setOut(PrintStream out)

打印流

实现将基本数据类型的数据格式转化为字符串输出
打印流:PrintStream和PrintWriter

  • 提供了一系列重载的print()和println()方法,用于多种数据类型的输出
  • PrintStream和PrintWriter的输出不会抛出IOException异常
  • PrintStream和PrintWriter有自动flush功能
  • PrintStream 打印的所有字符都使用平台的默认字符编码转换为字节。 在需要写入字符而不是写入字节的情况下,应该使用 PrintWriter 类。
  • System.out返回的是PrintStream的实例

数据流

为了方便地操作Java语言的基本数据类型和String的数据,可以使用数据流。

数据流有两个类:(用于读取和写出基本数据类型、String类的数据)

  • DataInputStream 和 DataOutputStream

  • 分别“套接”在 InputStream 和 OutputStream 子类的流上

DataInputStream中的方法

boolean readBoolean()        byte readByte()

char readChar()            float readFloat()

double readDouble()         short readShort()

long readLong()           int readInt()

String readUTF()           void readFully(byte[] b)

DataOutputStream中的方法

将上述的方法的read改为相应的write即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package IO;

import org.junit.Test;


import javax.naming.Name;
import javax.swing.*;
import java.io.*;

/**
* 数据流:用于读取或写入基本数据类型的变量或字符串
* @author lh
* create 2019-11-30-17:07
*/
public class DataStream {
@Test
//将内存中的字符串、基本数据类型的变量写出到文件中
public void test1() throws IOException {
//1.
DataOutputStream dos = new DataOutputStream(new FileOutputStream("data.txt"));

//2.
dos.writeUTF("小王");
dos.flush(); //刷新操作,将内存中的数据写入文件
dos.writeInt(23);
dos.flush();
dos.writeBoolean(true);
dos.flush();

//3.
dos.close();
}
/*
将文件中存储的基本数据类型变量和字符串读取到内存中,保存在变量中。
注意点:读取不同类型的数据的顺序要与当初写入文件时,保存的数据的顺序一致。
*/
@Test
public void test2() throws IOException {
//1.
DataInputStream dis = new DataInputStream(new FileInputStream("data.txt"));

//2.
String str = dis.readUTF();
int age = dis.readInt();
boolean ismale = dis.readBoolean();

System.out.println("name = " + str);
System.out.println("age = " + age);
System.out.println("is male ="+ ismale);
}
}

对象流

ObjectInputStream和OjbectOutputSteam

用于存储和读取基本数据类型数据或对象的处理流。它的强大之处就是可以把Java中的对象写入到数据源中,也能把对象从数据源中还原回来。

  • 序列化:用ObjectOutputStream类保存基本类型数据或对象的机制
  • 反序列化:用ObjectInputStream类读取基本类型数据或对象的机制
  • ObjectOutputStream和ObjectInputStream不能序列化static和transient修 饰的成员变量

小结

  • 一、流的分类:

  • 1.操作数据单位:字节流、字符流

  • 2.数据的流向:输入流、输出流

  • 3.流的角色:节点流、处理流

  • 二、流的体系结构

​

抽象基类 节点流(或文件流) 缓冲流(处理流的一种)
InputStream FileInputStream (read(byte[] buffer)) BufferedInputStream (read(byte[] buffer))
OutputStream FileOutputStream (write(byte[] buffer,0,len) BufferedOutputStream (write(byte[] buffer,0,len) / flush()
Reader FileReader (read(char[] cbuf)) BufferedReader (read(char[] cbuf) / readLine())
Writer FileWriter (write(char[] cbuf,0,len) BufferedWriter (write(char[] cbuf,0,len) / flush()

处理流的输出有一个刷新功能,如:

在BufferedOutputStream中有一个flush()方法:刷新缓冲区

补充:字符集

1575100285486

1575100352643

java基础-thread

Posted on 2019-11-13 | Edited on 2019-11-25 | In java基础

thread

原理

实现多线程有两种方法,第一个方法是使用继承thread,使用thread子类来创建线程,第二种是使用runnable接口。
第一个比较简单,其实thread也是有接口的,通过查thread类可以发现,在最前面有

1
2
public
class Thread implements Runnable {

说明他也是用到Runnable接口的.thread的子类重写了run方法,然后thread又是用到Runnable接口。这才实现了线程。

而使用第二个方式时候设计到一个东西:

1
2
3
public Thread(Runnable target) {
init(null, target, "Thread-" + nextThreadNum(), 0);
}

接着看

1
2
3
4
5
6
@Override
public void run() {
if (target != null) {
target.run();
}
}

例如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class MyThread implements Runnable{
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
public class ThreadTest {
public static void main(String[] args) {
MyThread myThread =new MyThread();
Thread t1 = new Thread(myThread) ;
t1.start();

Thread t2 = new Thread(myThread) ;
t2.start();
}


}

我们给thread传了一个参数(myThread对象),所有它的target!=null。 所以thread类调用的是target的run方法(即这里的myThread的run方法)。

注意

1.线程执行需要使用start方法,不能用run方法

比较:

1.实现的方式没有内地单继承性的局限性
2.实现的方式更适合来处理多个线程共享数据的情况

相同点:
都需要重写run方法,线程要执行的逻辑声明在run方法中。都使用start启动

misc刷题

Posted on 2019-10-24

知识点

CTF密码学常见加解密总结
CTF中Crypty(密码类)入门必看

ctf从零到入门0x04:(转载)ctf中最全的(脑洞大开的加密方法)

CTF隐写总结!
CTF常用隐写套路

bugku

隐写

解压得到一张图片,放在winhex里看看
89 50 4E 47PE头是png照片的,就是说没有可能照片中嵌入了Exif信息

在查看PNG文件格式时,IHDR后面的八个字节就是宽高的值

将图片放在Linux下,发现是打不开的,说明图片被截了
将图片的高改成和宽一样,即将A4改成F4,然后另存为

打开刚存的图片就可以得到FLAG了

隐写2

一样binwalk分离
得到一个需要密码的flag.rar,根据提示,密码是纯数字,直接爆破就好了。

解压后,得到的图片扔进winhex,发现疑似flag: f1@g{eTB1IEFyZSBhIGhAY2tlciE=}
还需要再base64解码一下。
解码的时候,不能带flag和{}字符

telnet

解压得到一个后缀是pcap的文件,直接wireshark打开,根据题目提示,直接找telnet,然后点追踪流,ok。

眼见非实

放到winhex中,发现有50 4B 03 04这是压缩文件的头,还有.docx格式文件,应该压缩包里有一个文档,改文件后缀为.zip,解压得到文档.

得到眼见非实.docx是打不开的,放到winhex中发现还是zip格式的文件
继续改后缀为.zip,然后解压得到一个文件夹
然后在word->document.xml中找到了flag

啊哒

解压后发现一个图片
,应该是有别的东西,分离试一下。

分离出压缩包,然而需要密码。又要爆破?但是没有提示啊,扔进winhex看一下,发现

改成txt试一试,发现什么鬼?

。。。。原来密码要靠前面的东西。
在最开始的图片,查看属性:

这个东西拿去转一下

十六进制转文本,发现密码?

成功了。。。。。。

又是一张

放到winhex发现这个 Exif
老方法:分离
emm不知道为啥分离信息有了,就是没有出现预计的东西。一个都没有。跟着大佬们用kali做一下分离
成功了,kali就是厉害啊

分离好之后,就出来flag了

猜

直接百度搜图

宽带泄露

提示信息,之后会用到

发现下载的是一个 conf.bin的文件,百度后发现是路由器的备份配置文件,用工具Router_Pass_View可以直接打开

之后由于提示是宽带用户名,直接 ctrl+F 搜索 username 即可得到 flag

多种方法解决

关键字 image:data:image/jpg;base64,
尝试过改成图片格式,不行。
查看之后发现,是用解密,然后转图(二维码)
转成txt文件,然后解密
在线解密转图网站:http://imgbase64.duoshitong.com/

还是要联系题目提示呀。 这样比较容易想到是利用base64转二维码

linux

解压后,得到一个flag文件。但是需要别的程序才能打开。
emm,题目提示为linux基础,可以说是毫无基础咯。
竟然可以这样操作。。。。。

linux2

这是提示。

emm,倒腾了一会。
结果竟然只是用winhex查找文本就找到flag。
和linux有啥关系噢。这名字取的,感觉在误导。


隐写3

emm没分离出来
winhex查看,果然比较纯。
看到IHDR,结合这个图片,确实有可能下面被隐藏了,改一下大小。
ok,看到flag。

竟然和之前的题一样!!!

爆照

binwalk分离后,有好多8.
而且还有一个提示:排序。
打开第一个8文件发现,末尾有flag四个字符,那再去别的文件找找?
结果并没有这么简单的拼接flag。别的文件并没有像flag的字符。但是我发现88这个文件有熟悉的几个字符:exif 说明可以再分离。那应该是8这个文件分离一次,88分离两次以此类推!
emm,还以为我推理错了,结果只是windows下不太行。
kali掏出来,放到kali里面还能看到88这个文件有二维码?可以啊,linux还是很给力的东西啊。

好的,我推理不太正确。那个88文件,二维码直接扫就好了。

但是这些文件确实有包含东西。

发现8888可以分离出压缩包,搞起!解压发现二维码,扫描出东西。

888这个文件原来要看属性。emm看来要养成有事没事看属性的习惯。
查看属性,没看到啥。emm果然要改成图片,才能看到有用的信息。

也有大佬说
通过vim查看888文件,包含<?xpacket begin ……,这是图片一些有关图像属性的信息。

所以改成图片看属性。

base64搞一下

然后就开始组合flag了
根据提示:flag格式 flag{xxx_xxx_xxx}
得:flag{bilibili_silisili_panama}

可以可以,这题有点东西emm

想蹭网先解密码

根据提示,可以补全手机号码。别的我就不知道了。

题解:
首先下载wifi.cap 文件,密码为手机号,给了前7位1391040,电话号码一共11位,用脚本生成一个四位数的密码然后加入前缀就是我们的密码字典文件了。
跑脚本:

1
2
3
4
5
6
7
8
9
10
11
## -*- coding: utf-8 -*-
## w 写模式,它是不能读的,如果用w模式打开一个已经存在的文件,会清空以前的文件内容,重新写
## w+ 是读写内容,只要沾上w,肯定会清空原来的文件
with open('wordlist.txt','w+') as f:
for i in range(0,10):
for j in range(0,10):
for k in range(0,10):
for h in range(0,10):
f.write('1391040'+str(i)+str(j)+str(k)+str(h)+'\n')

f.close

得到我们的字典:wordlist.txt

大佬说:

首先放到wireshark查找,发现很多802.11协议,然后百度了一下802.11具体是啥,然后wifi认证的话重点是在WPA的四次握手,也就是eapol协议的包,使用规则过滤

然后可以利用wifi.cap专用破解工具aircrack-ng -w “字典文件” “.cap 文件”进行破解 wifi.cap 文件密码。得到 KEY。

选择第3个,WPA

图穷匕见

图穷flag见,就是说flag在图片的末尾,找到jpg的文件尾FF D9,发现后面还有很多数据
将FF D9和前面的数据删除,将剩余的另存为txt文件,使用Notepad++打开

数据按16进制->ASCII方式解码,步骤:插件->Converter->(HEX->ASCII),解码之后得到类似于坐标一样的信息


提示还说了会画图吗,把这些坐标绘成一张图,用gnuplot工具绘图,gnuplot能识别的格式 坐标x 坐标y
使用脚本将()和,替换掉

1
2
3
4
5
6
7
8
9
10
11
with open('1.txt','r') as file:
fw = open('paintpaintpaint.txt','w')
while 1:
lines = file.readlines()
if not lines:
break
for line in lines:
fw.write(line.replace('(','').replace(')','').replace(',',' '))

file.close
fw.close


然后将paintpaintpaint.txt放在kali中使用gnuplot工具绘图

扫码得到flag

细心的大象

属性明显有信息

base64加密了。
TVNEUzQ1NkFTRDEyM3p6 ->MSDS456ASD123zz
先留着,可能是密码之类的
有exif,分离一下。
里面有一个加密的压缩包,果然密码就是前面解密的那一串东西。
得到的图片一看就是被截断了,改一下flag就出来了。

账号被盗了

跟着writeup做。
利用burpsuite抓包,修改cookie值,让我们得到admin身份。

然后就可以发现它里面有一个软件。下载出来。

运行程序,账号密码随便写(但也不能太随便,不然会提示输入正确的账号密码,应该是账号密码长度不够,之前随便输了一个123)

抓包分析,tcp流,盯着 user,pass,拿去解密。
YmtjdGZ0ZXN0QDE2My5jb20= -> bkctftest@163.com

YTEyMzQ1Ng== ->a123456
拿着账号去登入邮箱
得到flag

听首音乐

使用audacity工具打开,发现是音频+摩斯密码

将摩斯电码记录下来(记录的时候一定要看仔细)

摩斯解码,直接提交就ok
摩斯密码在线解密

做个游戏

这题和攻防世界里面的一题是一样的

这题是一个java写的程序直接反编译走起。

就发现flag了。提交发现不对,可以看到flag后面有一个’=’这个字符。
这是base64加密过的,将{}里面的拿去base64解密,就可以了。
最后的是解密完是:DajiDali_JinwanChiji

闪的好快

这个下载完用工具搞定

逐帧扫码就可以了,总共有18个
SYC{F1aSh_so_f4sT}

猫片

新的知识呀。
摘自:bugkuCTF—杂项—猫片(安恒)

然后保存bin
winhex打开,看文件头是png格式的。但是PNG (png)的正常的文件头:89504E47,所以们将他前面的FFFF删掉保存退出。然后改后缀名打开,发现只有一半的二维码,改下高度试试。
在查看PNG文件格式时,IHDR后面的八个字节就是宽高的值

用手机就扫出来,是百度网盘上的一个flag.rar文件。
emmm,用QR扫的时候没出来,老老实实把宽高改成一样,就能扫出来了。

但是看别人的题解发现:

接着我们就得到一个二维码了,但实际上这个是扫不出来的,还需要对这个二维码进行反色处理,才能进行扫码,这里可以使用Q Research工具直接得到一个链接:https://pan.baidu.com/s/1pLT2J4f

emm我真是走运,学了一下,用windows自带的画图就可以了
画板按“shift”+“ctrl”+“i”进行反色之后再扫码,

下载后解压得到一个文本,写着:flag不在这里哦 你猜猜flag在哪里呢? 找找看吧
那应该是这个压缩包有东西在里面吧,试试放到winhex查看rar文件
这里看到这个 pyc 感觉是不是没把这个搞出来呀,试一下分离,没搞出来。

原来提示:
hint:LSB BGR NTFS
还有一个NTFS没有用上
根据大佬的说法,这是一种流隐写,需要用到工具 ntfstreamseditor,
大佬还说这里还有一个坑就是,这压缩文件一定要用winrar来解压才会产生这样的效果

但是我没看到。
接着用ntfstreamseditor,查看解压的文件夹里面的数据流,然后把他导出来.

得到一个pyc文件,也就是py编译后的文件,因此需要扔到网上去在线反编译一下
(似乎可以用卡里工具?将得到的pyc文件用uncompyle6反编译之后得到py文件)
网址

根据它的加密写出对应的解密脚本
脚本跑一下得:

flag{Y@e_Cl3veR_C1Ever!}
完成了。

白哥的鸽子

修改文件头,加.jpeg后缀。看到图。 并且在winhex看到熟悉的exif。分离走起,没有东西。
再看winhex,结尾好像有点东西
当3组的时候,出来了
flag{w22_is_v3ry_cool}

come_game

一个游戏,随便玩了一下。之后想放到工具里,但是不是jar程序。
结合提示应该是只要通关就行了,当然应该不容易过。等会应该要修改数据过的。
发现玩了之后,出现文件

可以发现玩第一关的话会出现一个save1,第2个的时候出现save2,

这里的2应该是值关卡,我们往后调一下它的值
我们修改第三个的save3的关卡值为4,进去之后到load那读取一下进度,发现到了下一关。
接着改成35代表的第5关

load那读取一下进度,就出来flag了

flag{6E23F259D98DF153}
提交之后没有成功,不知道原因,但是看了大佬之后发现。
SYC{6E23F259D98DF153},原来是格式有问题。

多彩

看了wp,知道是N1CTF2018 的Lipstick 不简单!!!
这道题没啥思路,不太懂。
再结合图片的名称lipstick(口红),百度一下,发现YSL是个化妆品品牌。

用data extract提取数据,发现

保存bin。并且改成zip。
发现文件损坏,丢到winhex发现,文件头有问题,改一下,可以看到里面有flag文件了,但是解压的时候还是会报错。
看网上说是要用7z解压,试了下,发现要密码。而且这个不是伪加密,只能从图片中找信息。

然后。。。。。。。
我靠,恶心,这脑洞。。。
看wp:https://www.secpulse.com/archives/69465.html
还要搞口红色号 我醉了,不做了。。

旋转跳跃

这题是音频隐写,直接用工具。题目告诉我们key了 key:syclovergeek
那就用MP3Stego执行命令:
Decode.exe -X sycgeek-mp3.mp3 -P syclovergeek
得flag:
SYC{Mp3_B15b1uBiu_W0W}

普通的二维码

扫描二维码后,得到内容是: 哈哈!就不告诉你flag就在这里!
那看来flag就是用这个图做文章了。丢尽winhex结尾有一串数字,没有比8大的,应该是8进制,转16进制
cc6c3099cf648309d8ca5f3c8c0aa5f281e4be73319c8d2703a17c9e743197ca86f2f950ca6e2f904e663349a4427d
再转ascii码的时候是乱码了
其实这里要理一下思路,不能用工具乱转。
8进制先转成10进制然后再转ascii。但是这里不能惯性思维啊!平时的时候是两个16进制直接转ascii。忘记了其实转ascii的时候都要想一下怎么转才行。
别人的思路:
16进制的惯性思维,让我以为这里也是两两一对的转换,转换出来自然不正确,一堆乱码,后来发现两位的8进制数据最大077(数字前加0表示8进制),转换成10进制63也表示不完ascii码表上的字符啊,而且126刚好也是3的倍数,所以三个一组来转换,如下脚本:

1
2
3
4
5
6
7
f=open("1.txt",'r')
res=''
for i in range(42):
s=eval('0'+f.read(3))
res+=chr(int(s))
print res
raw_input()

乌云的验证码

这个用stegsolve后,
(细心的还可以发现red0,green0,blue0左上角的您好上面好像有什么隐藏的东西)
用之前学到的东西试一下,
得到flag

神秘的文件

解压得到一个flag压缩包,和一张图。压缩包加密了,应该是图上有密码。
对图整了一会,没出来。
结果是爆破就行?
破解Zip加密文件常用的几种方法
参考文章,学到东西,值得一读
[]https://www.cnblogs.com/ECJTUACM-873284962/p/9387711.html
记一道明文破解的漫长斗争史


在明文攻击时,要注意压缩成同类型。这题用的是winRAR。

口令解出来是 ‘q1w2e3r4’
解压得到flag文件夹后,里面的word没有flag。需要找word隐藏的信息了
放winhex,看到PK 字样。 改后缀,解压

找到疑似flag
ZmxhZ3tkMGNYXzFzX3ppUF9maWxlfQ==
base64 解密

flag{d0cX_1s_ziP_file}

论剑

怀疑人生

改后缀,解压后。得到三个东西。
第三个扫描一下就能出来:
12580}
这应该是flag的尾部。因此可以猜测三个东西分别由一部分的flag。
第一个压缩包,好像是直接破解。要好久。

第二个图片的末尾处,有pk字样。修改后缀,得到一个文本

1
2
3
4
5
..... ..... ....! ?!!.? ..... ..... ....? .?!.? ....! .?... ..... .....
..!?! !.?.. ..... ..... ..?.? !.?.. ..... ..... ..... ..... !.?.. .....
..... .!?!! .?!!! !!!!! !!!!? .?!.? !!!!! !!!!! !!!!! .?... ....! ?!!.?
!!!!! !?.?! .?!!! !!!!! !!!!! .!!!. ?.... ..... ..... .!?!! .?... .....
..... .?.?! .?!.? .

查了一下是Ook加密

解密网站j
解出来是3oD54e
这个应该是中间部分
但这个竟然还是加密过的,而且是base58.。。。
在线base58
解出来是
misc

就等破解完拿到flag的前面部分了

攻防世界

参考:
https://www.jianshu.com/p/7f20df275efe

ext3

这题用到Linux的知识吧。
将linux系统光盘放在linux下,在linux光盘目录下使用strings linux|grep flag,查找与flag相关的文件;root模式下使用mount linux /mnt命令将linux光盘挂载在mnt目录下,切换到mnt目录,使用cat O7avZhikgKgbF/flag.txt命令即可对flag内容进行读取,发现是一个base64编码,解密后得到flag.

pdf

打开pdf,鼠标在里面晃一晃,就发现图后面疑似有文字。
复制出来就是flag。

give you flag

一个动图,他在最后面有一个一闪而过的二维码。
用stegsolve的查看帧的功能模块查看,发现一个缺少三个定位部分的二维码,将其补全,扫一扫即可。

懒得补全了,就这样吧。。。

stegano

下载 PDF 在火狐浏览器打开,控制台(ctrl+shift+k)输入:
document.documentElement.textContent

看一下内容,会有一串
BABA BBB BA BBA ABA AB B AAB ABAA AB B AA BBB BA AAA BBAABB AABA ABAA AB BBA BBBAAA ABBBB BA AAAB ABBBB AAAAA ABBBB BAAA ABAA AAABB BB AAABB AAAAA AAAAA AAAAB BBA AAABB
做个可以改成摩斯电码(之前有一题是全部都是0和1,和这题一样的,都是替换完得到摩斯电码)

认真看一下,发现解密后得到flag了
根据要求改下flag格式,成功。

SimpleRAR

压缩包解压出来,提示损坏,得到flag.txt并没有flag。用winhex查看压缩包。
发现里面应该有图片的,因为损坏没解压出来。
winhex里面可以看到,txt文件结束之后就是png文件的开始了,这里我已经改过了,原来是A8 3C 7A,

这个是RAR对png文件头的编码,于是把原来的7A改成74,保存,重新解压;
就会多出一个图片,winhex查看是gif格式的,于是改一下后缀
还是没有东西,上工具。
gif的,逐帧看一下,竟然有二维码,是残缺的。结合提示,应该还有一半需要拼接上去。
emm,竟然要用到ps。

醉了,分离出来,找不到二维码。
心态炸裂,弄不出来。
放着吧,思路是两个图分离出来得到两个一半的二维码拼接起来。然后再把角给补全下就好了。

坚持60s

这题是一个java写的程序直接反编译走起。

就发现flag了。提交发现不对,可以看到flag后面有一个’=’这个字符。
这是base64加密过的,将{}里面的拿去base64解密,就可以了。
最后的是解密完是:DajiDali_JinwanChiji


要玩的话也可以,直接运行,移动到右边的边界,露出一条缝那样,露出很小很小,它是不会被判断碰到的,但是不能完全移出去,不然回不来。
而且根据代码知道,要计算好时间,超过69s也不行。要控制60s-69s,出来自杀就行了。

gif

解压得到104张黑白图,应该是白为0黑为1.

第一个想到的是摩斯电码,但是没有东西表示空格啊。
所以应该是二进制01,拿去转成16进制,再转成ascii码就好了。
二进制8个为一组。我直接拿去在线转换了,竟然可以!棒!
在线工具

掀桌子

网上找的解密代码

1
2
3
4
5
6
string = "c8e9aca0c6f2e5f3e8c4efe7a1a0d4e8e5a0e6ece1e7a0e9f3baa0e8eafae3f9e4eafae2eae4e3eaebfaebe3f5e7e9f3e4e3e8eaf9eaf3e2e4e6f2"
flag = ''
for i in range(0,len(string), 2):
s = "0x" + string[i] + string[i+1]
flag += chr(int(s, 16) - 128)
print(flag)

每两个一组,将16进制转换为10进制,减去128以后输出 ascii
运行后得到:
Hi, FreshDog! The flag is: hjzcydjzbjdcjkzkcugisdchjyjsbdfr
所以
flag: hjzcydjzbjdcjkzkcugisdchjyjsbdfr

如来十三掌

发现是一个佛经。用在线工具 与佛论禅解密:

得到疑似base64编码
MzkuM3gvMUAwnzuvn3cgozMlMTuvqzAenJchMUAeqzWenzEmLJW9
想到题目名为“如来十三掌”,可能需要用到rot13加密

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#简单的说就是通过将输入的原字符串ASCII+13/或者ASCC-13:
def Upper(ch):
if ch >= 'A' and ch <= 'Z':
return True


def Lower(ch):
if ch >= 'a' and ch <= 'z':
return True


def rot13(s):
flag = ''
for i in s:
if Upper(i) == True:
if i >= 'A' and i <= 'M':
flag += chr(ord(i) + 13)
else:
flag += chr(ord(i) - 13)
elif Lower(i) == True:
if i >= 'a' and i <= 'm':
flag += chr(ord(i) + 13)
else:
flag += chr(ord(i) - 13)
else:
flag += i
return flag


if __name__ == "__main__":
s = 'MzkuM3gvMUAwnzuvn3cgozMlMTuvqzAenJchMUAeqzWenzEmLJW9'
print(rot13(s))

运行后得到的字符串拿去base64解码就得到flag

总结:首先需要找到“与佛论禅”对文字进行解码,很多时候就直接卡在这一步了,然后要根据题目名称联想到rot13,还要观察出是经过base64编码,让后还能将这两个组合起来,才能得到flag。

base64stego

压缩包伪加密
zip伪加密破解方法

1
2
3
4
5
6
7
若是遇到压缩包解压需要密码的时候先放在WINHEX中看看是不是伪加密,只要对比两部分的全局方式位标记,若第二部分是09 00,那就把09修改为00就好
或者
使用ZipCenOp去伪加密,解密命令java -jar ZipCenOp.jar r xxxx.zip 加密命令java -jar ZipCenOp.jar e xxxx.zip
正常情况下使用7Z解压或者360解压,
放在linux写可以直接提取,
使用binwalk ,binwalk -e无视密码直接解压
下面看一些真正的加密文件的HEX数据,两部分的全局方式位标记都是0108(奇数是加密)

这里我直接试了用binwalk分离的方法,果然给力。
得到的文本,查了之后知道是base64隐写,用python2通过脚本解密得flag
脚本用linux实现了,windows的可能是python3的老报错。

功夫再高也怕菜刀

下好之后我的360报信息说要解密密码?下的不是流量包嘛?竟然有压缩包,看来不简单。分离试一下。果然有压缩包,但是需要密码,会不会是伪加密,试试直接用foremost分离,不行。老老实实找密码。
回到这个流量包,用winshark打开文件,筛选数据,在搜索框搜索flag.txt(快捷键ctrl+F),
搜寻包,并进行分析,ctrl+N选择下一个筛选内容。当找到1150这个包时,发现了一个图片,6666.jpg。

通过tcp跟踪流,将图片分离出来

将FFD8FF和FFD9将之间的字符全部复制,然后新建winhex文件,粘贴复制的字符,保存为.jpg文件。(可以先复制下来,再利用nopd++或者sublime找到FFD8FF和FFD9)
粘贴到winhex 的时候要注意粘贴类型为hex。
之后就可以得到了

最后的flag
flag{3OpWdJ-JP6FzK-koCMAK-VkfWBq-75Un2z}

签到题

base64解密得到
一串字符
应该是栅栏密码,我去栅栏失败了
原来前面还有一层凯撒,我去,以为签到题没这么多层的哎。
而且凯撒的时候还要注意到题目是 SSCTF的,所以要选择SSCTF那个去栅栏

##easycap
追踪tcp流,结束

Avatar

对图片信息进行破解的命令如下:outguess -r /root/angrybird.jpg -t 1.txt
-r是解密(加密是-d) ,后面接文件 1.txt是将解密的内容存放在这个txt文件中,

解密前后分别ls查看一下就会发现多了这个文件 ,这里直接cat查看
We should blow up the bridge at midnight
这个就是flag,直接提交就可以了。不需要加格式

that is this

这题对文件头不熟悉,白忙活半天了。
但是下载下来的文件就是gz结尾的,我没关注。


解压出来的文件要改成gz才行。我对这个文件分析了半天没看成它是gz文件头
之后出来两个图,要把它合并就出来flag了
新学到了知识!!!

Training-Stegano-1


用winhex最底下直接就是flag。

Look what the hex-edit revealed: passwd:steganoI

我还瞎整了一会

get the key


可以看到很多key的文本
第一个应该是最全的。每一个应该会少一行。
那用第一个的去试试。
第一行的就是了
SECCON{@]NL7n+-s75FrET]vU=7Z}

Test-flag-please-ignore

666c61677b68656c6c6f5f776f726c647d
转ascii完事
flag{hello_world}

Excaliflag

工具完事

glance-50

这题又是新的东西呀。要逐帧获取图片,然后拼接。
原本是用网上的脚本,但是有点问题。。。好像没合并成功,报错了。但是图片都搞出来了

后面知道可以用kali命令

参考:
拿到一个gif图片,很窄(宽2px),无语。

我们可以先把gif分解开,kali的convert命令可以,也可以用其他的工具:convert glance.gif flag.png

总共分离出来200个图片。

这么窄的图,难道要横着拼起来?

于是又用到一个工具:montage,这个工具用法很多,也很强大

用命令:montage flag*.png -tile x1 -geometry +0+0 flag.png

-tile是拼接时每行和每列的图片数,这里用x1,就是只一行

-geometry是首选每个图和边框尺寸,我们边框为0,图照原始尺寸即可
————————————————
原文链接:https://blog.csdn.net/zz_Caleb/article/details/89490494

4-2

这题用到了字频分析
网站

flag{classical-cipher_is_not_security_hs}

embarrass

折腾半天没成功,结果是只需要一条指令就可以了
strings misc_02.pcapng | grep flag

notepad++打开搜索flag也能找到

实验室考核

misc2

丢进去winhex,发现是压缩包,解出来是一个音频和二维码。
二维码扫出来的是一个brianfuck拜编码。

1
2
3
+++++ ++[-> +++++ ++<]> +.--. +.+++ +++++ .---- ----- .++.. +++.- --...
+++++ +.<
-------------------------------------------------------------------------

https://www.splitbrain.org/services/ook
翻译出来是
201902252228

然后就是处理音频了。
用到了
得到:
flag{PrEtTy_1ScC9012_gO0d}

百度一下是html编码。解码搞定
flag{S022y4orr5}

misc3

这题看了没思路。跟着题解做一遍
放到winhex里是一堆乱码,不懂。用notepad打开,发现是当铺密码。
拿去解密得到一串数字
63154302635731623246716034145162324651403206116234541146310711606314115230060154324661406106430631575
发现没有比8大的数,应该是八进制,转成16进制是

在线解
666c61677b39353738386539353530343139396133323938666135303036353630623463337d
再转成flag就出来了
flag{95788e95504199a3298fa5006560b4c3}

misc4

按照题解做一遍:
看到一串1 0 感觉可以变成摩斯电码。

摩斯电码解密出来后,是base32.也可以根据提示推断出来。

得到一串字符串,是栅栏密码,解密一下就好了


每组字数为9时得到flag:
flag{41e07a7e714db677cbd22b8d82039cd4}

misc5

用winhex发现,既有 PNG文件的开头:89504e47 ,又有类似 ZIP文件的开头:504b01314

删除 89504e47 ,文件后缀添加为 .zip后尝试解压,但是文件会损坏,
但是能解压出一个password。
IafFRlviO
应该是被加密过的密码

所以要修改 504b1314 为 504b0304 ,可以成功解压。但是需要密码。

emm突然发现这样也能看到里面的文件,拿到password.txt,但是拿不到那张图,密码是加刀图上的。
好吧,好像这是伪加密。搜索 504b0102 ,将后面 09 改为 00
这次解压就不需要密码了,成功得到图片和文本。
分析文本,,在末尾发现一串编码

我解密不出来,贴学长的了

键盘鼠标流量题(from某个老师)

键盘流量题
1、拿到一份流量文件的时候,首先判断这是什么流量,如果是802.11协议的话就是无线流量,如果是USB协议的就是USB流量,其他的为一般流量
2、如果是USB流量,要判断这流量是来源于键盘或鼠标或者其他USB设备,这边只考虑键盘或鼠标
3、我们可以查看Leftover Capture Data这个字段,如果是8字节长度就是键盘流量,其中第三字节表示和键盘的映射关系
4、我们可以通过把流量导出成CSV表格,然后将其中的Leftover Capture Data字段的内容复制黏贴到记事本,或者可以直接用kali里面的Tshark工具自动导出成文本
Tshark命令用法
tshark -r usb1.pcap -T fields -e usb.capdata > usbdata.txt
其中usb1.pcap是原来的流量文件,usbdata.txt是你要导出的数据文本的文件名
5、打开这个导出的文本,将里面的空行去除,可以使用notepad++打开,然后点击编辑-》行操作-》移除空行
6、接下去使用脚本进行自动化的翻译,这里提供了两个脚本分别是keyboard.py和keyboard1.py,其中keyboard1.py这个脚本映射结果会比keyboard.py脚本好,所以建议使用keyboard1.py,但无论最终使用哪一个脚本,运行之前确保以下两件事情:
(1)最好脚本和所需要翻译的文本在同一文件夹下
(2)脚本中keys = open(‘111111.txt’)这个单引号的部分的文件名要和所需要翻译的文本的文件名一致
7、通过CMD输入Python <脚本名称>进行运行就可以看到对应的接口

鼠标流量解题过程
1、拿到一份流量文件的时候,首先判断这是什么流量,如果是802.11协议的话就是无线流量,如果是USB协议的就是USB流量,其他的为一般流量
2、如果是USB流量,要判断这流量是来源于键盘或鼠标或者其他USB设备,这边只考虑键盘或鼠标
3、我们可以查看Leftover Capture Data这个字段,如果是4字节长度就是鼠标流量,但是这是我们还需要初步判断是左键点击移动的流量或者右键点击移动的流量,或者是不点击移动的流量,我们可以通过这些数据的数量来做初步判断
4、我们可以直接通过UsbMiceDataHacker.py这个脚本去显现出鼠标的移动轨迹,这个脚本的用法如下
python UsbMiceDataHacker.py usb2.pcap RIGHT
其中usb2.pcap是我们要进行解密的流量文件,RIGHT这个参数可以改为LEFT、MOVE、ALL,分别是显现出左键移动的流量,和不按键移动的流量,和全部的移动的流量
但是这个尤其要注意一个点,最后接的这个参数一定是要大写输入

misc攻防世界

Posted on 2019-10-24 | Edited on 2019-11-13

攻防世界

参考:
https://www.jianshu.com/p/7f20df275efe

ext3

这题用到Linux的知识吧。
将linux系统光盘放在linux下,在linux光盘目录下使用strings linux|grep flag,查找与flag相关的文件;root模式下使用mount linux /mnt命令将linux光盘挂载在mnt目录下,切换到mnt目录,使用cat O7avZhikgKgbF/flag.txt命令即可对flag内容进行读取,发现是一个base64编码,解密后得到flag.

pdf

打开pdf,鼠标在里面晃一晃,就发现图后面疑似有文字。
复制出来就是flag。

give you flag

一个动图,他在最后面有一个一闪而过的二维码。
用stegsolve的查看帧的功能模块查看,发现一个缺少三个定位部分的二维码,将其补全,扫一扫即可。

懒得补全了,就这样吧。。。

stegano

下载 PDF 在火狐浏览器打开,控制台(ctrl+shift+k)输入:
document.documentElement.textContent

看一下内容,会有一串
BABA BBB BA BBA ABA AB B AAB ABAA AB B AA BBB BA AAA BBAABB AABA ABAA AB BBA BBBAAA ABBBB BA AAAB ABBBB AAAAA ABBBB BAAA ABAA AAABB BB AAABB AAAAA AAAAA AAAAB BBA AAABB
做个可以改成摩斯电码(之前有一题是全部都是0和1,和这题一样的,都是替换完得到摩斯电码)

认真看一下,发现解密后得到flag了
根据要求改下flag格式,成功。

SimpleRAR

压缩包解压出来,提示损坏,得到flag.txt并没有flag。用winhex查看压缩包。
发现里面应该有图片的,因为损坏没解压出来。
winhex里面可以看到,txt文件结束之后就是png文件的开始了,这里我已经改过了,原来是A8 3C 7A,

这个是RAR对png文件头的编码,于是把原来的7A改成74,保存,重新解压;
就会多出一个图片,winhex查看是gif格式的,于是改一下后缀
还是没有东西,上工具。
gif的,逐帧看一下,竟然有二维码,是残缺的。结合提示,应该还有一半需要拼接上去。
emm,竟然要用到ps。

醉了,分离出来,找不到二维码。
心态炸裂,弄不出来。
放着吧,思路是两个图分离出来得到两个一半的二维码拼接起来。然后再把角给补全下就好了。

坚持60s

这题是一个java写的程序直接反编译走起。

就发现flag了。提交发现不对,可以看到flag后面有一个’=’这个字符。
这是base64加密过的,将{}里面的拿去base64解密,就可以了。
最后的是解密完是:DajiDali_JinwanChiji


要玩的话也可以,直接运行,移动到右边的边界,露出一条缝那样,露出很小很小,它是不会被判断碰到的,但是不能完全移出去,不然回不来。
而且根据代码知道,要计算好时间,超过69s也不行。要控制60s-69s,出来自杀就行了。

gif

解压得到104张黑白图,应该是白为0黑为1.

第一个想到的是摩斯电码,但是没有东西表示空格啊。
所以应该是二进制01,拿去转成16进制,再转成ascii码就好了。
二进制8个为一组。我直接拿去在线转换了,竟然可以!棒!
在线工具

掀桌子

网上找的解密代码

1
2
3
4
5
6
string = "c8e9aca0c6f2e5f3e8c4efe7a1a0d4e8e5a0e6ece1e7a0e9f3baa0e8eafae3f9e4eafae2eae4e3eaebfaebe3f5e7e9f3e4e3e8eaf9eaf3e2e4e6f2"
flag = ''
for i in range(0,len(string), 2):
s = "0x" + string[i] + string[i+1]
flag += chr(int(s, 16) - 128)
print(flag)

每两个一组,将16进制转换为10进制,减去128以后输出 ascii
运行后得到:
Hi, FreshDog! The flag is: hjzcydjzbjdcjkzkcugisdchjyjsbdfr
所以
flag: hjzcydjzbjdcjkzkcugisdchjyjsbdfr

如来十三掌

发现是一个佛经。用在线工具 与佛论禅解密:

得到疑似base64编码
MzkuM3gvMUAwnzuvn3cgozMlMTuvqzAenJchMUAeqzWenzEmLJW9
想到题目名为“如来十三掌”,可能需要用到rot13加密

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#简单的说就是通过将输入的原字符串ASCII+13/或者ASCC-13:
def Upper(ch):
if ch >= 'A' and ch <= 'Z':
return True


def Lower(ch):
if ch >= 'a' and ch <= 'z':
return True


def rot13(s):
flag = ''
for i in s:
if Upper(i) == True:
if i >= 'A' and i <= 'M':
flag += chr(ord(i) + 13)
else:
flag += chr(ord(i) - 13)
elif Lower(i) == True:
if i >= 'a' and i <= 'm':
flag += chr(ord(i) + 13)
else:
flag += chr(ord(i) - 13)
else:
flag += i
return flag


if __name__ == "__main__":
s = 'MzkuM3gvMUAwnzuvn3cgozMlMTuvqzAenJchMUAeqzWenzEmLJW9'
print(rot13(s))

运行后得到的字符串拿去base64解码就得到flag

总结:首先需要找到“与佛论禅”对文字进行解码,很多时候就直接卡在这一步了,然后要根据题目名称联想到rot13,还要观察出是经过base64编码,让后还能将这两个组合起来,才能得到flag。

base64stego

压缩包伪加密
zip伪加密破解方法

1
2
3
4
5
6
7
若是遇到压缩包解压需要密码的时候先放在WINHEX中看看是不是伪加密,只要对比两部分的全局方式位标记,若第二部分是09 00,那就把09修改为00就好
或者
使用ZipCenOp去伪加密,解密命令java -jar ZipCenOp.jar r xxxx.zip 加密命令java -jar ZipCenOp.jar e xxxx.zip
正常情况下使用7Z解压或者360解压,
放在linux写可以直接提取,
使用binwalk ,binwalk -e无视密码直接解压
下面看一些真正的加密文件的HEX数据,两部分的全局方式位标记都是0108(奇数是加密)

这里我直接试了用binwalk分离的方法,果然给力。
得到的文本,查了之后知道是base64隐写,用python2通过脚本解密得flag
脚本用linux实现了,windows的可能是python3的老报错。

功夫再高也怕菜刀

下好之后我的360报信息说要解密密码?下的不是流量包嘛?竟然有压缩包,看来不简单。分离试一下。果然有压缩包,但是需要密码,会不会是伪加密,试试直接用foremost分离,不行。老老实实找密码。
回到这个流量包,用winshark打开文件,筛选数据,在搜索框搜索flag.txt(快捷键ctrl+F),
搜寻包,并进行分析,ctrl+N选择下一个筛选内容。当找到1150这个包时,发现了一个图片,6666.jpg。

通过tcp跟踪流,将图片分离出来

将FFD8FF和FFD9将之间的字符全部复制,然后新建winhex文件,粘贴复制的字符,保存为.jpg文件。(可以先复制下来,再利用nopd++或者sublime找到FFD8FF和FFD9)
粘贴到winhex 的时候要注意粘贴类型为hex。
之后就可以得到了

最后的flag
flag{3OpWdJ-JP6FzK-koCMAK-VkfWBq-75Un2z}

签到题

base64解密得到
一串字符

应该是栅栏密码,我去栅栏失败了
原来前面还有一层凯撒,我去,以为签到题没这么多层的哎。
而且凯撒的时候还要注意到题目是 SSCTF的,所以要选择SSCTF那个去栅栏

##easycap
追踪tcp流,结束

Avatar

对图片信息进行破解的命令如下:outguess -r /root/angrybird.jpg -t 1.txt
-r是解密(加密是-d) ,后面接文件 1.txt是将解密的内容存放在这个txt文件中,

解密前后分别ls查看一下就会发现多了这个文件 ,这里直接cat查看
We should blow up the bridge at midnight
这个就是flag,直接提交就可以了。不需要加格式

that is this

这题对文件头不熟悉,白忙活半天了。
但是下载下来的文件就是gz结尾的,我没关注。


解压出来的文件要改成gz才行。我对这个文件分析了半天没看成它是gz文件头
之后出来两个图,要把它合并就出来flag了
新学到了知识!!!

Training-Stegano-1


用winhex最底下直接就是flag。

Look what the hex-edit revealed: passwd:steganoI

我还瞎整了一会

get the key


可以看到很多key的文本
第一个应该是最全的。每一个应该会少一行。
那用第一个的去试试。
第一行的就是了
SECCON{@]NL7n+-s75FrET]vU=7Z}

Test-flag-please-ignore

666c61677b68656c6c6f5f776f726c647d
转ascii完事
flag{hello_world}

Excaliflag

工具完事

glance-50

这题又是新的东西呀。要逐帧获取图片,然后拼接。
原本是用网上的脚本,但是有点问题。。。好像没合并成功,报错了。但是图片都搞出来了

后面知道可以用kali命令

参考:
拿到一个gif图片,很窄(宽2px),无语。

我们可以先把gif分解开,kali的convert命令可以,也可以用其他的工具:convert glance.gif flag.png

总共分离出来200个图片。

这么窄的图,难道要横着拼起来?

于是又用到一个工具:montage,这个工具用法很多,也很强大

用命令:montage flag*.png -tile x1 -geometry +0+0 flag.png

-tile是拼接时每行和每列的图片数,这里用x1,就是只一行

-geometry是首选每个图和边框尺寸,我们边框为0,图照原始尺寸即可
————————————————
原文链接:https://blog.csdn.net/zz_Caleb/article/details/89490494

4-2

这题用到了字频分析
网站

flag{classical-cipher_is_not_security_hs}

各种简单解密

Posted on 2019-10-13 | Edited on 2019-10-14

base?(柳暗花明又一村)

这题很明显的base64加密。
但是解密完不是flag,但是感觉短了一些,而且感觉还是base的样子。那就接着搞。重复几遍就出来了。
其实看名字就应该要知道这么做的。

一名合格的特工

这个摩斯电码没啥说的

1
-... .- .- -... -... .- .- -... -... -... .- -... .- .- .- -... .- .- -... .- .- -... .- .- .- -... .- .- -... .- .- .- -... .- -... .- -... .- -... -... .- .- .- .- .- .- .- -... -... .-

转完之后得到的是:
BAABBAABBBABAAABAABAABAAABAABAAABABABABBAAAAAAABBA

这个是培根密码
http://tool.bugku.com/peigen/
就出来了

看不懂的JS

1
eval(function(p,a,c,k,e,r){e=String;if(!''.replace(/^/,String)){while(c--)r[c]=k[c]||c;k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('0("1")',2,2,'alert|XSS'.split('|'),0,{}))

网站http://www.atool9.com/jscompression.php

奇怪的字符

1
゚ω゚ノ= /`m´)ノ ~┻━┻   //*´∇`*/ ['_']; o=(゚ー゚)  =_=3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); (゚Д゚) =(゚Θ゚)= (o^_^o)/ (o^_^o);(゚Д゚)={゚Θ゚: '_' ,゚ω゚ノ : ((゚ω゚ノ==3) +'_') [゚Θ゚] ,゚ー゚ノ :(゚ω゚ノ+ '_')[o^_^o -(゚Θ゚)] ,゚Д゚ノ:((゚ー゚==3) +'_')[゚ー゚] }; (゚Д゚) [゚Θ゚] =((゚ω゚ノ==3) +'_') [c^_^o];(゚Д゚) ['c'] = ((゚Д゚)+'_') [ (゚ー゚)+(゚ー゚)-(゚Θ゚) ];(゚Д゚) ['o'] = ((゚Д゚)+'_') [゚Θ゚];(゚o゚)=(゚Д゚) ['c']+(゚Д゚) ['o']+(゚ω゚ノ +'_')[゚Θ゚]+ ((゚ω゚ノ==3) +'_') [゚ー゚] + ((゚Д゚) +'_') [(゚ー゚)+(゚ー゚)]+ ((゚ー゚==3) +'_') [゚Θ゚]+((゚ー゚==3) +'_') [(゚ー゚) - (゚Θ゚)]+(゚Д゚) ['c']+((゚Д゚)+'_') [(゚ー゚)+(゚ー゚)]+ (゚Д゚)['o']+((゚ー゚==3) +'_') [゚Θ゚];(゚Д゚) ['_'] =(o^_^o) [゚o゚] [゚o゚];(゚ε゚)=((゚ー゚==3) +'_') [゚Θ゚]+ (゚Д゚) .゚Д゚ノ+((゚Д゚)+'_') [(゚ー゚) + (゚ー゚)]+((゚ー゚==3) +'_') [o^_^o -゚Θ゚]+((゚ー゚==3) +'_') [゚Θ゚]+ (゚ω゚ノ +'_') [゚Θ゚]; (゚ー゚)+=(゚Θ゚); (゚Д゚)[゚ε゚]='\\'; (゚Д゚).゚Θ゚ノ=(゚Д゚+ ゚ー゚)[o^_^o -(゚Θ゚)];(o゚ー゚o)=(゚ω゚ノ +'_')[c^_^o];(゚Д゚) [゚o゚]='\"';(゚Д゚) ['_'] ( (゚Д゚) ['_'] (゚ε゚+(゚Д゚)[゚o゚]+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (o^_^o)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (o^_^o)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚o゚]) (゚Θ゚)) ('_');

这个是aaencode
aaencode使用的表情符号对js代码进编码,可以直接在命令行中继续解码,或者在网站进行解码
https://www.qtool.net/decode

超简单

ABABAAABAABBAAA

这个一看就是培根加密
http://tool.bugku.com/peigen/
老方法解密完事

栅栏密码

密文:yawceoreo@uelm@
( 提示:3组)
用网站解密了,提交flag不对,不太懂为啥

曲路密码

手动画图解决,失败了。不懂哪里错了。
不过应该就是按照它的定义解码就可以。

换位密码

凯撒密码

https://aliyunvi.com/caesar


根据提示输入明文 key 然后解密完事

培根密码

解密完事

诺基亚键盘加密1

题目:
密文1(带空格和猜测):843 0 539 0 47 00 9352663 00 367 00 968
思考ing。。。

诺基亚键盘加密2


对着敲 完事

JS解密-JSFUCK

1
(![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+(![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+[+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]

网站:http://discogscounter.getfreehosting.co.uk/js-noalnum.php

或者用浏览器的f12功能,在命令窗口执行下就可以了
(这里用的是谷歌)

JS解密-JOTHER

F12,控制台完事

JS解密-aaencode

1
゚ω゚ノ= /`m´)ノ ~┻━┻   //*´∇`*/ ['_']; o=(゚ー゚)  =_=3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); (゚Д゚) =(゚Θ゚)= (o^_^o)/ (o^_^o);(゚Д゚)={゚Θ゚: '_' ,゚ω゚ノ : ((゚ω゚ノ==3) +'_') [゚Θ゚] ,゚ー゚ノ :(゚ω゚ノ+ '_')[o^_^o -(゚Θ゚)] ,゚Д゚ノ:((゚ー゚==3) +'_')[゚ー゚] }; (゚Д゚) [゚Θ゚] =((゚ω゚ノ==3) +'_') [c^_^o];(゚Д゚) ['c'] = ((゚Д゚)+'_') [ (゚ー゚)+(゚ー゚)-(゚Θ゚) ];(゚Д゚) ['o'] = ((゚Д゚)+'_') [゚Θ゚];(゚o゚)=(゚Д゚) ['c']+(゚Д゚) ['o']+(゚ω゚ノ +'_')[゚Θ゚]+ ((゚ω゚ノ==3) +'_') [゚ー゚] + ((゚Д゚) +'_') [(゚ー゚)+(゚ー゚)]+ ((゚ー゚==3) +'_') [゚Θ゚]+((゚ー゚==3) +'_') [(゚ー゚) - (゚Θ゚)]+(゚Д゚) ['c']+((゚Д゚)+'_') [(゚ー゚)+(゚ー゚)]+ (゚Д゚)['o']+((゚ー゚==3) +'_') [゚Θ゚];(゚Д゚) ['_'] =(o^_^o) [゚o゚] [゚o゚];(゚ε゚)=((゚ー゚==3) +'_') [゚Θ゚]+ (゚Д゚) .゚Д゚ノ+((゚Д゚)+'_') [(゚ー゚) + (゚ー゚)]+((゚ー゚==3) +'_') [o^_^o -゚Θ゚]+((゚ー゚==3) +'_') [゚Θ゚]+ (゚ω゚ノ +'_') [゚Θ゚]; (゚ー゚)+=(゚Θ゚); (゚Д゚)[゚ε゚]='\\'; (゚Д゚).゚Θ゚ノ=(゚Д゚+ ゚ー゚)[o^_^o -(゚Θ゚)];(o゚ー゚o)=(゚ω゚ノ +'_')[c^_^o];(゚Д゚) [゚o゚]='\"';(゚Д゚) ['_'] ( (゚Д゚) ['_'] (゚ε゚+(゚Д゚)[゚o゚]+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (o^_^o)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (o^_^o)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚o゚]) (゚Θ゚)) ('_');

https://www.qtool.net/decode


上面那个好操作些

http://utf-8.jp/public/aaencode.html
点eval

Unicode

解码完事
http://tool.chinaz.com/Tools/Unicode.aspx
这里要点转中文

摩斯密码

���ģ�--* ** ***- * -*-- --- **- - **** * -*- * -*--
这里是摩斯电码去掉前面的乱码
将 – - -– — - - ** -- -–
这个丢尽解码 (对应的字符要修改一下,比如* 和-,因此用了工具)

解出来是 giveyou the key

JS解密-JS混淆

丢网站完事
http://tool.chinaz.com/js.aspx
解出来是:
alert(“XSS”)

杂项工具及代码

Posted on 2019-09-30 | Edited on 2019-10-13 | In misc

在线:
各种密码:https://aliyunvi.com/
站长工具的解密网站
base密码解密
CTF必备密码编码大全

python3.x中如何使用base64、base32、base16编码解码

python3.x中如何使用base64、base32、base16编码解码
一、base64加密解密
加密:

import base64
encode = base64.b64encode(b’I love you’)
encode
b’SSBsb3ZlIHlvdQ==’
解密:
import base64
decode = base64.b64decode(b’SSBsb3ZlIHlvdQ==’)
decode
b’I love you’
二、base32加密解密
跟base64相似就是将base64.b64encode变成base64.b32encode
加密:
import base64
encode = base64.b32encode(b’I love you’)
encode
b’JEQGY33WMUQHS33V’
解密:
import base64
decode = base64.b32decode(b’JEQGY33WMUQHS33V’)
decode
b’I love you’
三、base16加密解密
类似的将base64.b32encode变成base64.b16encode
加密解密过程与base64、base32一样,这里就不在赘述

如有错误,欢迎指出!
————————————————
版权声明:本文为CSDN博主「最后的轻语_dd43」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/pdsu161530247/article/details/74840422

密码学(Crypto)一些在线解密网站

密码学(Crypto)一些在线解密网站
颜文字aaencode :https://www.qtool.net/decode

xssee:http://web2hack.org/xssee

xssee:http://evilcos.me/lab/xssee

程默的博客(DES,3DES,AES,RC,Blowfish,Twofish,Serpent,Gost,Rijndael,Cast,Xtea,RSA):http://tool.chacuo.net/cryptdes

在线编码解码(多种并排):http://bianma.911cha.com

在线加密解密(多种):http://encode.chahuo.com

Unicode转中文:http://www.bejson.com/convert/unicode_chinese

栅栏密码 && 凯撒密码 && 摩斯电码:http://heartsnote.com/tools/cipher.htm

Caesar cipher(凯撒密码):http://planetcalc.com/1434/

Quoted-Printable && ROT13:http://www.mxcz.net/tools/QuotedPrintable.aspx

ROT5/13/18/47编码转换:http://www.qqxiuzi.cn/bianma/ROT5-13-18-47.php

base系列: https://www.qqxiuzi.cn/bianma/base.php

Base32/16:http://pbaseconverter.com/

Base32:https://tools.deamwork.com/crypt/decrypt/base32decode.html

quipqiup古典密码自动化爆破(词频分析):http://quipqiup.com/index.php

词频分析/替换:http://cryptoclub.org/tools/cracksub_topframe.php

‘+.<>[]’ && ‘!.?’(Brainfuck/Ook!):https://www.splitbrain.org/services/ook

‘+-.<>[]’(Brainfuck):https://www.nayuki.io/page/brainfuck-interpreter-javascript

‘+-.<>[]’(Brainfuck):http://esoteric.sange.fi/brainfuck/impl/interp/i.html

‘()[]!+’JavaScript编码(JSfuck):http://discogscounter.getfreehosting.co.uk/js-noalnum.php

用 6 个字符’()[]!+’来编写 JavaScript 程序(JSfuck同上):http://www.jsfuck.com/

http://patriciopalladino.com/files/hieroglyphy/

摩斯密码翻译器:http://www.jb51.net/tools/morse.htm

Morse Code摩尔斯电码:http://rumkin.com/tools/cipher/morse.php

摩尔斯电码转换器:http://www.zhongguosou.com/zonghe/moErSiCodeConverter.aspx

字符串编码,解码,转换(长度,反转,进制转换):http://www.5ixuexiwang.com/str/

Cisco Type 7 Reverser:http://packetlife.net/toolbox/type7

Cisco:http://www.ifm.net.nz/cookbooks/passwordcracker.html

cmd5 && NTLM && mysql…:http://www.cmd5.com

spammimic(字符2一段话):http://www.spammimic.com/

js代码在线加密解密:https://tool.lu/js/

JScript/VBscript脚本解密(#@~^….^#~@):http://www.dheart.net/decode/index.php

VBScript.Encode解密(tip:Asp encode):http://adophper.com/encode.html

JScript.Encode脚本加密与解密:http://www.haokuwang.com/jsendecode.htm

‘+/v+’UTF-7加密:http://web2hack.org/xssee

各种无知密码解密:http://www.tools88.com

uuencode解码 && xxencode解码(古老的邮件密码):http://web.chacuo.net/charsetuuencode

MIME标准(邮件编码的一种):http://dogmamix.com/MimeHeadersDecoder/

Binhex编码(邮件编码的一种,常见于MAC机):http://encoders-decoders.online-domain-tools.com/

%u8001%u9525非/u的hex,%u编码,只能编码汉字(xssee):http://web.chacuo.net/charsetescape

猪圈密码:http://www.simonsingh.net/The_Black_Chamber/pigpen.html

ppencode(把Perl代码转换成只有英文字母的字符串):http://namazu.org/~takesako/ppencode/demo.html

rrencode(把ruby代码全部转换成符号):挂了

aaencode(JS代码转换成常用的网络表情,也就是我们说的颜文字js加密):http://utf-8.jp/public/aaencode.html

‘()[]!+’ && ‘$=~[]+”_.();’jother编码jjencode(JS代码转换成只有符号的字符串):http://web2hack.org/xssee

jother(是一种运用于javascript语言中利用少量字符构造精简的匿名函数方法对于字符串进行的编码方式。其中8个少量字符包括:! + ( ) [ ] { }。只用这些字符就能完成对任意字符串的编码):http://tmxk.org/jother/

jjencode/aaencode可用xssee && Chrome的Console模式来直接输出解密。

Manchester曼彻斯特解密:http://eleif.net/manchester.html

Vigenère维多利亚解密:https://www.guballa.de/vigenere-solver

Vigenère cipher:http://planetcalc.com/2468/

Hill cipher(希尔密码):http://planetcalc.com/3327/

Atbash cipher(埃特巴什码):http://planetcalc.com/4647/

snow(html隐写):http://fog.misty.com/perry/ccs/snow/snow/snow.html

Serpent加密解密:http://serpent.online-domain-tools.com/

十六进制Hex转文本字符串:http://www.bejson.com/convert/ox2str/

Hex2text:http://www.convertstring.com/EncodeDecode/HexDecode

Binary(二进制),ACSII,Hex(十六进制),Decimal(十进制):http://www.binaryhexconverter.com/

集合:http://www.qqxiuzi.cn/daohang.htm

集合(各种古典密码):http://rumkin.com/tools/cipher/

文本加密为汉字(“盲文”,音符,各种语言,花朵,箭头…):http://www.qqxiuzi.cn/bianma/wenbenjiami.php

在线繁体字转换器:http://www.aies.cn

在线工具集合:http://tomeko.net/online_tools/

二维码/条形码:https://online-barcode-reader.inliteresearch.com/

生成二维码:http://www.wwei.cn/

在线二维码解密:http://jiema.wwei.cn/

Image2Base64:http://www.vgot.net/test/image2base64.php

与佛论禅:http://www.keyfc.net/bbs/tools/tudoucode.aspx

在线分解GIF帧图:http://zh.bloggif.com/gif-extract

bejson(杂乱):http://www.bejson.com

atool(杂乱):http://www.atool.org

Punch Card:http://www.kloth.net/services/cardpunch.php

分解素数(ESA):http://www.factordb.com/index.php

文件在线Hash:http://www.atool.org/file_hash.php

链接装载自:http://hack-0.lofter.com/post/1e5974f4_f81b8fe

2019黑盾杯

Posted on 2019-09-19 | In pwn

writeup:
https://github.com/ruan777/ctf/blob/master/heidunbei2019/readme.md

12…9

lh

89 posts
12 categories
© 2020 lh
Powered by Hexo v3.8.0
|
Theme – NexT.Pisces v6.7.0