내가 받은 바이트가 내가 보낸 바이트가 아닌 이유는 무엇입니까?

내가 받은 바이트가 내가 보낸 바이트가 아닌 이유는 무엇입니까?

나는 내가 하고 있는 일을 자동화하기 위해 Safe Gaming 웹사이트를 통해 작업해 왔습니다.균열 도구. 그런데 그 과정에서 문제가 생겼습니다. 익스플로잇 문자열을 사용하여 서버에서 취약한 프로그램을 실행하려고 하면 내 컴퓨터의 Python 2.7 스크립트 사이 어딘가에서 변경되어 나에게 다시 돌아옵니다.

이 특정 과제에 접근하는 일반적인 프로세스는 다음과 같습니다.

  1. SSH 연결 시작
  2. SSH 연결을 통해 쉘을 열고 "/bin/bash", "/bin/sh"를 시도했습니다.
  3. 메시지를 받을 때까지 기다려 주세요.
  4. "%s %s" %(program_on_server, payload_string) 형식으로 명령을 보냅니다.

내 페이로드 문자열은 여러 번 반복되는 "\x74\x84\x04\x08" 바이트입니다. 내가 겪고 있는 문제는 서버가 실행 중인 셸에 보낸 내용을 에코하면 "\x74\x84\x07\x08\x1b\x5b\x4b"로 변환된다는 것입니다. 문제를 해결한 후에도 추가 바이트가 어디서 나오는지, \x04가 \x07이 되는 이유를 알 수 없습니다. Pwntools는 올바른 바이트를 보내고 있다고 생각하는 것 같고 디버그 출력에는 최소한 올바른 바이트가 표시되므로 문제는 ssh에서 bash, 취약한 프로그램에 이르는 체인의 서버 측 어딘가에 있다고 생각합니다. 따라서 pwntools와 더 관련된 곳이 아닌 여기에 게시하십시오. 이 문제의 원인과 원인을 아는 사람이 있습니까?

아래는 로그인 정보가 있는 함수를 포함하는 코드입니다.

#!/usr/bin/python2
from pwn import *

context.log_level = 'debug'

def makePayloadString():
    return p32(0x8048474)* 20 # p32 takes a 32 bit number and converts it to bytes

sshConnection = ssh(user=getUser(), host=getHost(), password=getPassword())
command = "%s %s" % (getProgramLocation(), makePayloadString())
shell = sshConnection.shell("/bin/bash")
shell.recvuntil("$ ", timeout=10)
shell.sendline(command)
shell.recvline(timeout=10)

답변1

서버 측에서 반환하는 바이트는 셸에서 나오는 것으로 보이며 마치 터미널 세션에 입력된 것처럼 입력 바이트에 반응합니다.

0x84가 7비트가 아닌 ASCII 코드로 해석되는지는 확실하지 않지만 0x04는 Ctrl-D(EOF) 문자와 동일하며 줄 시작 부분에 입력하지 않으면 bash는 이를 거부합니다. Bash는 종소리(경고음)를 울리기 위해 0x07(BEL) 문자를 터미널에 보냅니다. 0x08은 백스페이스(BS) 문자이고 bash는 입력 커서를 한 칸 뒤로 이동시키는 ANSI 이스케이프 시퀀스(ESC[K)(\x1b\x5b\x4b)를 에코합니다.

대화형 터미널에서 "t" 문자를 입력해 보면 보이는 프로그래밍 출력의 대략적인 모습을 재현할 수 있을 것입니다.

어쩌면 이 바이트를 bash나 sh 대신 다른 프로그램의 입력으로 보내야 할까요?

관련 정보