pwn
文章平均质量分 71
cccsl_
这个作者很懒,什么都没留下…
展开
-
[OGeek2019 Final]OVM——详细入门VM pwn
仔细分析代码都可以发现,这些操作都没有对数组的下标进行检查,这样会导致什么后果呢,举个例子,如果有一个重要数据B存在数组array[10]的内存前面,如果不对数组的下标进行检查的话,那么我就可以构造array[-1]并输出,就可以得到B的内容了。也就是说,我们给程序输入一串指令,这个程序会有自己独特的,对代码的理解,并进行像分解成机器码那样,执行,而像寄存器,栈空间,存储空间都是程序自己设计的,而不是系统分配的。这两个条件判断语句的目的是确保在进行内存释放操作之前,所提供的指针和大小都是有效的。原创 2023-08-06 21:43:46 · 878 阅读 · 0 评论 -
某大学信息安全竞赛——栈迁移加强版——只溢出0x8,无限ROP
之前我只做过溢出超过0x10这样的栈迁移,思路就是找机会去泄露栈空间的地址然后把栈迁移到我们可以控制的栈空间,亦或者迁移到堆空间,大概思路就是覆盖rbp为我们想要迁移到的地方,然后在溢出的位置填上leave ret。这样构造的话rsp就会越来越靠近rbp,但是我们能控制到的只有0x40的字节,也就是说,如果rsp距离rbp太近,我们将无法正常的去执行我们的ROP链了,那咋办?ok,这样rsp 和rbp都被我们迁移到栈上了,接下来就是快乐的ROP了,但是要经过一次又一次的调试,准确地构造ROP!原创 2023-05-17 22:56:27 · 883 阅读 · 3 评论 -
Use After Free (hacknote为例)
gcc hacknote.c -no-pie -o hacknote (自己编译下,关掉pie会更好)这题的思路无非就是利用了free掉堆块后,对应指向该堆块的指针没有置空,仍然指向这一块内存,因此我们仍然可以使用这个指针去做某些事情,例如在这里的print_note函数,我们仍然可以利用未置空的指针去输出对应的内容,这也是一个造成内存泄露的点。在这里是存在一个后门函数的,就是magic函数,刚好就是system("cat falg"),这也非常明显了,我们就是要通过某种途径,让程序执行这个后门函数。原创 2023-03-30 00:30:22 · 268 阅读 · 0 评论 -
栈迁移(以ciscn_2019_es_2为例,详细分析)
这里的stdin_addr其实指向的是我们刚刚写入的''/bin/sh” 的首地址,给system()函数提供参数,但是也许有人要问的是,那为什么不把’/bin/sh‘直接写在system函数的参数位?原创 2023-03-12 01:09:28 · 371 阅读 · 0 评论 -
非栈上的格式化字符串利用例题讲解
具体来说,就是用%n,把如图的0x7fffffffdda0所指向的0x7fffffffddb0改成0xfffffffdd98,这样的话,我们用%n作用在第八个参数就可以修改第七个参数所储存的内容了!%n 和 %s一样,都是类似于指针的东西,比如我对第7个参数进行%n ,那么实际上修改的并不是第七个参数里的数据,而是把第七个参数里存的数据当成。改got只能一次成型,因为如果分多次,导致printf的got表改变,就不会再执行pirntf函数了,因此需要一次性修改,否则将会失败。,然后修改指针指向的对应内容。原创 2023-03-06 18:21:26 · 693 阅读 · 0 评论 -
用gdb.attach()在gdb下断点但没停下的情况及解决办法
判断有可能在io=process('./')的时候就已经开始运行了,因此我们下断点要掌握时机,我们只能在输入型函数后下断点才有用,例如gets() scanf()这样,例如我们可以下断点在0x080492B0 这里,然后 continue 一下就可以啦。在python中,如果导入了pwntools,就可以使用里面的gdb.attach(io)的命令来下断点。但是这一次鼠鼠遇到了一个情况就是下了断点,但是仍然无法在断点处开始运行,奇奇怪怪。可以看到其实已经运行起来了,也就是根本没有断下来。原创 2023-03-05 23:02:48 · 2023 阅读 · 0 评论 -
格式化字符串之在栈上修改got表,执行system(“/bin/sh“)
举个例子, payload = fmtstr_payload(7 , {printf_got : system_addr}) 其中,7。原创 2023-03-05 00:19:10 · 709 阅读 · 1 评论 -
BUU [ZJCTF 2019]Login
这是一道让我感觉很淦的题,整一天了才大致了解了来龙去脉。原创 2023-03-04 21:03:19 · 837 阅读 · 0 评论 -
ROIS冬令营——format4
我们可以观察到0x7fffffffdec8这块地址指向的是返回地址的下一地址,我们可以泄露这个地址再减去0x8,就可以得到返回地址处的地址,在这里也就是0x7fffffffdda8。这里要说明的是返回地址的时候返回的是base+0x951,是0x951而不是0x950,应该是栈对齐的原因,如果用ROPgadget拿到ret的地址,在返回后门函数前加一个ret应该也能够解决问题。大致思路是修改返回地址为后门函数,也就是 把rbp的下一个地址(main+46)处修改为backdoor的地址。原创 2023-02-22 23:21:26 · 92 阅读 · 0 评论 -
ROIS冬令营——database_in
shellcode:"\x48\x31\xf6\x56\x48\xbf\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x57\x54\x5f\x6a\x3b\x58\x99\x0f\x05"(菜得要死,直接网上找,不要学我)拿到canary和rbp后,就可以通过栈溢出执行shellcode啦,但是我们注意到,由于shellcode太长,栈溢出太短,因此我们可以把shellcode放在栈中,在溢出的返回地址处写入返回到shellcode的地方。个人习惯先checksec再IDA。原创 2023-02-21 22:44:38 · 97 阅读 · 0 评论 -
ROIS冬令营——database
函数的意思是从标准输入中读入最多32个字节的数据,从标准输入读取一个字节,如果小于等于 0 则说明读取失败,返回 -1(0xFFFFFFFF).如果读取到换行符 ,将换行符替换为字符串0,则返回-1,就会停止。' 意思就是分两次执行,如输入 echo hello world && cat flag,它的意思就是执行system('echo hello world') system('cat flag')变量中的字符串作为参数,将它们合并成一个新的字符串,最后将结果存储到。原创 2023-02-20 22:48:11 · 70 阅读 · 0 评论 -
ROIS冬令营——typop
正是输出读入的buf变量,而且用的是%s输出,而%s的特点正是一直输出,直到遇到/x00/x00,而canary的值的特点正是最后两个字节为00,而又因为小端序,所以00对应的/x00/x00就被提到了最高位,会造成输出截断,因此我们可以选择输入11个b'a',刚好覆盖掉/x00/x00,这样就可以输出canary了,但是因为不遇到/x00/x00不会停止,所以也会把rbp的地址所指向的值也一并输出,不过问题不大。事实证明我们的 代码是正确的,那么得到了canary的地址,接下来就是libc的基地址了。原创 2023-02-20 13:23:07 · 80 阅读 · 0 评论 -
ROIS冬令营——format3(把bss段数据移至栈上)
漏洞是非常明显的,有格式化字符串漏洞,就是要改key的值为2023,但是发现key的值不在栈上,因此我们不能直接用输入%n来修改栈上的数据,而是要把key这个数据的地址放到栈中,然后进行修改。可以看到key变量在bss区,地址是0x60208c。那么我们的思路就是把bss段key的地址移至栈上,然后修改key的值。链接:https://pan.baidu.com/s/10SyKe0s9cyY6kiblH2fs8Q?先往第八个参数写入数据2023(因为我们将把key的地址放在第8个参数,rsp是第6个参数)原创 2023-02-19 19:23:55 · 65 阅读 · 0 评论 -
ROIS冬令营———canary
于是结合前面的vuln栈溢出漏洞,我们可以覆盖返回地址为win函数的地址,从而完成跳转到win函数,因为v3是在栈上,且读入了flag,那么我们的思路就是通过格式化字符串漏洞去泄露出flag。如果只是单纯根据IDA给的栈位置v3位置位于esp+0x1b的话,其实是错的,可以很明显看到esp实际上一直在变动,所以通过综合判断,应该开始于第是十个参数,那接下来就是泄露啦,过程有点繁琐,就是不停地给v2读入%k$p获得对应的字符串。不过很不走运,在IDA里,并没有找到/bin/sh字符串,这希望也破灭了。原创 2023-02-19 00:32:24 · 83 阅读 · 0 评论 -
pwn中send和sendline在攻击时的区别
于是在脚本加了个debug再继续调试,结果发现一个很淦的东西,尤其在栈溢出中确实是一个很需要注意的点 比如read(0, s, 0x18uLL),我只想让它读完0x18个数据后赶紧走人,于是我使用了io.sendline(b'a'*0x18) 于是就很淦了,它居然给我发了19个字节的数据。巧合的是,这个read下面还有一个read,导致这个sendline多加的\n就读进了第二个read触发了截断,导致第二个read只读了一个'\n'就跑了,导致攻击一直都失败。原创 2023-02-16 15:00:57 · 404 阅读 · 0 评论 -
pwn-100(L-CTF-2016)的个人想法(含DynELF的使用)
DynELF是一个用于动态获取库函数地址的类,可以在程序运行时获取库函数的地址,而不需要提前知道库函数的地址。在这段代码中,是创建一个DynELFleak是一个用于泄漏内存地址中的内容的函数;elf=elf是pwn100程序的ELF对象,用于获取程序中的一些基本信息(如函数地址、数据段地址、代码段地址等)。DynELF类会根据提供的泄漏函数leak中泄漏出来的puts函数地址和程序中的ELF信息,动态计算出libc库的基地址,然后可以使用d.lookup方法根据libc库中的函数名获取该函数的地址。原创 2023-02-15 17:09:00 · 289 阅读 · 1 评论