pwn探索--大杂烩
pwn的核心:二进制漏洞的利用和挖掘研究层次:编译成机器码的二进制程序的漏洞二进制程序实际为可执行文件linux系统下ELF=windows系统下EXE文件一次简单的hack
CTF中pwn攻击脚本思路:
1.pwn程序/服务器(必不可少滴)开端——>from pwn import*2.使用python中pwn tools用remote函数打开远端需要攻击的服务器端口3.进行链接4.构造恶意数据5.发送恶意数据6.使用交互函数(io.interactive())获取flag
程序的编译与链接
linux借助文件头进行识别!(用vim打开可查看源码–>%!xxd可查看十六进制表示)
编译过程ls指list file即列出文件;可用ll查看文件详细内容。gcc兼具编译器和汇编器的功能。ctrl+alt+t 启动shell
Linux环境下执行可执行文件!xdd%-r 还原文件rm a.out 删除./a.out 是linux/unix环境下gcc编译源代码(c/c++)并连来接产生的默认执行文件名。./a.out ...
The Missing Semester of Your CS Education
The Missing Semester of Your CS EducationFirst Course Overview The Shell命令行语句
pwd(process[print] working directory)
输出当前位置
cd .
到当前目录
cd ..
上一级目录
cd /cd ~
回到根目录
cd -
回到跳转前的目录(可在两个目录之间切换)
ls -l
列出当前目录下子文件的详细信息
ls -a
列出所有文件包含隐藏文件
* ?
代替一个字符串 一个字符
mv A B
重命名并可以移动文件
cp A B
复制并可以移动文件
control L
清除终端
cat
打印文件内容到终端上
touch
建立新文件
>>
不覆盖而是叠加
A | B
A的输出作为B的输入
grep A B
在A里查找B
man,rm,mkdir,rmdir
> /
覆盖
rm用于无递归删除 -r 递归删除 rmdir仅允许删除空目录
mkdir 创建目录 ...
Docker部署小记
上次出题还是上次,好多指令已经记不清了.暂时写在这里,给自己也给以后的你们查阅.
有用的工具如果你去喜欢的浏览器搜索,不难发现xinetd确实很实用.(笑)
1git clone https://github.com/Eadom/ctf_xinetd.git
安装之后发现长这样
手搓docker-compose.yml(不会也可以找人机hh).
123456789101112version: '3' services: pwn: build: ./ image: pwn #这里的image写自己创建的镜像名 ports: - "60001:9999" pids_limit: 1024 # cpus: 0.5 restart: unless-stopped # privileged: true
ctf.xinetd文件
1234567891011121314151617181920service ctf{ ...
2024CUDSEC新生赛
CUDSEC——第七届”玄武杯”Pwn方向WPsign签到题没什么好说的 flag写在程序里 拖进IDA秒.
easy_shell算加强版签到了 运行程序看到
提示给了shell 那是提供了后门的(进IDA分析也能看到)直接
1ls 1>&0
打远程加上flag查看就好了.
1cat flag 1>&0
如果说为什么出这个感觉不沾边 问就是之前给新同学们布置过相关学习任务 考察一下(欢迎非预期的佬们交流~
only_chance这题有学弟卡在第二次地址接收 其实主要还是栈的工作原理理解的不是特别透彻(反思ing
运行其实就有提示没有后门怎么搞 八成要自己构造shellcode多打几次IDA分析发现gets s的大小是280 这里就可以利用栈溢出重定向到main进行第二次程序运行执行shellcode使用NOP sled确保在返回到 shellcode 时,即使位置偏移,程序也会“滑行”到有效的指令区域(2048也111)
exp
12345678910111213141516171819202122232425262728293031323334fro ...
yubのAlgorithm.0x14
验证二叉搜索树link:98. 验证二叉搜索树 - 力扣(LeetCode)
思路分析搞清二叉搜索树的定义即可.(根节点的左子树比根节点小,右子树比根节点大且每个子树都满足)
但其实上述思路是是不对, 跑一下代码发现测试样例值通过了一部分.那是哪里出问题了?(烧烤)比较的应该是左子树所有节点小于中间节点,右子树所有节点大于中间节点.查资料发现二叉搜索树也可以为空
迭代1234567891011121314151617181920212223242526272829/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode righ ...
yubのAlgorithm.0x13
最大二叉树link:654. 最大二叉树 - 力扣(LeetCode)
思路分析在数组中遍历找到最大值(根节点),分割得到左右子树,再回溯遍历左右子树(还是先找到最大值作为子树的根节点再遍历)
递归12345678910111213141516171819202122232425262728293031323334353637383940414243/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { * this.val = val; * this.left = ...
yubのAlgorithm.0x12
找树左下角的值link:513. 找树左下角的值 - 力扣(LeetCode)
思路分析看题目给出的样例分析,觉得可以从深度入手.如果是左子树深度最大,那直接输出最左边的左子树节点即可(只有一个左节点的话也是如出一辙)又假设二叉树中至少有一个节点,就已经列举出一种特殊需要判断的情况了.
递归12345678910111213141516171819202122232425262728293031323334353637383940414243/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { * ...
yubのAlgorithm.0x11
二叉树的最大深度link:104. 二叉树的最大深度 - 力扣(LeetCode)
思路分析高度:后序遍历深度:前序遍历但是其实这里我们可以选择后序遍历,根节点的高度就是树的深度.
递归1234567891011121314151617181920212223242526272829/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { * this.val = val; * this.left = left; * this.right = righ ...
yubのAlgorithm.0x1
二分查找link:704. 二分查找 - 力扣(LeetCode)
思路分析题目给出数组升序 ,想到二分查找(好吧其实题目也给出来了w)找到mid,根据逻辑大小缩小范围比较.
全包围[lefg,right]假如数组大小为6,取值范围就是[0,5].闭区间使得定义left = 0,right = nums.length-1(防止越界指针无效,也是根据此处可以反推没有左开右闭情况)left指针是0.right是5,这个时候left == right是有效的,结束条件也就是left<=right,再根据mid位置进行判断,target是再mid左边还是右边或者是幸运的查找到目标位置.
123456789101112131415161718192021class Solution { public int search(int[] nums, int target) { //看到数组习惯性反应越界问题 //闭区间 int right = num ...
yubのAlgorithm.0x10
二叉树的层序遍历(广度优先遍历)link:102. 二叉树的层序遍历 - 力扣(LeetCode)
思路分析题目说明从左往右进行遍历,其实可以堪称给二叉树每一层都画横线分割开来,left first,right last.
n代表null 输出只从存在的节点中输出.最先想到的就是递归,按照创建树的思路,pass掉空节点就好.先前做过队列模拟栈,其实这里用队列来解决也很优雅.
队列BFS12345678910111213141516171819202122232425262728293031323334353637383940414243/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode ...