포스트

[Dreamhack] oob

[Dreamhack] oob

문제 링크

https://dreamhack.io/wargame/challenges/1415

문제 설명

out of bound!

문제 분석

  • 1번 메뉴는 bss 영역의 oob 배열로부터 인덱스 기반으로 1바이트씩 값을 읽을 수 있고, 2번 메뉴는 인덱스 기반으로 8바이트씩 값을 쓸 수 있다.
    • 인덱스 검사가 전혀 없으므로, 음수 인덱스나 큰 인덱스를 입력하여 out-of-bound read/write가 가능하다.
    • data 영역에서 바이너리 영역 주소와 libc 영역 주소(_IO_stdout_2_1_)를 얻을 수 있다.
  • 서버 환경이 Ubuntu-22.04이므로, libc의 got에 쓰기 권한이 있다. (Partial RELRO)
    • strlen 함수의 got를 oneshot gadget의 주소로 덮어써봤지만 조건이 까다로워 성공하지 못했다.
    • libc의 주소를 알아냈으니, environ 변수의 값을 읽어 스택의 주소를 얻고, 이를 이용하여 main 함수의 반환 주소를 ROP payload로 덮어써 셸을 획득하였다.

새롭게 알게된 점

  • libc의 environ 변수
    • glibc의 전역 변수로, 현재 실행 중인 프로세스의 환경 변수 목록을 가리키는 포인터.
    • 이를 이용하여 스택 주소를 leak할 수 있다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.