您的位置:首页 > 理论基础 > 计算机网络

20145335郝昊《网络对抗》逆向及Bof基础实践

2017-03-01 17:18 603 查看

20145335郝昊《网络对抗》逆向及Bof基础实践

1.实践说明

本次实践是对一个名为
pwn1
的可执行Linux文件进行操作。程序的执行流程是:主函数
main
调用
foo
函数,
foo
将函数其功能简单回显任何用户输入的字符串。

程序包含另一个代码片段,
getshell
,会返回一个可用
shell


使用两种方法进行修改文件
pwn1
的代码:

利用
foo
函数的
Bof
漏洞构造一个攻击输入字符串,覆盖返回地址,出发
getShell
函数。

手工修改可执行文件,改变程序执行流程,直接跳转到
getShell
函数。

2.实践过程

直接修改程序机器指令

第一:首先确定文件
pwn1
是可以执行的。



第二:用vi打开
pwn1
文件,会发现是乱码,使用命令
%!xxd
将乱码格式修改为16进制进行表示。



第三:使用命令
/e8 d7
查找到要修改的内容,使用
i
为键入模式,将
d7
修改为
c3






第四:使用命令
%!xxd -r
还原为原格式,并使用命令
:wq
保存退出vi

实践结果会得到:





通过构造输入参数,造成BOF攻击,改变程序执行流。

法现该可执行文件正常运行是调用如下函数
foo
,这个函数有
Buffer overflow
漏洞。

080484af <main>:
80484af:   55                      push   %ebp
80484b0:   89 e5                   mov    %esp,%ebp
80484b2:   83 e4 f0                and    $0xfffffff0,%esp
80484b5:   e8 d7 ff ff ff          call   8048491 <foo>

上面的call调用foo,同时在堆栈上压上返回地址:80484ba

确认输入字符串哪几个字符会覆盖到返回地址

为了确定使用多少个字节才会使缓冲区溢出,这里使用暴力破解法,及一个一个字符添加直到出现
Segmentation fault
字样。



使用GDB调试





确认用什么值来覆盖返回地址

getShell的内存地址是0804847d。

接下来要确认下字节序(这里是低字节放在高位的大端法),简单说是输入20145335201453352014533520145335\x7d\x84\x04\x08。(前面32字节可以任意输入)



构造书输入字符串

然后将input的输入,通过管道符“|”,作为的输入。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: