操作系统实验

Attack1

1. 汇编分析
push %ebp
mov %esp,%ebp
sub $0x48,%esp

其作用是建立栈结构。

之后,

mov $0x80486b9,%eax ; $0x80486b9 contains "%s"
mov 0x8(%ebp),%edx
mov %edx,0xc(%esp)
mov %eax,0x8(%esp)
movl $0x30,0x4(%esp)

其作用是在esp上4字节处赋值0x30,8字节处添加含有%s的内容,在12字节处添加argv[2]即我们输入的第二个内容。

lea -0x38(%ebp),%eax
mov %eax,(%esp)
call 80483fc 
movb $0x0,-0x9(%ebp)
lea -0x38(%ebp),%eax
mov %eax,(%esp)
call 80483cc 

其作用是,将esp指向栈上方16个字节处,ebp下方9个字节处赋0,最后打印。

操作系统实验_第1张图片
栈结构.png
2. 攻击代码分析
攻击代码截图.png
  • perl -e 后面紧跟着引号里面的字符串是要执行的命令

  • 1 表示switch中的case1

  • 接着输入you win!字符串的地址(winner中给出),之后的%d%d%d%s如下图所示读取前三个数值之后,以%s格式读取我们输入的字符串,从而打印出该地址保存的字符串you win!

Attack2

1. 汇编分析
push %ebp
mov %esp,%ebp 
sub $0x38,%esp  %56个字节

其作用是建立栈结构。

movl $0x20,0x8(%esp)  % 将0x20赋给esp上八个字节处
movl $0x0,0x4(%esp)   % 将0x0赋给esp上四个字节处
lea -0x28(%ebp),%eax   
mov %eax,(%esp)  %  将esp指向ebp下方40字节处
call 804839c   % 对内容进行填充
mov 0x8(%ebp),%eax  % 将argv[2]即我们输入的第二个内容赋给eax
操作系统实验_第2张图片
栈结构2.png
movzbl (%eax),%eax % 负责拷贝一个字节,并用0填充其目的操作数的其余各位(0扩展)
and $0x1,%eax 
test %al,%al % 判断是否跳转
jne 8048568   % 判断结果是会跳转
mov $0x80486d9,%eax 
mov 0x8(%ebp),%edx  
mov %edx,0x4(%esp)  %  将argv[2]即我们输入的第二个内容赋给esp上方4字节处
mov %eax,(%esp)  % 将$0x80486d9赋给esp
call 80483cc   % 调用打印函数

2. 攻击代码分析

攻击代码2.png
  • perl -e 后面紧跟着引号里面的字符串是要执行的命令

  • 2表示switch中的case2

  • 只要保证首字母的尾数是偶数即可,这里我们选择B,其后可任意填充内容,我们填充A,从而覆盖栈。最后覆盖的是跳转地址,winner函数的地址是080484c4

  • 填充的长度取决于是否能覆盖返回地址。

你可能感兴趣的:(操作系统实验)