资讯中心

IDEA断点调试

📅 2026/8/15 11:03:20
IDEA断点调试
第一轮断点调试先将main函数里面的进行分析打上断点main函数将主要的函数打上断点先粗糙的看一下main函数里面的内容明白每一句函数对链路有什么影响在33行的payload没运行时只有之前传入的cmd和key参数可以看到这行在运行后出现了payload的值过程相对复杂后续在第二轮的断电分析里面来详细分析这里面的内容但现在要明白payload本质上是一个hashmap里面只有一对键值对keytiedmapentryvaluevalue。其中的tiedmapentry是攻击的本质value是占位子的接着往后运行byte[] serialized serialize(payload)这一步本质来讲就是把对象之间的网络转化成二进制的字节流也就让我能看到-84 -19 0 5开头的有java对象字节流特点的byte。后调试c断点后进行AES加密接着转化成base64编码的文本存入rememberme里面调试断点D这个也就实现了AES解迷后base64解码恢复成了字节流和上文的serlialized里面的值是一样的。调试断点E也就实现了运行这个字节流实现了触发calc.exe;以上是第一轮断点调试实现了模拟本地构造服务器响应的全过程第二轮断点来详细解释一下payload的函数逻辑。先进行第一个函数将其中输入恶意类字节码makeEvilBytecode是一段恶意代码其他的内容基本是凑数的接着往transformer里面传内容并且生成一个空的innermap让后用lazymap里面传入innermap和transformer的内容后生成一个tiedmapentry的内容里面放了lazymap和templates的内容同时66行生成一个空的expmap后面的67行实现了添加一个键值对进入expmap后面的lazymap.clear只去掉一个innerMap 里的那条缓存。tiedMapEntry和expMap都不受影响。后面就把之前的getclass改成了newtransformer这样在运行时就实现了服务端反序列化时lazyMap.get(templates)一落空就会触发transform(templates)而那时方法名已经是newTransformer先通过了L/M/N断点然后到了ois.readobject的断点可以看得到里面的decrypted是base64的开头后续运行到hashcode里面第二次的this、this.map来自readObject()按字节流重建——是一批新对象内存地址完全不同但字段内容map 指向 LazyMap、key 指向 TemplatesImpl和序列化前保存的一致。现在进入了if (!this.map.containsKey(key)) {也是getvalue的里面的内容后就进入这个后面的调用算出map.containsKey(templates) false因为缓存被清空过走进factory.transform(key)→ 函数切换到InvokerTransformer.transform(Object input)断点 Ninput TemplatesImplreturn之后就直接运行exe了