2021浙江省预赛
作者因为之前电脑丢了导致中间两个月断更,最近会把之前的很多都补回来。言归正传,这次比赛总体来说不太理想,没有达到预期。
比赛情况总结我,学姐,学长分别出一题,最终得分350,排名在42。而我是出了一道密码题,pwn题没出,因为pwn题一道shellcode题当时分析没有考虑\0截断的这个特性,以为所有shellcode都要满足这个特性,觉得手撕汇编撕不过,就放弃了,没想到竟是一个\0绕过,这波,属实大意了闪了。
部分题目writeupCrypto-Easy Railfence观察加密方式,发现这个加密只进行了位置对换,并且开头特意提醒flag的形式为 flag{} ,那么先根据 已有长度写出参数
1m='flag{_________________________________________________________}'
现在Rail和offset不确定,但是 flag的格式确定,因此对参数进行爆破,然后观察发现l和g还有{}在整个 给的加密结果中只有一个并且位置已经确定,那么根据这个特性写出如下脚本。
12345#encrypt ...
babyfengshui_33c3_2016 writeup
好久没有更新博客了,因为作者太懒了,又懒又菜,今天来康康这道题,buuoj的babyfengshui_33c3_2016
分析elf文件checksec一下发现canary保护和NX保护,got表没有保护,且随即地址没有开启。这就意味着got表可写,拖到IDA当中发现是一个经典的堆菜单题,以我现在的水平,那就是先分析它free后指针有无清零。本来一开始看它free了两个堆块,确指将一个指针清零了,以为是有uaf漏洞,但是后面发现不是这样的,它每一条目分一个name和对应的description,name且dscription是用指针指示,并且每个条目固定是80字节的大小,因此可以把一个条目看成一个结构体
1234struct heap{ char name[0x7c]; char *description;};
所以,我把整个结构体free了之后就相当于把这个description的指针清零了,因此本题不存在uaf漏洞。再观察添加一个项目的函数,发现name是固定长度输入,且用了fgets函数限定输入0x7c字节,整个name那就是不可能溢出了,就 ...
ret2dl_resolve
有这么一个漏洞,他能在程序不提供任何输出函数的情况下执行system("/bin/sh"),没错,他就是ret2dl_resolve,这个我也认为是栈溢出的最后一关了,因此我现在就算是栈溢出毕业了吧hhhh。
elf文件我们自给自足,自己编译,为了一步一步演示,还是给了一个输出函数,但是我们不通过这个输出函数去泄露libc的地址。
1234567891011121314151617181920#include <unistd.h>#include <stdio.h>void vuln(){ char buf[100]; setbuf(stdin, buf); read(0, buf, 256);}int main(){ char buf[100] = "Welcome to the last stackoverflow"; setbuf(stdout, buf); puts(buf); vuln(); return 0;}$gcc ...
浙江2020省赛pwn1
据学长说,那一次的ctf出题人一句“我就没打算让pwn有解”让全场所有pwner直呼内行,pwn1看似简单实则在比赛过程中能出比赛也快结束了。
分析elf确定大概思路IDA打开分析elf文件
main()函数
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748int __cdecl main(int argc, const char **argv, const char **envp){ __int16 v4; // [rsp+0h] [rbp-40h] BYREF __int16 *v5; // [rsp+8h] [rbp-38h] __int16 v6; // [rsp+10h] [rbp-30h] BYREF char v7; // [rsp+12h] [rbp-2Eh] char v8; // [rsp+13h] [rbp-2Dh] int v9; // [rsp+14h] [rbp-2Ch] __int16 v10; // [ ...
SROP
今天开始以学习了花式的栈溢出ROP攻击,BROP这个东西朴实无华且用处不大,思想能了解,但是现在谁打个pwn还不给elf呢,不给libc文件都会被喷死,还敢不给elf?因此跳过这个学习一下SROP。
SROP主要攻击方式就是针对linux系统调用的一个弱点进行攻击的,在进行系统调用的时候,内核会发出signal挂起我们正在运行的程序,并且保存上下文(上下文即所有寄存器的值),然后这个上下文还是以一个结构体的形式存在于栈里面的。此时从用户态切换到内核态,说明现在在执行系统调用,执行完成系统调用的时候会进行系统调用的返回,这个返回又要调用15号的系统调用,恢复上下文并且切换到用户态。这样子系统调用的方法有一个弱点就是,如果我控制了栈,在它挂起的时候我偷偷修改rip=syscall,rax=59(execeve的系统调用号),rdi=”/bin/sh”,rsi=0,rdx=0。那么在结束系统调用的时候就会执行execeve(“/bin/sh”)打开一个shell。
在就是说在结束系统调用的时候会进行 ...
2021华东南赛区国赛线下赛
这两天来到了福州打awd的线下赛,这是我第一次打awd,收获很多。
先说一下大体的感想,awd真的比ctf好玩太多了,awd能真正体会到那么多网络安全爱好者相互网络攻击的那种乐趣。
首先入场开始比赛的时候真的是啥也不知道,不过好在有学长带队,啥也不会的我终于在第三轮的时候连上了自己的靶机hhh。学长是打web的,但是在场的web师傅都太厉害了,上的不死马不仅让我们队的靶机down机还不停地拿flag,甚至最后删库都阻止不了他们拿flag。
咱们第一天的web三题有一题不停地down机又被打,在下午,也是第24,25轮的时候有人ddos题目让所有人都down机了,主办方重启环境还恢复了配置,这可以说是让我们捡了一个漏,因为相当于是帮我们修好了环境,题目上线的时候果断删库,及时保住了一些分,与此同时通过查流量以及不停地测试也是把pwn题的payload给拿到了,因为整个pwn题的输入就是一个0x2000字节的read,查流量也不是很难。但是由于师傅们上午就pwn出了第一道,我也是在不停地堵pwn的漏洞,到最后给自己弄down机了,删库还是没用,依然被打,所以下午我打算不补pwn题让他们 ...
axb_2019_fmt32 wp
临近期末考试了,终于可以光明正大地水博客了。
最近刚写上格式化字符串的漏洞,这不,他来了。这个题目我做过之后感觉难度还是有的,做出这一题至少对格式化字符串漏洞的利用是有一个较深的理解了的。它综合考察了ret2libc和格式化字符串的任意写,以及对got表的理解。
axb_2019_fmt32下载文件,反汇编打开,再反编译main()函数得到如下代码
1234567891011121314151617181920212223242526272829int __cdecl __noreturn main(int argc, const char **argv, const char **envp){ char s[257]; // [esp+Fh] [ebp-239h] BYREF char format[300]; // [esp+110h] [ebp-138h] BYREF unsigned int v5; // [esp+23Ch] [ebp-Ch] v5 = __readgsdword(0x14u); setbuf(stdout, 0); setbuf(s ...
格式化字符串漏洞利用
格式化字符串漏洞是printf函数比较常见的漏洞,常见的漏洞形式就是printf(s);如果s字符是我们可控的话,那就会导致任意位置读和写等严重的后果。
首先如下代码段
123char s[100];gets(s);printf(s);
逻辑看上去十分简单,就是输入什么就输出什么。避免这类漏洞的方式也很简单,固定第一个参数就可以了,但是现在第一个参数我们可控的话就要介绍一些平时用不到的格式化字符串的标识符了。
%d %f %x %s这些烂大街的相信都不用讲也会,讲讲其它的标识符
%p:输出第n个参数的十六进制值,目前测试与%x不一样的地方就是输出会带0x,并且%后面带的整型参数表示第几个参数而非参数长度。
%n:将已打印字符串长度输入到下一个参数所表示的地址去,%后面带的整型参数表示要输出的第几个参数。
注:以上结论皆是在Ubuntu18.0.4环境下使用gcc编译器得到的
那么通过以上两个较生僻格式化的标识符就可以达到任意读和任意写了。
%p达到任意读的目的现在有以下测试程序
12345678910#include<stdio.h>int main(){ ...
cachelab实验报告:模拟cache的功能
lab从这里开始变得难了起来了,这次要模拟计算机里的一个硬件-cache的工作,关于cache,百度百科介绍的比我好,这边请———>
然后咱们就先拿到实验用的文件以及他的writeup,看完一会之后(long long after)就知道了此次实验的目的。然后文件也知道的一清二楚了。
csim.c:用来做part A的主要文件。
trans.c:用来做part B的主要文件。
Part Awriteup里面已经提到了,cache.h头文件里面有所需的函数并且要在csim.c里面完成cache的模拟过程,那么首先我们看看cache.h头文件提供了哪些东西
12345678910111213141516171819202122232425262728293031323334353637/* * cachelab.h - Prototypes for Cache Lab helper functions */#ifndef CACHELAB_TOOLS_H#define CACHELAB_TOOLS_H#define MAX_TRANS_FUNCS 100typedef stru ...
系统调用
today新的知识又增长了,发现了getshell的另一种方式:syscall和srop。故事还要源于…(此处省略万字输出)
(note:本作者这次有点懒,没有写AT&T汇编,而是一律用了intel汇编,请悉知)
可能是之前汇编基础不太好吧,竟没有发现syscall这么好用的指令,只要再把/bin/sh传参就能直接打开一个shell,真是妙蛙。但是在系统调用之前要做很多的事情,诸如各类参数传递,以64位的来说,我们要先知道我们要执行的函数系统调用号为59。我也是翻过libc库的,发现system函数实现里面有一段竟然是直接执行execve("/bin/sh")
实属意外了,这是在我有次反汇编libc库的时候发现的,我原来一直是只用system函数getshell的,没想到system内部是通过这样的系统调用来打开shell的。
那这得学啊,这是基础的基础啊。
这边给出一下64位Linux的各个系统调用号,这个在Linux的/usr/include/asm/unistd.h 下有,我这里截取部分。
123456789101112131415161718 ...