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.0x19.
组合总和link:39. 组合总和 - 力扣(LeetCode)
思路分析其实思路和昨天的很像,但是元素可以复用而且也不是字符串.那还是依旧使用path进行记录,res进行返回结果,sum进行统计最后再加上一个标记位置进行判断即可.
1234567891011121314151617181920212223242526class Solution { List<Integer> path = new LinkedList<>(); List<List<Integer>> res = new ArrayList<>(); public List<List<Integer>> combinationSum(int[] candidates, int target) { int startIndex = 0; backstracking(candidates, target, sum, startIndex); return re ...
yubのAlgorithm.0x18
组合总和IIIlink:216. 组合总和 III - 力扣(LeetCode)
思路分析既然是要比对,那自然需要和目标值比对的sum,同时要记录path.这么一想其实和我们之前分析的组合问题就非常相似了.注意一下题目中给定的判定逻辑限制(数字1-9且不能重复)很完美的组合问题.天生的回溯搭子.
1234567891011121314151617181920212223242526272829303132333435class Solution { //记录路径 List<Integer> path = new LinkedList<>(); //记录结果 List<List<Integer>> result = new ArrayList<>(); public List<List<Integer>> combinationSum3(int k, int n) { backtracking(n,k,1,0); return ...
yubのAlgorithm.0x17
初探回溯什么是回溯算法回溯算法是一种暴力穷举的搜索方式.回溯和递归是相辅相承的**.(有递归就会有回溯)**
回溯法解决的问题
组合问题:N个数里面按一定规则找出k个数的集合.
切割问题:一个字符串按一定规则有几种切割方式.
子集问题:一个N个数的集合里有多少符合条件的子集.
排列问题:N个数按一定规则全排列,有几种排列方式.
棋盘问题:N皇后,解数独等.
使用回溯算法解决问题的思路虽然回溯算法暴力效率低下理解起来更为抽象,但好在天无绝人之路,回溯算法的问题都可以用树形结构来进行理解.
关键有以下两点:1.集合大小->树的宽度2.递归深度->树的深度
123456789101112void backtracking(参数) { if (终止条件) { 存放结果; return; } for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) { 处理节点; backtracking(路径,选择列表); // 递归 回溯,撤销处理结果 ...
yubのAlgorithm.0x16
修建二叉搜索树link:669. 修剪二叉搜索树 - 力扣(LeetCode)
思路分析注意修剪的时候要考虑到全部的节点,即搜到到限定区间小于左值或者大于右值时还需要检查当前不符合区间大小节点的右子树/左子树,不能直接返回null.剪去节点只需要在判断当前节点左/右子树后将root的左/右节点更新即可.
递归12345678910111213141516171819202122232425262728293031/** * 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.0x15.
二叉搜索树的最近公共祖先link:235. 二叉搜索树的最近公共祖先 - 力扣(LeetCode)
思路分析题目给出的是二叉搜索树,那就方便很多.(不用在意遍历顺序)已知左子树的值都比根节点小,右子树的值都比根节点大(每层都符合该规律)但是由于不知道p、q的值哪个比根节点大所以需要进行比较.我们在递归的时候只需要不断缩小判断区间即可.怎么缩小呢?和p、q的值进行比较即可.
递归1234567891011121314151617181920212223242526272829303132333435/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution { public TreeNode lowestCommonAncestor(T ...
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 ...