특정 버전의 libc로 링킹하는 방법에 대해 질문드립니다.

1. 질문 사항

특정 버전의 libc 파일이 주어졌을 때, (libc.so.6) 해당 버전을 특정해서 바이너리를 링킹할 수 있는지 궁금합니다.

1-2. 질문 배경

oneshot 워게임 풀이를 하던 도중, 다음과 같이 코드를 작성하여도

stdout = int(str(p.recvline()[2:-1])[2:-1], 16)
libc_base = stdout - libc.symbols['_IO_2_1_stdout_']
print("libc_base : ", hex(libc_base))
#중간 생략

계산한 libc_base의 하위 1.5byte가 0으로 떨어지지 않는 문제가 발생했습니다.
이 때, pwndbg로 print(hex(stdout))의 출력값에 대해, pwndbg로 x/gx 0x{출력값}을 시행한 결과 '_IO_2_1_stdout_'에 해당했으므로 stdout을 얻는것 까진 문제가 없습니다.

따라서 로컬 libc 심볼의 오프셋과 libc.so.6의 오프셋이 서로 다를 것이라고 유추했습니다. system 함수로 테스트한 결과 실제로 그런 것을 볼 수 있습니다. (사진의 libc_base의 하위 1.5byte는 삽질하면서 0으로 끼워맞췄습니다 오프셋 다른 것만 봐주세요..!)

이에 로컬에서 익스 코드를 디버깅해보고 싶어서 특정 버전 libc로 링킹하는 방법은 없는지 여쭙니다.

2. 시도해본 것

2-1. zig cc 컴파일러

how can i specify glibc version?

위 링크의 답변을 참고했을 때 zig cc 컴파일러가 유효한 해결 방법인듯 했습니다.

워게임에서 주어진 바이너리의 checksec 조건을 맞춰주고자, 기존 gcc 명령어에 대해 아래와 같이 셋팅했습니다.

gcc : gcc -o oneshot1 oneshot1.c -fno-stack-protector -fPIC -pie
zig : zig cc -target ./libc.so.6 oneshot.c -o oneshot_zig -fno-stack-protector -frwpi

그런데 아래와 같은 오류만 출력되었습니다.

error: unable to parse target query './libc.so.6': UnknownArchitecture
#pwnable #onegadget
작성자 정보
답변 1
avatar
Hamtori
대표 업적 없음

patchelf를 사용해보세요.

2024.05.27. 12:56
질문에 대한 답을 알고 계신가요?
지식을 나누고 포인트를 획득해보세요.
답변하고 포인트 받기