实践目标html
基础知识linux
实验原理、内容及步骤shell
问题与解决编程
实验收获vim
返回目录安全
objdump -d
获得汇编代码,而后对应起来看汇编指令和机器码。(如下指令的机器码均在括号中标出)objdump -d
: 将代码段反汇编。objdump -S
: 将代码段反汇编的同时,将反汇编代码与源代码交替显示,编译时须要使用-g参数调试信息。objdump -l
: 反汇编代码中插入文件名和行号。objdump -j section
: 仅反汇编指定的section。objdump -t
:输出目标文件的符号表。objdump -h
:输出目标文件的全部段归纳。objdump -x
:以某种分类信息的形式把目标文件的数据组成输出,可查到该文件的的全部动态库。:%!xxd
:进入十六进制模式。:%!xxd -r
:退出十六进制模式。返回目录bash
程序中的main函数会经过call
指令调用foo这个函数,实验的这一环节就是要改其地址、换其函数、实现“想要”的功能(详见下述步骤)。网络
call
指令这一行:call
指令对应的e8
,咱们要作的就是把四字节的偏移量ff ff ff d7
(小端序,补码)换成getShell
函数对应的。call
指令在执行时,会EIP当前的值,也就是下一条指令的地址——0x080484ba
压栈,而后修改寄存器EIP,将EIP指向foo函数的起始地址(由于EIP+偏移量= 0x080484ba + 0xffffffd7 = 0x08048491目的地址
)。call
指令的偏移量,由计算0x0804847d - 0x080484ba = 0xffffffc3
,简而言之,要把d7
换成c3
了。在vim下修改:以下图指令进入十六进制模式,而后定位,换后回到二进制模式。call
函数使程序跳转到了getShell
函数。1111111122222222333333334444444455555555
,发生段错误产生溢出。(注意EIP的值,是ASCII 5)1111111122222222333333334444444412345678
,那1234这四个数最终会覆盖到堆栈上的返回地址,进而CPU会尝试运行这个位置的代码。那只要把这四个字符替换为getShell的内存地址,输给pwn2,pwn2就会运行getShell。\x7d\x84\x04\x08
。xxd
查看input文件的内容是否如预期,而后将input的输入经过管道符“|”做为pwn2的输入,再现shell功能:apt-get install execstack
。root@KaliYL:~# execstack -s pwn1 //设置堆栈可执行 root@KaliYL:~# execstack -q pwn1 //查询文件的堆栈是否可执行 X pwn1 root@KaliYL:~# more /proc/sys/kernel/randomize_va_space 2 root@KaliYL:~# echo "0" > /proc/sys/kernel/randomize_va_space //关闭地址随机化 root@KaliYL:~# more /proc/sys/kernel/randomize_va_space 0
<32字节任意数据> + <4字节 RET覆盖地址> + <NOP垫> + <shellcode>
,最后一个字符千万不能是\x0a
。0xffffd34c
,shellcode在其基础上加4字节,因而修改\x4\x3\x2\x1
为\x50\xd3\xff\xff
。攻击成功:返回目录dom
bash: ./pwn1: 没有那个文件或目录
返回目录函数
我以为这个实验在操做上是很容易的,我也算是切身领会了BOF攻击神奇的乐趣,但在理解方面我还须要下一些功夫,有些知识本身看的时候并不能弄清楚,上课听老师讲完才知道,自学成效堪忧...还有一点收获是:谨防入坑。