read 함수 주소 구하는 방법에 대해 질문 드립니다
함께실습 강의에서 read 함수 주소를 읽기 위해 write 함수를 호출한 방법은 이해했습니다.
저는 처음에 pwntools의 ELF.read 함수를 통해 특정 주소에 저장된 값을 읽어 오는 방법을 시도해보았는데, 이 방법이 실패하는 이유는 무엇인가요?
예시로 아래와 같은 코드를 작성하면 read 함수가 호출된 이후에 GOT 주소에 저장된 값을 출력하는데도 read 함수의 실제 주소가 안 나오고 처음에 GOT 영역에 저장되어있던 임의의 주소(0x4005f6)가 출력됩니다.
요약하자면 ELF.read 함수를 통해 GOT 주소에 저장된 함수 주소를 읽을 수 없는 이유가 궁금합니다.
from pwn import *
p = process('./rop')
e = ELF('./rop')
# canary leak
buf = b'A'*39
p.sendafter(b'Buf: ', buf)
p.recvuntil(buf)
canary = b'\x00'+p.recv(7)
p.recvuntil(b'Buf: ')
addr = hex(u64(e.read((e.got['read']), 8)))
print(addr)
#pwnable
작성자 정보
답변
2
wyv3rn
무플 방지 위원회장
lazy binding에 대해서 검색해보시면 좋을 것 같습니다.
요약하자면 예를 들어 read 함수를 호출하는 코드가 바이너리에 있다면 바이너리는 read 함수를 직접적으로 콜하는게 아니라 libc 파일 내에서 검색해서 사용합니다.
즉 바이너리 내에서는 실제 주소가 아니라 libc에서 해당 함수를 검색할 수 있는 인자 값만 가지고 있는 셈인거죠.
더 자세한건 검색찬스를. 그래도 이해안되시면 디스코드나 다시 댓글 주시기 바랍니다 ㅎ
wyv3rn
무플 방지 위원회장
pwntools에서 ELF 함수로 불러온 바이너리는 말 그대로 바이너리 정보를 불러온거지 지금 실행되고 있는 페이로드와는 무관합니다. 그러므로 libc내의 주소를 가질 수 없습니다.