포스트

[Dreamhack] Bunker Rush

[Dreamhack] Bunker Rush

문제 링크

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

문제 설명

드림핵 회원 수가 22,222명을 달성했어요!!
드림이는 기념으로 2의 상징을 공부해보기로 했어요.
그게 바로 벙커링이래요!! 아 그게 아니라 버퍼링… 이라구요?

1
2
3
4
5
Arch:     amd64-64-little
RELRO:    Full RELRO
Stack:    Canary found
NX:       NX enabled
PIE:      PIE enabled

문제환경은 ubuntu:20.04 (ubuntu@sha256:8ae9bafbb64f63a50caab98fd3a5e37b3eb837a3e0780b78e5218e63193961f9) 입니다.

문제 분석

  • setvbuf 함수의 원형은 다음과 같다.
    1
    
    int setvbuf(FILE* stream, char* buffer, int mode, size_t size);
    
    • stream: 버퍼링 방식을 변경할 파일 스트림을 가리키는 포인터
    • buffer: 버퍼링에 사용할 메모리 공간.
      • 버퍼를 직접 지정하는 경우, 그 크기를 4번째 매개변수 size로 지정해야 함.
      • 버퍼를 NULL로 지정하는 경우 라이브러리가 자동으로 4번째 매개변수 size만큼의 버퍼를 할당함.
    • mode: 버퍼링 정책.
      • _IOFBF: 버퍼가 가득 찼을 때만 입출력 작업 수행.
      • _IOLBF: 개행 문자를 만날 때마다, 버퍼가 가득 찼을 때, 입력이 요청될 때 입출력 작업 수행.
      • _IONBF: 버퍼링을 수행하지 않음.
    • size: 버퍼로 사용할 메모리의 크기(바이트 단위).
  • 해당 바이너리의 경우 버퍼링에 사용할 메모리 공간의 주소를 임의로 지정할 수 있으므로, aaw(arbitrary-address-write)가 가능하다.
    • 이를 활용해 힙 청크에 데이터를 입력하여 문자열을 조작하면, 플래그를 획득할 수 있다.

새롭게 알게된 점

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.