0x01 寻找漏洞
1 | xfgg@ubuntu:~/Documents$ file level1.80eacdcd51aca92af7749d96efad7fb5 |
0x02 思路分析
1 | 一开始以为是write函数无libc泄露 |
exp
1 | from pwn import * |
1 | xfgg@ubuntu:~/Documents$ file level1.80eacdcd51aca92af7749d96efad7fb5 |
1 | 一开始以为是write函数无libc泄露 |
1 | from pwn import * |
1 | xfgg@ubuntu:~/Downloads$ file guestbook.d3d5869bd6fb04dd35b29c67426c0f05 |
1 | 查看main函数的栈 |
1 | 学习使用zio库 |
持续更新的文章 因为一时半会总结不出来 用到多少写多少吧
1 | 这里用rop做例子 |
1 | root@ubuntu:/home/xfgg/Downloads# gdb rop |
1 |
原文:http://bobao.360.cn/learning/detail/3298.html
1 | 在没有目标系统libc文件的情况下,我们可以使用pwntools的DynELF模块来泄漏地址信息,从而获取到shell。本文针对linux下的puts和write,分别给出了实现DynELF关键函数leak的方法,并通过3道CTF题目介绍了这些方法的具体应用情况。 |
1 | DynELF是pwntools中专门用来应对无libc情况的漏洞利用模块,其基本代码框架如下。 |
1 | 不管有没有libc文件,要想获得目标系统的system函数地址,首先都要求目标二进制程序中存在一个能够泄漏目标系统内存中libc空间内信息的漏洞。同时,由于我们是在对方内存中不断搜索地址信息,故我们需要这样的信息泄露漏洞能够被反复调用。以下是大致归纳的主要使用条件: |
1 | write函数原型是write(fd, addr, len),即将addr作为起始地址,读取len字节的数据到文件流fd(0表示标准输入流stdin、1表示标准输出流stdout)。write函数的优点是可以读取任意长度的内存信息,即它的打印长度只受len参数控制,缺点是需要传递3个参数,特别是在x64环境下,可能会带来一些困扰。 |
1 | puts的原型是puts(addr),即将addr作为起始地址输出字符串,直到遇到“\x00”字符为止。也就是说,puts函数输出的数据长度是不受控的,只要我们输出的信息中包含\x00截断符,输出就会终止,且会自动将“\n”追加到输出字符串的末尾,这是puts函数的缺点,而优点就是需要的参数少,只有1个,无论在x32还是x64环境下,都容易调用。 |
1 | puts输出完后还有其他输出,在这种情况下的leak函数可以这么写。 |
1 | 在信息泄露过程中,由于循环制造溢出,故可能会导致栈结构发生不可预料的变化,可以尝试调用目标二进制程序的_start函数来重新开始程序以恢复栈 |
1 | xfgg@ubuntu:~/Downloads$ checksec stack2 |
1 | 限制了 输入的数量是99 |
1 | 这里就是bug了 因为我们没有检查v13数组的边界 这里我们可以随意输入 然后劫持程序eip |
1 | 然后去栈会发现,这个操作可以用gdb一步步ni下去 |
1 | 这里其实应该能够注意得到 栈是小段模式 那么我们输入的时候 可以是 反着来 比如地址是 12345678 先输入78 45 34 12 |
1 | 但是感觉这里/bin/bash 有点怪怪的啊~~~ |
1 | #!/usr/bin/python |
1 | 由于题目的问题所以需要我们自己写入sh |
1 | 数组下标超界问题 |
###exp
1 | #!/usr/bin/python |
原文链接:https://blog.csdn.net/zszcr/article/details/79659071
1 | pwn题的无libc泄露用到的pwntools的DynELF模块 |
1 | XDCTF2015-pwn200 |
1 | 检查了下防护机制 发现开启了堆栈不可执行 所以不可以在栈上插入shellcode |
1 | 可以发现write函数在plt和got都存在,同时还有read函数 |
1 | from pwn import * |
1 | ida分析 |
1 | 首先计算padding |
1 | system地址 |
1 | /bin/sh地址 |
1 | main函数地址 |
1 | 先泄露write函数真实地址,构造rop链为: |
1 | from pwn import * |
原文链接:https://www.anquanke.com/post/id/171283
1 | 用pwnable.tw里面的secret_of_my_heart作为例题 |
1 | 该程序有三个功能 |
1 | 分别是add、delete和show功能。 |
1 | 这里的mmap出的内存里面主要作用是用来存放一个个secret结构体 |
1 | 下面看一下add函数 |
1 | 漏洞点在add函数中的input_str函数中 |
1 | 红框中的代码有泄露漏洞,可以泄露堆的地址 |
1 | 再看一下delete函数中的内容: |
1 | 1、可以通过unsortedbin attack写入到free_hook上方,然后利用fastbin attack写入system的地址,从而拿到shell; |
1 | 第一种思路的实现 |
1 | 这是exp中的各个函数 |
1 | 然后进行chunk overlap |
1 | 可以看到,这里已经实现了我们的目的。 |
1 | 我们已经将0-4号合并的chunk放到了unsortedbin中,但1号chunk实际上并没有被我们free过,所以我们把在unsortedbin中的0号chunk申请掉,malloc就会切割chunk,并将unsortedbin的地址放到1号chunk里面,这时候我们去show1号chunk就可以得到unsortedbin地址了。 |
1 | 这样我们就可以通过去unsortedbin中取得内存,来控制0x562b0fa38200中的内容了. |
1 | 首先new一个0xE8大小的内存。 |
1 | 然后通过new一块0x70+0x70大小的chunk,控制0x562b0fa38200中的prev_size为0,size为0x71,fd为attack_heap,也就是0x562b0fa382c0 |
1 | 看一下0x562b0fa382c0中的情况 |
1 | 为什么0x562b0fa382c0中为什么回事这样呢,还记得前面吗? |
1 | 这里我们对0x562b0fa382c0写入了p64(0x0)+p64(0x71)+p64(attack_heap)。 |
还有四种方法自行原文学习 ,学一种我就快die了
1 | from pwn import * |