lctf2016_pwn200 writeup
buu刷题记录-lctf2016_pwn200
静态分析
checksec
64位保护全关,并且栈可读可写可执行,那么主要思路应该是执行shellcode了。main函数一个IO初始化和一个函数,进去发现有一个name输入,是用for
-
read(1)实现的,但是观察缓冲区和循环大小,发现缓冲区大小与循环次数相同,意味着如果我输入填满缓冲区,一会输出名字的时候可以泄露栈地址。sub_4007DF这个函数就是输入一个3位数值返回int。继续往下看发现它又有一个与缓冲区大小相等的一次输入,并且可以覆盖到char
*dest这个指针变量,一会会将整个缓冲区以字符串形式拷贝到那个指针内的地址中。那么如果我们将ptr修改那基本是任意地址写了,加上之前泄露的站地址便可以在上面执行shellcode,但是同时也有限制,那就是这是一个字符串拷贝,如果需要在返回的时候执行shellcode那么需要填上shellcode后先放上一个jmp
rsp的地址。而64位程序地址虽占8个字节但是实际高两个字节一般都是空的,后面的shellcode很可能无法拷贝。我还尝试过栈迁移,但是栈迁移需要改 ...
2021江西省赛RSA题解
来源于一位师傅发的RSA的题目,这题正解是套公式,但是其实可以直接分解n。
题来康康别的师傅发给我的江西省赛的cry题,发现自己还是能很好的运用一些小技巧的,正解虽然不用分解n,但是咱还是可以分解n的hhh
题目分析
1234n=27552304606229034903366058815849954030287648695063385362955432137790872571412035824128918674719247737295565001575991597519270789776408208970323808016733976338433371328100880898942106515627607388226912870981180215883273805491209461671730377099185278711453949265641966582563910708529619185885928310168288810488784242368160743359666583499117949407921812317700250240067929572558785431 ...
2020浙江省赛 pwn2 writeup
国庆复的盘,今天补一下
静态分析
checksec保护全开。
经典菜单题,没有去符号表,查看menu函数发现只有添加和删除操作,但是可以发现删除操作是通过函数指针实现的。并且分little
和 big的区别,free little就是一个free,free big
就是要把那个堆块里面的内容指向的堆块free了还要把本身给free,但是指针并没有清零。造成了UAF漏洞,并且在add的时候根据字符串长度来分配大小,并且会先读栈上,然后在strcpy拷贝,这就意味着输入不能存在\0。并且你输入的size只跟你输入大小有关,它拷贝分配的大小还是用strlen算出来长度再malloc然后strcpy,这一波操作下来就没办法溢出操作,并且由于\0截断也限制了很多。开了PIE无法unlink,和用got表泄露libc,而泄露程序基址也是比较难的(虽然正解是泄露程序基址的awa)。
泄露libc
考虑劫持函数指针,直接覆盖部分来修改函数,发现freebig和freelittle函数指针都在堆上面,由于只有最后三位相同,而我们覆盖是以字节为单位的,在调试可以选择先关了ASLR,让它在 ...
gyctf_2020_document write up
今天来康康这道题gyctf_2020_document
静态分析确定漏洞类型
经典的堆菜单题,保护全开,2.23的libc。保护全开意味着got表劫持不了。增删改查四样动作都有,并且没有那种虚晃一枪(例如show函数直接给你puts一个too
young too simple之类的)的函数。
先看add函数,malloc了两个堆块,都是固定大小,一个堆块是0x20大小,另一个是0x90大小。然后第二个堆块的指针存在了第一个堆块上面。第一个堆块后八个字节用来存了性别,性别要么1要么16,是通过判断你输入的是否为W来决定的。之后就是那个0x90的大堆块上面存一个名字,中间间隔一个flag,然后堆块偏移0x10的位置上面放上你要输入的内容。
看看delete函数,存在明显 的UAF漏洞,可以操作free的堆块。并且只free
0x90的堆块而0x20的堆块不会free。那么通过这些分析我们就可以先add两个堆块,free掉第一个之后show第一个就能泄露出libc的地址。
其它的中规中矩,唯独edit函数正常情况下它每个堆块只允许edit一次,但也只是因为那个0x20堆块的 ...
2021浙江省预赛
作者因为之前电脑丢了导致中间两个月断更,最近会把之前的很多都补回来。言归正传,这次比赛总体来说不太理想,没有达到预期。
比赛情况总结
我,学姐,学长分别出一题,最终得分350,排名在42。而我是出了一道密码题,pwn题没出,因为pwn题一道shellcode题当时分析没有考虑\0截断的这个特性,以为所有shellcode都要满足这个特性,觉得手撕汇编撕不过,就放弃了,没想到竟是一个\0绕过,这波,属实大意了闪了。
部分题目writeup
Crypto-Easy Railfence
观察加密方式,发现这个加密只进行了位置对换,并且开头特意提醒flag的形式为
flag{} ,那么先根据 已有长度写出参数
1m='flag{_________________________________________________________}'
现在Rail和offset不确定,但是
flag的格式确定,因此对参数进行爆破,然后观察发现l和g还有{}在整个
给的加密结果中只有一个并且位置已经确定,那么根据这个特性写出如下脚本。
...
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题 ...