Life has its own fate, and meeting may not be accidental.

0%

因为很多东西都是写给我自己看的,免得我自己忘记。所以很多东西会写的尽量详细。免得自己看不懂自己当时写的~~~不喜欢勿喷

反序列化是什么

  1. 序列化(Serialization)
    • 序列化是将对象的状态信息转换为可以存储或传输的形式的过程。在 Java 中,这通常意味着将对象转换为字节序列,以便可以将其写入文件、数据库或通过网络发送到另一个系统。
    • Java 通过实现 java.io.Serializable 接口来标识一个类是可序列化的。实现 Serializable 接口的类可以被 ObjectOutputStream 类序列化。
    • 序列化过程中,对象的类、属性和属性值都会被保存。如果对象图中包含其他对象的引用,这些对象也会被递归地序列化。
    • 序列化的结果是一个字节流,通常保存在 ByteArrayOutputStream 或 FileOutputStream 中。
  2. 反序列化(Deserialization)
    • 反序列化是序列化过程的逆过程。它涉及将保存的字节序列恢复为原来的对象状态。
    • 在 Java 中,反序列化通常是通过 ObjectInputStream 类来完成的。这个类可以读取先前序列化的对象,并重建原始对象的状态。
    • 反序列化时,需要确保序列化对象的类定义在当前运行环境中是可用的。如果类定义不可用,或者类的结构在序列化后发生了不兼容的变化,反序列化将失败,并可能抛出异常。
    • 反序列化后,对象将恢复其原始状态,包括所有属性值和关联的对象引用。
      阅读全文 »

什么是java反射?

Java反射(Reflection)是Java编程语言的一个强大特性,它允许程序在运行时访问和操作类、接口、字段、方法等的元数据。反射API提供了一组类和方法,使得程序能够查询和使用类的信息,以及在运行时动态地创建对象、调用方法、访问字段等。
使用Java反射,你可以实现以下功能:

  1. 在运行时获取类的信息:可以通过Class类或Class.forName()方法获取类的Class对象,然后查询类的定义信息,如类名、父类、实现的接口、构造函数、字段和方法等。
  2. 动态创建对象实例:使用Class对象的newInstance()方法可以创建类的实例,即使在编译时不知道具体的类名。
  3. 动态调用方法:可以通过Method对象的invoke()方法动态地调用对象的方法,无论这些方法是公共的、受保护的、默认的还是私有的。
  4. 动态访问和修改字段:使用Field对象可以动态地读取或修改对象的字段值,无论字段的访问权限如何。
  5. 创建代理对象:利用InvocationHandler和Proxy类,可以在运行时创建接口的代理实例,而无需在编译时定义具体的实现类。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Main {
public static void main(String[] args) {
try {
// 获取Class对象
Class<?> clazz = Class.forName("java.lang.Runtime");

// 使用getMethod获取Runtime类的getRuntime().exec方法
Method getRuntimeMethod = clazz.getMethod("getRuntime");

// 使用invoke方法动态调用getRuntime方法
Object result = getRuntimeMethod.invoke(clazz);
Method execMethod = clazz.getMethod("exec", String.class);
execMethod.invoke(result,"calc.exe");

} catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
}
}

简化写法

1
2
Class clazz = Class.forName("java.lang.Runtime");
clazz.getMethod("exec",String.class).invoke(clazz.getMethod("getRuntime").invoke(clazz),"calc.exe");

这里用到了 getMethod 和 invoke 方法。

getMethod

在Java中,getMethod是java.lang.Class类的一个方法,它用于在运行时获取类中特定名称和参数类型的Method对象。这个Method对象代表了类中的一个方法。
getMethod 的作用是通过反射获取一个类的某个特定的公有方法。使用getMethod方法,你可以在运行时动态地调用一个对象的方法,即使在编译时你不知道具体要调用哪个方法。getMethod方法有几种重载形式,最常见的两种是:

  1. getMethod(String name):通过方法名获取一个无参方法。
  2. getMethod(String name, Class<?>… parameterTypes):通过方法名和参数类型数组获取一个方法。

