babystack & babyre & rrrop

babystack

这题的名字叫babystack,程序中是一个直接的栈溢出。而且还自带一次任意地址读。
当然这题的难点也很简单,只有read,write,open,exit系统调用。之所以搞出这个题目是受defcon的mute那题的启发。mute那题是用shellcode来实现的侧信道攻击。所以我就想能否用rop来实现侧信道的攻击。

下面是我在libc里找到的一个可以用来侧信道攻击的ROP

    .text:00000000000D72CE                 cmp     cl, [rsi]
    .text:00000000000D72D0                 jz      short loc_D7266
    .text:00000000000D72D2                 pop     rbx
    .text:00000000000D72D3                 retn

在ret之后用一个read函数来block住代码。而比较成功之后则直接crash退出。使用这种方法来逐字节的比较flag。
当然,解法不止这一种。libc里还有很多种的rop可以用来进行侧信道攻击。可以看看选手们的解法.

poc见github

babyre

这个题目的难度其实处在第三层和第四层之间。当初把它放第四层其实有点犹豫,因为感觉会有老司机秒杀他。

这个题目说起来其实很简答,我写了一个蒙哥马利乘算法和一个大整数加减的库。熟悉密码学的大佬应该知道蒙哥马利乘运算的作用就是进行快速模幂运算,即RSA的核心算法。
有关蒙哥马利算法的文章网上其实有很多,我就不再赘述了。代码中只有e和n。将输入的flag转换成大数的形式,然后做en = pow(f,e,n)输出了大数en。这里用了一个非常大的e,使得可以用Wiener’s attack来计算出d的值。然后用d即可解密出flag。

之所以认为他简单,是因为即使不知道蒙哥马利乘运算也能够猜出是RSA。首先是因为大整数加减以及乘运算,这些大整数运算还是很容易就可以分辨的。一旦分辨出这些运算,应该就能联想到RSA。第二个就是模幂运算化简式子。对于一个D=C**E%N的大数运算,可以采用下面的化简式子。

    D=1
    FOR i=n TO 0
        D=D*D % N
        IF E[i]=1 
            D=D*C % N
    RETURN D

能看出这个式子是模幂运算的化简式子,即使看不懂乘法函数是个什么鬼。应该也能猜到什么了。

rrrop

之所以写这个题目,只有一次在写实际栈溢出利用的时候碰到了这个情况。栈溢出是在链接库中,没有打开的可以leak用的文件描述符。而主程序就只有这么一点点代码。当时自己写rop的时候感觉挺有意思的,就拿出来写了这样一个题目(主程序是我直接patch当初那个程序来的,没有源码。可以猜猜是什么程序:)

当然launch.so就是我自己写的程序了。里面大致模拟了ipv4包解析的过程。当然也是一个直接的栈溢出。在最后合并包的时候并没有检查长度而是使用了一个固定长度的栈缓冲区。

当然虽然binary比较小,其实还是有挺多可以用的gadget的。这里还有一个很好玩的技巧,就是dlsym的handle可以指定为RTLD_DEFAULT和RTLD_NEXT来从已经加载的动态链接库中查找函数。所以无需指定handle的值可以可以调用libc中的函数的。

本文章首发在 网安wangan.com 网站上。

上一篇 下一篇
讨论数量: 0
只看当前版本


暂无话题~