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 <snprintf@plt>
movb $0x0,-0x9(%ebp)
lea -0x38(%ebp),%eax
mov %eax,(%esp)
call 80483cc <printf@plt>
其作用是,将esp
指向栈上方16个字节处,ebp
下方9个字节处赋0,最后打印。
2. 攻击代码分析
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 <memset@plt> % 对内容进行填充
mov 0x8(%ebp),%eax % 将argv[2]即我们输入的第二个内容赋给eax
movzbl (%eax),%eax % 负责拷贝一个字节,并用0填充其目的操作数的其余各位(0扩展)
and $0x1,%eax
test %al,%al % 判断是否跳转
jne 8048568 <vuln2+0x56> % 判断结果是会跳转
mov $0x80486d9,%eax
mov 0x8(%ebp),%edx
mov %edx,0x4(%esp) % 将argv[2]即我们输入的第二个内容赋给esp上方4字节处
mov %eax,(%esp) % 将$0x80486d9赋给esp
call 80483cc <printf@plt> % 调用打印函数
2. 攻击代码分析
perl -e
后面紧跟着引号里面的字符串是要执行的命令2表示switch中的case2
只要保证首字母的尾数是偶数即可,这里我们选择B,其后可任意填充内容,我们填充A,从而覆盖栈。最后覆盖的是跳转地址,winner函数的地址是
080484c4
。填充的长度取决于是否能覆盖返回地址。