<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    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
    只看當前版本


    暫無話題~
    亚洲 欧美 自拍 唯美 另类