2023届的信安大挑战——pwn(持续更新!)

  • 2023届的信安大挑战——pwn(持续更新!)已关闭评论
  • 65 次浏览
  • A+
所属分类:linux技术
摘要

这是我打的第一次比赛,主打的pwn方向,纪念我的成长
需求:一定的linux系统的命令指令知识,基础的汇编代码,配置好了的虚拟机(打pwn建议是ubuntu),pwntools的使用,python的使用,ROPgadget的使用
每次把文件拖入IDA前记得用Exeinfope进行检查一下,看是x86还是x64

这是我打的第一次比赛,主打的pwn方向,纪念我的成长
需求:一定的linux系统的命令指令知识,基础的汇编代码,配置好了的虚拟机(打pwn建议是ubuntu),pwntools的使用,python的使用,ROPgadget的使用
每次把文件拖入IDA前记得用Exeinfope进行检查一下,看是x86还是x64

网络猫咪

首先打开题例,可以发现提示里就有个nc,就是个普通的nc题
格式:nc IP 端口
2023届的信安大挑战——pwn(持续更新!)
最后输入ls列出当先文件中所包含的其它文件,找到flag,使用cat flag指令获取flag里的内容,显示出的内容就是本题的flag
2023届的信安大挑战——pwn(持续更新!)

看看你的shell

打开题例,下载附件,使用IDA查看代码
2023届的信安大挑战——pwn(持续更新!)
2023届的信安大挑战——pwn(持续更新!)
乍一看下,main函数里似乎没有什么漏洞,那么就在子函数里寻找有没有别的漏洞
当我们点开sub_1C86的时候,发现了有意思的东西,"sh"和"flag"都被过滤掉了,说明我们很有可能要从这里下手
2023届的信安大挑战——pwn(持续更新!)
先nc一下试试
2023届的信安大挑战——pwn(持续更新!)
发现IDA里未识别的函数名在这里都有了名称,且第五个是command,恰好与sub_1C86对应,我们有理由怀疑这就是类似终端的命令
虽然它过滤了"sh",但是我们还有另一个"$0"可以利用,其作用等效于"sh""/bin/sh",将其输入即可获得shell
最后ls和cat即可
2023届的信安大挑战——pwn(持续更新!)
不过佬在这种漏洞上还有其它两种不同解法:
1.过滤掉了"flag",可以用"cat /*"来查看当前目录下的所有文内容
2023届的信安大挑战——pwn(持续更新!)
2.过滤掉了"flag",可以用"/???/??? ????"来进行匹配(这是个什么原理我还不知道)
2023届的信安大挑战——pwn(持续更新!)
当然这都只是其中一个方法,属于逻辑漏洞,佬们还有另一个解法,我还没理解,就先不写这个了

stack_is_so_easy

题例,下载!
2023届的信安大挑战——pwn(持续更新!)
拖进IDA看看呢,一眼看到backdoor函数呢,可以狠狠对它进行栈溢出呢
2023届的信安大挑战——pwn(持续更新!)
2023届的信安大挑战——pwn(持续更新!)
脚本构造如下~
2023届的信安大挑战——pwn(持续更新!)
轻松拿下flag~
2023届的信安大挑战——pwn(持续更新!)

easy_shellcode

依然是打开题例,下载附件
2023届的信安大挑战——pwn(持续更新!)
使用checksec查看保护机制,发现开了NX保护和部分地址随机化
2023届的信安大挑战——pwn(持续更新!)
使用IDA查看代码,然后会看见几个很明显的有漏洞的函数,read,my_read,这两个就是本次的关键
2023届的信安大挑战——pwn(持续更新!)
因为addr并不在栈上,所以NX无法保护到它,并且read读取的字节数够长,我们可以考虑在read中插入shellcode传入addr中,而在my_read中进行栈溢出跳转到addr中获取到shell。
但是在my_read后有个刺头strlen不让我们输入超过9字节长度的数据,和栈溢出相冲突,那么此时,我们可以考虑绕过它。只要在输入的字节中开头使用'/x00'字符后,strlen便不会再检测后边的数据,就可以进行绕过了,那么,脚本如下
2023届的信安大挑战——pwn(持续更新!)
运行脚本后就可以获得flag啦!
2023届的信安大挑战——pwn(持续更新!)

messageborad

开头就不赘叙了,大家都懂,确实有个后门函数,也可以进行栈溢出
2023届的信安大挑战——pwn(持续更新!)
2023届的信安大挑战——pwn(持续更新!)
但是我们进入backdoor后发现,调用的system函数里的参数并不是我们想要的,那么我们就要想办法向里边传参
2023届的信安大挑战——pwn(持续更新!)
在汇编代码里找到了一串很长的稀奇古怪的"bin/sh"字符串,将它的字节数展开(按"A"),会变成一个个字符,我们需要的只是"sh"(sh作用等效bin/sh),获取sh中s的地址即可
2023届的信安大挑战——pwn(持续更新!)
2023届的信安大挑战——pwn(持续更新!)
那么我们此时的思路就是,进行栈溢出后,设法将获取到的sh地址传入system中即可,但是没有return该怎么办呢?这里就要介绍到我们强大的ROPgadget了!能够在二进制文件里寻找我们需要的汇编代码及其相关地址,是pwn的必备工具之一!
哦对,别忘了在进行ROPgadget之前查看是x86还是x64
2023届的信安大挑战——pwn(持续更新!)
在这里我已经查看了是x64,参数不会直接寄存于栈上,而是会在寄存器中,依次存在Rdi,Rsi,Rdx,Rcx,R8,R9中,当参数大于6的时候,才会将参数保存在栈中。
此时使用ROPgadget搜索Rdi,恰好这就是我们需要的,在保存一个参数之后可以直接进行return指令
2023届的信安大挑战——pwn(持续更新!)
此时我们的思路已然明了:栈溢出——跳转到rdi——将"sh"的地址数据传输到rdi中——ret回backdoor函数中调用system函数——运行脚本——获取权限和flag
2023届的信安大挑战——pwn(持续更新!)
2023届的信安大挑战——pwn(持续更新!)