GHCTF有感
前言学校的新生赛,小登是废物,不太会布栈那道(不怎么动调的报应来了),现在分析一下。
[官方的wp | iyheart的博客](https://iyheart.github.io/2025/03/09/CTFblog/write up系列blog/2025年/GHCTF2025-PWN方向wp/)
分析checksec查看文件,没开任何保护,考虑的做法有ret2shellcode和ret2syscall。
再看ida分析内容,发现程序只有两部分内容,一是打印图像,二是读取。关键在于读取这一部分,发现它不是常规的syscall ret 而是syscall jmp [rsp+8+var_8] (var_8= qword ptr -8),即程序读取后会跳转到rsp所储存的位置。
再试试ropper查看gadget,发现基本上少的可怜,再看ida给出了几条关键的gadgets。
如上所示,给了rsi rdi rdx的gadgets,但是没有rax相关的gadget,再看
哎,xchg可以交换rax和r13的值,所以我们可以控制r13进而控制 ...
WSL安装pwn环境
安装WSL步骤首先,摁下win在搜索栏中搜索 功能,在弹出的窗口下滑找到适用于Linux的Windows子系统和虚拟机平台这两项,并且勾选,随后重启电脑。
随后,打开windows自带的Microsoft store里,搜索想要的linux发行版本,这里我下载的是ubunutu 20.04版本,点击下载,下载后打开,输入你的名称和密码。
或者直接用 PowerShell(ctrl+shift+enter进入管理者模式) 命令安装:
wsl --install -d Ubuntu-20.04
安装完成后,ubuntu 并进行初始化。
可能遇到的问题在安装完后,打开wsl,可能出现
Installing,this may take a few minutes..WslRegisterDistribution failedwitherror:0x800701bcError:0x800701bc WSL 2 ?????????????????? https://aka.ms/ws12kernelPress anykey to continue..
这个原因是内核没有更新,只需要用 Pow ...
沙箱基础学习
沙箱保护介绍沙箱保护用于限制程序的行为,防止攻击者通过漏洞执行任意代码或敏感系统调用(如execve)。最常见的是禁用一些系统调用,使得我们不能通过系统调用execve或system等获取到远程终端权限,因此只能通过rop链的方式调用orw(即为open**, read, **write)的来读取并打印flag 内容
一般有两种函数调用方式实现沙盒机制,第一种是采用prctl函数调用,第二种是使用seccomp库函数。
orw
open
int open(const char *pathname, int flags, mode_t mode);
第一个参数是文件路径,一般写’flag’即可
后面两个参数一般都设为0,0
read
ssize_t read(int fd, const void *buf, size_t count);
fd 是文件描述符,0标准输入,1标准输出,2标准错误, 3及更高的数字则表示打开的其他文件或资源。使用read函数打开flag文件,故fd=3
第二个参数是地址,将 flag`写入指定的内存地址中,这里是写在**.bss* ...
python入门
基本语法标识符
第一个字符必须是字母表中字母或下划线 _ 。
标识符的其他的部分由字母、数字和下划线组成。
标识符对大小写敏感。
基本与c语言一致
注释Python中单行注释以 # 开头,多行注释可以用多个 # 号,还有 ''' 和 """
# 第一个注释# 第二个注释 '''第三注释第四注释''' """第五注释第六注释"""
行与缩进python最具特色的就是使用缩进来表示代码块,不需要使用大括号 {} 。
缩进的空格数是可变的,但是同一个代码块的语句必须包含相同的缩进空格数。实例如下:
if True: print ("Answer") print ("True")else: print ("Answer") print ("False")
多行语句Python 通常是一行写完一条语句,但如果语句很长 ...
数据结构*单链表
单链表定义定义单链表(Singly Linked List)是一种链式存储的数据结构,由一系列节点(Node)组成,每个节点包含两个部分:
数据域(Data):存储数据。
指针域(Next):存储指向下一个节点的地址。
例如:
typedef struct node(){ int id; //数字域 node* p; //指针域}Node;
时间复杂度
数组
查找效率更高,但插入和删除(非尾部)操作较慢。
单链表 插入和删除效率较高(尤其是头部),但查找效率较低。
操作
单链表(Singly Linked List)
数组(Array)
查找
O(n)(需要从头遍历)
O(1)(可通过索引直接访问)
插入
O(1)(直接修改指针)
O(n)(需要移动元素)
删除
O(1)(直接修改指针)
O(n)(需要移动元素)
基本操作初始化Node* initlist(){ Node* head = (Node*)malloc(sizeof(Node)); head->data=0; head->next=NULL; ...
c语言作业3
作业9作业9-1编写一个函数int add(int n),使用递归算法求1+2+3+…+n,在main函数中 输入n,调用add函数后并输出计算结果。
例如: 输入:10,输出:55
输出:100,输出:5050
#include<stdio.h>int add(int n){ if(n==1) return n; else return add(n-1)+n;}int main(){ int n; scanf("%d",&n); printf("%d",add(n)); return 0;}
作业9-2编写一个函数void string_copy(char *f,char *t),功能是将f字符串得到t中, 在main函数中定义两个字符数组char x[100], y[100],输入x字符串,调用string_copy函 数将x字符串复制到y中,输出y字符串。
例如: 输入:12345,输出:12345
输入:ab ...
个人c语言数组小结
输入输出for(int i=0;i<n;i++){ scanf("%c",&arr[i]);//输入 printf("%c",&arr[i]);//输出}
特殊输出*二维数组for(int i=0;i<n;i++){ for(int j=0;j<N;j++)//N指的是二维数组划分的大小 scanf("%c",&arr[i][j]);}
特殊输出*逆序for(int i=n;i>=0;i--){ printf("%c",arr[i]);}
选择排序void sort(int arr[],int n){ for(int i=0;i<n-1;i++) { int min=i; for(int j=i+1;j<n;j++){ if(arr[j]<arr[min ...
c语言作业2
作业5作业5-1输入n个整数,按从小到大输出这n个整数(输出时 数据之间用一个空格隔开)。其中,n由键盘输入。
#include<stdio.h>void sort(arr[],int n){ for(int i=0;i<n;i++){ int min=i; for(int j=i;j<n;j++){ if(arr[min].arr[j]){ min=j; } int temp=arr[min]; arr[min]=arr[j]; arr[j]=temp } }}int main(){ int n,arr[100]; scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%d",arr[i]); } sort(arr,n); ...
打印金字塔图样题目大全
打印金子塔的三个循环做过点题目的都知道,这种题至少要三个for循环来实现,首个for控制行数,内部两个控制空格和打印内容,总结为如下:
//正金字塔for(int i=1;i<=n;i++){ //行数 for(int j=0;j<n-i;j++){//控制在第i行内的空格数 printf(" "); } for(int k=;k<=2*i-1;i++){//控制在第i行内的字符 printf("*"); } printf("\n");//跳出这一行,到i+1行}
倒金字塔与正的类似,内部两个语句相同,但是控制行数的语句不同。
for(int i=n;i>0;i--){ //行数 for(int j=0;j<n-i;j++){//控制在第i行内的空格数 printf(" "); } for(int ...
c语言作业1
作业1作业1-1编写一个程序,功能是:输入一个3位的正整数,逆序输出。如输入:345,则输出:543,输入:530,则输出:035。
#include<stdio.h>int main(){ int n,g,s,b; scanf("%d",&n); g=n%10; b=n/100; s=n%100/10; printf("%d %d %d",g,s,b); return 0;}
加强一下,编写一个程序,功能是:输入一个不知道有几位的正整数,逆序输出。如输入:345,则输出:543,输入:530,则输出:035。
#include<stdio.h>#define N 100int main(){ int n; char arr[N]; scanf("%s",arr); int length=strlen(arr); for (int j = length - 1; j >= 0; j--) { ...