LEVEL 1

oneshot

pwnable
  • 문제 정보
  • 풀이 125
  • 난이도 투표 64
  • 질문 17
  • 최근 풀이자 1556
  • 댓글 55

문제 설명

Description

이 문제는 작동하고 있는 서비스(oneshot)의 바이너리와 소스코드가 주어집니다.
프로그램의 취약점을 찾고 셸을 획득한 후, "flag" 파일을 읽으세요.
"flag" 파일의 내용을 워게임 사이트에 인증하면 점수를 획득할 수 있습니다.
플래그의 형식은 DH{...} 입니다.

Environment
Ubuntu 16.04
Arch:     amd64-64-little
RELRO:    Partial RELRO
Stack:    No canary found
NX:       NX enabled
PIE:      PIE enabled
Reference

one-shot gadget

출제자 정보

avatar
Dreamhack
대표 업적 없음

First Blood!

KuroNeko
워게임 고인물
출제된 지 1일 만에 풀이 완료!

난이도 투표 64

질문 17

문제 풀이에 어려움이 있으신가요?
커뮤니티에서 문제에 대한 질문하고 답변 얻기
특정 버전의 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 `
avatar cityofwonder
제공된 libc.so.6에 debug simbol이 없어 gdb에서 print stdout을 사용할 수 없습니다
페이로드는 payload = "A"24 + p64(0)2 + p64(oneshot_gadget) 이렇게 작성했고 gdb로 attach 해서 리턴 주소에 값이 정확히 들어가는 것을 확인했는데 쉘이 실행되지 않았습니다 oneshot_gadget을 구하기 위해서 아래와 같이 식을 작성하였는데 libc_base = stdout - 0x3c5708 oneshot_gadget = libc_base + 0x45216 제가 생각하는 문제가 되는 부분은 libc_base를 구하는 부분입니다 처음에는 oneshot 파일을 그대로 gdb로 열고 print stdout을 해서 나온 주소에서, vmmap을 해서 나온 /usr/lib/x86_64-linux-gnu/libc-2.31.so의 base 주소(시작 주소)를 뺀 값인 0x1bf6a0를 stdout 값에서 빼줬으나 동작하지 않아 patchelf --replace-needed 명령어로 문제파일에서 주어진 so.6 파일로 변경 후 다시 gdb로 열었습니다 이렇게 하니까 vmmap 으로 봤을 때 변경된 so.6 파일이 열리는것을 확인했는데 문제는 제공된 libc.so.6 파일에 debug simbol이 없어 print stdout이 먹히지 않는다는 것이었습니다 https://typemiss.tistory.com/2 이 사이트를 참고해서 libc6-dbg 패키지를 다운받아 gdb 에서 set도 해보았고 readelf -s ./libc6.so.6 | grep stdout에서 나온 stdout의 오프셋 값도 사용해보았으나 여전히 해결되지 않았습니다 원리는 다 이해한거 같은데 몇 시간째 문제가 해결되지 않아 답답하네요.. 조언 부탁드립니다 (해결) 주어진 libc에서 필요한 데이터를 다 추출해서 풀었습니다 libc 바꿀 필요도 없고 로컬에서 되는거 확인해보지 않아도 되네요
avatar T@ke_it_EZ

최근 풀이자 1556

Turt1e94
대표 업적 없음
Ehwon
대표 업적 없음
닉네미
대표 업적 없음
peregr1nus
대표 업적 없음
위니아정수기
대표 업적 없음
kuku_727
대표 업적 없음
Yabttuck
대표 업적 없음
avatar
d3vh4cks
대표 업적 없음
neworld
대표 업적 없음
어렵다
대표 업적 없음

댓글 55

위유
강의 수강: 50
stdout을 너무 단순하게 생각했다.
avatar
스카이넷
워게임 고인물
ez
catpwn
대표 업적 없음
oneshot 지렸다
avatar
KnightChaser
공부벌레
One Gadget = Artistic
avatar
Rosieblue
워게임 고인물
원가젯 사랑해!
avatar
연어초밥
공부벌레
onegadget 짱짱맨
avatar
skandia
대표 업적 없음
oneshot
avatar
LinuxBudu
플래툰
원샷은 사용만 가능한 조건이라면 아주 사기군요..!
avatar
msh1307
대표 업적 없음
쉽다
avatar
movptr
공부벌레
ez