搜索此博客

2017年10月28日星期六

【安全科普】CTF之RSA加密算法

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
【安全科普】CTF之RSA加密算法  阅读原文»

2017-10-28 10:37:33 阅读:3563次 收藏 来源: 安全客 作者:神月资讯

http://pic1.hackdig.com/pp/c3eab2e98ed566d0e41940afa978dad6abcf3c762c902a2030a0dfbd56c5b864faa7aa14a8e3444107fb08c65c2f2a8b.jpg


0x01   摘要


每次碰到RSA题都是一脸蒙逼,这次专门来撸一撸RSA加密算法。


0x02   前言


CTF里考RSA算法是比较常见的。可惜每次碰到都一脸蒙逼,最心酸的是Writeup就摆在那里,不离不弃,而我的智商摆在那里,不高不低。


0x03   理解RSA


最重要一步,当然是理解RSA算法,理解了,就什么都不难了。

http://pic1.hackdig.com/pp/d2bd8ab8780efecdb70a25b22e968cee3cf9f9a5736af3410b72aa398958c001cf89da4c3e3d4fff9951aac9dfd49868.jpg

1977年,三位数学家Rivest、Shamir 和 Adleman 设计了一种算法,可以实现非对称加密。这种算法用他们三个人的名字命名,叫做RSA算法。从那时直到现在,RSA算法一直是最广为使用的"非对称加密算法"。毫不夸张地说,只要有计算机网络的地方,就有RSA算法。

这种算法非常可靠,密钥越长,它就越难破解。根据已经披露的文献,目前被破解的最长RSA密钥是768个二进制位。也就是说,长度超过768位的密钥,还无法破解(至少没人公开宣布)。因此可以认为,1024位的RSA密钥基本安全,2048位的密钥极其安全。

举例子的时候一般出现的人物都是Bob和Alice。

比如有两个用户Alice和Bob,Alice想把一段明文通过双钥加密的技术发送给Bob,Bob有一对公钥和私钥,那么加密解密的过程如下:

Bob将他的公开密钥传送给Alice。

Alice用Bob的公开密钥加密她的消息,然后传送给Bob。

Bob用他的私人密钥解密Alice的消息。

上面的过程可以用下图表示,Bob先生成公钥和私钥,Alice使用Bob的公钥进行加密,Bob用自己的私钥进行解密。

http://pic1.hackdig.com/pp/d2bd8ab8780efecdb70a25b22e968cee1e7a8369ac5b976e03d98dbabbb850721f5c4ee2deba42d8f1852b0d7e928b20.jpg

总结:

公钥和私钥是成对的,它们互相解密。

公钥加密,私钥解密。

私钥数字签名,公钥验证。

0x03.1.1  数学概念

要看算法了,还是先温习一下基本的概念吧,哈哈,忘的人可以看看,大神可以跳过。

0x03.1.1.1       互质关系

如果两个正整数,除了1以外,没有其他公因子,我们就称这两个数是互质关系(coprime)。比如,15和32没有公因子,所以它们是互质关系。这说明,不是质数也可以构成互质关系。

关于互质关系,不难得到以下结论:

1.任意两个质数构成互质关系,比如13和61。

2.一个数是质数,另一个数只要不是前者的倍数,两者就构成互质关系,比如3和10。

3.如果两个数之中,较大的那个数是质数,则两者构成互质关系,比如97和57。

4.1和任意一个自然数是都是互质关系,比如1和99。

5.p是大于1的整数,则p和p-1构成互质关系,比如57和56。

6.p是大于1的奇数,则p和p-2构成互质关系,比如17和15。

Dance In Heap(三):一些堆利用的方法(中)  阅读原文»

*本文原创作者:hellowuzekai,属于FreeBuf原创奖励计划,禁止转载

0×00 前面的话

在前一篇堆的利用方法里面,我们简单的提了一下UAF,并主要对从 bin 中释放 chunk 的操作,即 unlink 宏、unsortedbin attack,进行了利用。那么在本篇中,我们主要讨论如何将对一个对一个chunk进行复用来进行某种攻击。

在这里面我们要当心,chunk size的计算是个需要小心的地方,因为这里包括了 prev_size的复用,以及根据不同系统考虑的对齐情况,还有 chunk 的size位表示的是包括chunk header在内的size,而实际可用的size与此不同,它是减去chunk header后的大小。

本篇文章目录

0x01 fastbin attack  0x02 overlapping chunk 1  0x03 overlapping chunk 2  0x04 小结  

0×01 fastbin attack

还记不记得我们在第一篇中那个介绍 fastbin 中 dobule free的例子

#include <stdio.h>  #include <stdlib.h>  int main() {      char *a=malloc(24);      char *b=malloc(24);      free(a);      free(b);      free(a);  }  