我们使用最简单的,也就是第一个,它只有一个参数,类型是String,所以我们使用 getMethod(“exec”, String.class) 来获取 Runtime.exec 方法。


这个例子中我们首先获取了String类的Class对象,然后使用getMethod方法获取了getRuntime方法的Method对象。最后,我们通过invoke方法动态地调用了exec()方法,并打印了结果。

invoke

在Java中,invoke方法是java.lang.reflect.Method类的一个方法,它用于动态调用一个对象的方法。这个方法是Java反射机制的一部分,允许程序在运行时确定和调用方法,而不需要在编译时硬编码方法的调用。
invoke方法的基本语法如下:

1
public Object invoke(Object obj, Object... args)
  • obj 参数是要在其上调用方法的对象。如果方法是一个静态方法,那么这里传入的是类本身(Class 对象)。
  • args 参数是一个可变参数,包含了要传递给方法的参数。如果调用的方法不需要参数,这里可以传入一个空数组。

invoke 方法可能会抛出几个异常:

  • IllegalAccessException:如果方法不可访问,比如它是私有的。
  • InvocationTargetException:如果方法本身抛出了异常,这个异常会被封装在InvocationTargetException中。可以通过调用getCause方法来获取原始的异常。
  • IllegalArgumentException:如果传递给invoke的参数不正确,比如参数数量不匹配或者类型不兼容。

使用例子如下:

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
import java.lang.reflect.Method;

public class InvokeExample {
public static void main(String[] args) {
try {
MyClass math = new MyClass(); // 创建一个Math类的对象
Method method = MyClass.class.getMethod("add", int.class, int.class); // 获取Math类的add方法
Object result = method.invoke(math, 5, 3); // 动态调用add方法
System.out.println("Result: " + result); // 输出结果

Method staticMethod = MyClass.class.getMethod("staticMethod"); // 另一个例子:调用静态方法
Object staticResult = staticMethod.invoke(null);
System.out.println("Static Result: " + staticResult);
} catch (Exception e) {
e.printStackTrace();
}
}
}

class MyClass {
public int add(int a, int b) {
return a + b;
}

public static String staticMethod() {
return "Hello from static method!";
}
}

我们首先通过getMethod获取了MyClass的add方法和staticMethod方法的Method对象。然后,我们使用invoke方法分别调用了这两个方法,并打印了结果。对于staticMethod,我们传入null作为第一个参数,因为静态方法不需要对象实例就可以调用。

最近一段时间都在忙着红队项目和攻防类项目,一直没时间去把笔记脱敏转成博客。以后随缘更新吧,有些东西太容易被溯源了….

阅读全文 »

这个马子倒是提前就研究好了,但是因为前段时间项目要用到,所以得等项目结束后再发出来,免得杀软检测了。免杀效果还行,不做沙箱对抗的话,常见的麦咖啡、卡巴斯基、小红伞、赛门铁克、defender、天擎都能过。

阅读全文 »

向日葵新版密码抓取,必须dump内存,十六进制查找,新版不存在配置文件中,后续会将其他工具的最新手法也同步到博客中来,嗯等我有空的话。。

阅读全文 »

太久没写博客了,最近这段时间项目太多了有点忙,简单把最近跟进的cve复现一下,因为这个是提权漏洞,提权后需要运行自己的exp文件,因为考虑到可能会被查杀,所以文件就不放出来了。

阅读全文 »

介绍

在Windows Server 2012中新加入的功能,与传统的约束委派相比,它不再需要域管理员权限去设置相关属性。RBCD把设置委派的权限赋予了机器自身,既机器自己可以决定谁可以被委派来控制我。就是说机器自身可以直接在自己账户上配置msDS-AllowedToActOnBehalfOfOtherIdentity属性来设置RBCD。

阅读全文 »