最近写pytoon的时候碰到了许多的坑。这里记录一下。

坑1

因为一些原因,我写了类似的代码

1
from random import *
import os
for i in range(20):
    pid = os.fork()
    if pid == 0:
        break
print “pid = ”,pid,randint(100,200)

阅读全文 »

XDCTF PWN500分,也是pwn的最后一题,和苏大神一起拿下了它。虽然说没有什么非常高深的pwn技巧,不过一环套一环的利用步骤还是值得学习与存档的。我就详细的介绍一下这题pwn500的利用思路。
PS:因为要带新手,所以大神可能认为废话较多,勿怪。文章最后贴出了二进制文件和idb文件。对照着读更容易理解。有空的话我也许还会将源代码逆向还原一下,更适合新手学习。(不要太期待,博主很懒)

首先我们还是要分析程序。这一次的代码相当之长,最坑的是还有2个结构体,逆向最怕遇到结构体了。再次感谢苏大神的idb,已经帮我标好结构体了。

源码审计,无论是汇编源码还是c源码,都是做pwn的基本功。这里我就不多说了。主要的操作有6种,2个show的操作看起来不会有什么问题,reg注册操作只有一次,也没什么漏洞。这里竟然还有个cheat的操作,不过也看不出什么漏洞。

果然最容易出问题的还是最复杂的exam和resit操作。值得一提,这个程序还是多线程的,fork一个子线程接受输入再写到文件里面,再由另外的主线程从新读回来。根据经验,这种费力不讨好的地方肯定有出题者留下的坑。所以反复的看了好几遍exam中的这段代码。

阅读全文 »

打了几天NSCTF,最后和队友@kuro一起把逆向1500分大题个拿了下来,最后混了个第6。
然后这篇writeup是苏大神(kuro)写的,授权转载Orz


1500分呢,其它题都是100 200最高也就500,一题高帅富还拿了fb(没有fb奖励就是):)

其实也不算难的栈溢出,虽然windows上的没怎么做过,但毕竟只是栈溢出,没有canarry(secure_cookie)代码正常写(gctf。。),难度破天也就那样。

题目要求能过windows的DEP+ASLR,在rop大行其道的今天过dep+aslr已经是pwn标配要求了吧,只要代码段间的相对偏移是固定的,gadget不会跳偏,想办法拿到ImageBase就行。

程序有加壳,aspack,似乎由于aslr的锅脱掉壳之后导入表还是坏的,貌似也不是导入表的问题,而是代码中引用的地址就是硬编码固定的,这里没有深究,反正能用IDA读到代码就行,毕竟exp打的是没脱壳的原版本。

阅读全文 »

打了2天的XDCTF,被Reverse的题目教做人了。Sad (T.T)
到是pwn的题目基本打通了,除了最简单的pwn100 (T.T)

pwn300和pwn400比较简单,所以writeup我就放在一起了。

阅读全文 »

最近在研究一些堆上面的漏洞。然后某一天骑自行车在路上跑的时候我突然悟出了Double Free的真谛。
2333好像太中二了一点,我是根据堆溢出的利用方法启发,再结合linux中libc的源码。研究出了double free的利用方法。虽然有关double free的利用技巧已经不是一个秘密。不过好像很少有相关的中文的介绍,所以以一个初学者的角度来讲解一下double free漏洞的利用方法。
如果有错误,希望大家批评指正。Orz

简介

Double Free其实就是同一个指针free两次。虽然一般把它叫做double free。其实只要是free一个指向堆内存的指针都有可能产生可以利用的漏洞
double free的原理其实和堆溢出的原理差不多,都是通过unlink这个双向链表删除的宏来利用的。只是double free需要由自己来伪造整个chunk并且欺骗操作系统。
这里是glibc中有关内存管理的源代码

内存管理介绍

有关内存管理的部分我放在另外的一篇博客上。

传送门

这篇文章首发于乌云知识库。现在我将它发到自己的博客上,我只在这2个地方发过此文章。
转载求写个出处Orz

阅读全文 »

说明

自己练习堆溢出的一点总结。目标程序的代码是自己写的,然后然后挂到自己的虚拟机上。然后自己写poc把它打下来拿到shell。因为是自己随便写的代码,所以漏洞不只是一点两点,有好几中方法打下来。当然,这次的练习中我只利用堆溢出这一个漏洞而不会使用use after free 或者是double free

阅读全文 »

简介

Dword shoot,一种很简单的漏洞溢出技巧,所以就简单的说明一下吧。dword shoot漏洞是出现在双向链表表删除的时候出现的一种漏洞类型。(双向链表是什么不用我解释吧)在进行双向链表的操作过程中如果因为处置不当,比如溢出等等的情况下,构成双向链表的指向前一个和后一个节点的两个指针被恶意的改写的话,就会在链表删除的时候发生的漏洞。

漏洞原理与利用

这里我们先定义一个结构体作为双向链表的节点

1
2
3
4
5
6
struct node
{
char data[32];
struct node *fd; //指向前一个节点
struct node *bk; //指向前一个节点
};
阅读全文 »

说明

首先,我不是研究linux内核的。所以这篇文章也不会过于深入的探讨linux中有关内存管理的行为。写这篇文章的目的只是为了介绍一下在堆溢出漏洞利用当中可能会涉及到的有关free的一些行为,以及一些相关的检查。

可以在这里看到libc中内存管理的源代码。
malloc.c
那么,我们开始吧

阅读全文 »

简介

这次来介绍一下堆溢出漏洞。不过这次的堆溢出漏洞比较复杂,不像栈溢出一样容易理解。所以这一次的内容会比较多。我尽量详细的介绍堆溢出漏洞,以及相关的知识。
首先,关于神马是堆溢出。简而言之就是在堆上产生的溢出。一般我们使用malloc等函数申请的内存都会储存在堆段上。并且由操作系统来管理已经使用和剩余内存,完成内存分配以及回收等等的操作。而堆溢出便是因为程序员的粗心大意,造成了读入的数据超过了malloc申请的内存大小而产生的漏洞。

前提知识

要了解堆溢出到底是如何造成危害的,就需要对linux下的内存管理有一定的了解。因为内存管理比较复杂,所以这里另开一坑对漏洞利用有关的部分进行浅析。如果是了解内存管理的大神可以跳过。
传送门

然后需要了解的是漏洞利用中一种技巧,Dword shoot的使用方法,这个也开一个坑另行介绍。同样如果是了解Dword shoot或者说是双向链表溢出利用的大神可以跳过
传送门

漏洞利用介绍

如果已经基本了解了linux操作系统中内存管理的方式,并且清楚Dword shoot的利用方法。那么接下来我们就要具体的介绍堆溢出漏洞的产生原因以及利用的方法了。
我们已经知道,内存中空闲的堆快会通过一个双向链表连接在一起。而我们能够篡改内存的机会便是在双向链表的节点在删除的时候因为溢出而产生的Dword shoot。而我们需要的便是构造堆内存,篡改指针,并且让系统进行链表的删除,也就是unlink的工作。

阅读全文 »

简介

在0day攻击当中有许多的技巧,这次介绍一种常用的攻击手段。ret to libc与栈溢出,堆溢出之类的漏洞利用技巧有所不同。ret to libc是一种在漏洞攻击中的常用的思路。目的是最大化利用所发现的漏洞,实现我们最终的目标get shell

首先,我们来认识一个c语言的库函数

int system(const char * string);

这个函数的的功能很简单,执行一条shell命令。而ret to libc目标很简单,就是用我们指定的参数执行这一函数。当然想要执行什么命令就要看具体情况了,最通用的就是执行/bin/sh命令,这样我们就可以远程打开一个终端。然后嘛(→_→)我就不知道了。

其实ret to libc还有一个老大哥,就是shellcode。不过随着计算机安全防护技术的发展,shellcode已经渐渐的失去了用武之地。

阅读全文 »