这个运行是没有问题的,但是想象一下,这样做之后,现在的 fastbin 中是什么样子

  -------     -------     -------     -------    -------   | 头结点 |-> |   a   |-> |   b   |-> |   a   |->|  null |    -------     -------     -------     -------    -------  

其中的指向关系由chunk的 fd 指针标识。此时我们再从 fastbin中 malloc 出一个 chunk

c = malloc(24);  

此时的 fastbin

  -------     -------     -------     -------   | 头结点 |-> |   b   |-> |   a   |-> |  null |    -------     -------     -------     -------  

现在我们得到了一个chunk,并且这个 chunk 同时在 fastbin中也存在,那么此时如果我们修改 c 的 fd 指针位置为任意地址,那么 fastbin 中 a 的指向也会发生改变

  -------     -------     -------     -------   | 头结点 |-> |   b   |-> |   a   |-> |任意地址|    -------     -------     -------     -------  

我们之后连续 malloc 两次

malloc(24);  malloc(24);  

现在的 fastbin

  -------     -------   | 头结点 |-> |任意地址|    -------     -------  

那我们再次 malloc 时,就可以在任意地址创建一个 chunk 了,但是要注意的是,我们在之前提到过,从 fastbin 中取出 chunk 的时候会对 chunk 的size 做检查,也就是这个任意位置的 chunk 的 size 位必须构造。我们可以在栈中构造

int stack = 0x30 // 24 + header = 0x28 ,0x10 对齐后 0x30  

这个变量作为size位,我们可以将任意地址填充为 &stack – 8,然后 malloc 之后会返回这个地址的 chunk,在栈中变量无法溢出时,我们可以向 chunk 里面写入数据来造成栈溢出。

d = malloc(24);  d[20] = 0xdeadbeef //控制rip  

fastbin attack 中令人兴奋的一点是,它不需要对 chunk 进行溢出就可以进行攻击,这在一些对输入长度检查严格的地方可以得到奇妙的应用。

0×02 overlapping chunk 1

幸运的是,并不是所有的程序都会对输入长度有严格的约束,当我们能够溢出到下一个 chunk 时,我们可以修改它的 size 位来造成 chunk 的覆盖。

首先,我们创建三个chunk,考虑 prev_size 的复用和 0×10字节对齐,我们将 malloc(0×100-8), 系统会给我们(0×100-8)+0×10-0×8,即0×100(0×10对齐)的空间,实际可用的空间正好是0×100-8,并没有多分配,而要是malloc(0×100)的话,你会看到实际可用的空间是0×108(这个不是必须的,只是向大家强调一下 chunk 大小的计算)

a = malloc(0x100-8);  b = malloc(0x100-8);  c = malloc(0x100-8);  

然后 free 掉 b,b就会放到 unsortedbin 中 ,这个bin只有一个链表,并不对size进行区分,所以我们可以放入0×100的chunk,修改为size为0×180后就可以拿出0×180的chunk

free(b);  

然后我们利用a溢出到b的size位

*(a+0xf8) = 0x181 // 0x01标识a为inuse状态  

现在我们malloc一个0×180的 chunk,系统就会将从b开始的0×180大小的空间返还,这其中包括c

d = malloc(0x180-8);  

ok,现在我们就可以更改利用d更改c中的内容,如果c中包含某个函数指针,我们也可以去改变它,当然

0×03 overlapping chunk 2

我们在前面先释放再修改size来获得了一个覆盖掉后面chunk 的 chunk,那么如果我们先修改size为一个大值,然后free会怎样呢?

首先我们创建4个chunk

a = malloc(0x100-8);  b = malloc(0x100-8);  c = malloc(0x100-8);  d = malloc(0x100-8);// 第四个为了防止被top chunk 合并,以及应对 free的检查  

我们通过a溢出到b的size

*(a+0xf8) = 0x201 // 0x1为inuse标识  

我们这里讲b的size扩大到了c,由于free时需要检查下一个chunk的size,所以我们预留了d,并且防止free后直接与top chunk合并,之后我们free掉b,然后再次malloc就又包括了c

free(p);  e = malloc(0x200-8);  

然后就可以可以像0×02一样去利用。

0×04 小结

除了这些之外,我们还可以根据不同的条件去构造不同的chunk复用,像是只利用一个字节溢出(off-by-one)来使chunk size减小,以此来构造的poison_null_byte 漏洞等等。了解chunk复用的原理,就是去改变 size 位来使系统对错误的长度进行 malloc、free,这就是我们的目的。

*本文原创作者:hellowuzekai,属于FreeBuf原创奖励计划,禁止转载


黑客技术官网地址:http://www.hackdig.com/

阅读更多内容

没有评论: