반응형

포린이의 첫 RTL문제 시도... 정답을 보면서 하면 당연히 실력이 늘지 않으니 몇시간동안 끙끙대면서 푸는게 참 힘든 것 같다. ㅜㅜ

 

(문제 출처 : https://dreamhack.io/wargame/challenges/353/ )

 

Return to Library

Description Exploit Tech: Return to Library에서 실습하는 문제입니다.

dreamhack.io

 

일단 국룰 체크 먼저.

카나리, NX 보호기법이 사용되었다. 기본적으로 지금 풀고 있는 문제는 전부 bof 관련된 문제이므로, canary leak을 해주어야 할 것이고, NX로 인해 스택 영역에 실행권한이 없을 것이므로 쉘코드를 실행할 수 없을 것. 따라서 system("/bin/sh") 을 실행할 수 있도록 함수의 주소, 문자열의 주소, 가젯 등을 이용해야 할 것이다.

 

C 코드를 살펴보도록 하자.

#include <stdio.h>
#include <unistd.h>

const char* binsh = "/bin/sh";

int main() {
  char buf[0x30];

  setvbuf(stdin, 0, _IONBF, 0);
  setvbuf(stdout, 0, _IONBF, 0);

  // Add system function to plt's entry
  system("echo 'system@plt");

  // Leak canary
  printf("[1] Leak Canary\n");
  printf("Buf: ");
  read(0, buf, 0x100);
  printf("Buf: %s\n", buf);

  // Overwrite return address
  printf("[2] Overwrite return address\n");
  printf("Buf: ");
  read(0, buf, 0x100);

  return 0;
}

문제가 친절하다. "/bin/sh"의 주소도 주고, system 함수도 사용해주면서 system 함수도 사용해주면서 system 함수를 이용할 수 있도록 한다.

그 다음으로는, read함수를 통해 buf에 값을 써주고 출력해주면서 canary leak을 해줄 수 있도록 한다.

그 다음으로는, return address 를 overwrite해주는, 즉, 또다시 bof를 이용해야한다. 이를 통해 RTL을 성공적으로 마칠 수 있을 것 같다. 

 

그렇다면 공격 시나리오는 Canary Leak -> get system address, get /bin/sh address, geet gadget -> Return To Library 

이렇게 볼 수 있을 것 같다.

Canary Leak

카나리 릭은 지금까지 많이 해왔으니까... 간단하게 빠르게 넘어가자.

read함수에서 buf 배열을 이용하는데, read함수를 사용하는 곳으로 가보면

buf 배열이 [rbp-0x40]에 있는 것을 알 수 있다. 그렇다면 SFP(RBP)와 BUF의 사이에는 dummy data 8바이트와 canary 8바이트가 있을 것이다. 이를 바탕으로 페이로드를 구성해보자.

이렇게 카나리를 Leak 할 수 있겠다.

 

RTL 정보 추출하기.

위 코드에서 "/bin/sh"이라는 문자열도 사용되었고, system함수도 사용되었으므로 둘 다 메모리상에 주소가 존재할 것이다. 한번 찾아보자.

/bin/sh 전역변수의 주소
plt 테이블

이로써 필요한 정보를 수집하는 데 성공했다. 이제 이걸 어떻게 적용하면 될까?

이렇게 페이로드를 구성하면 된다.

 

SFP(rbp)를 덮는 것 까지는 이전과 같은데, RET 자리에 ret gadget을 두었다. 이를 통해 그 다음 명령어들까지 실행을 할 수 있다. (사실 이 가젯까지는 잘 이해를 하지 못했는데, 이거 없이 실행할 때 오류가 나면 이걸 넣어서 해결한다고 하길래)

 

<가젯 찾는 법>

 

그 다음으로는 pop rdi, ret이 있다. 이 명령어를 실행하면, "/bin/sh"이 저장된 주소를 pop 해서 rdi에 저장한다.

다들 rdi가 뭔지는 잘 알 것이다. 바로 함수의 첫 번째 인자로 들어가는 녀석이다. 인자까지 준비를 완료했으니, ret 가젯이 실행되면, 인자가 system 함수로 들어가 최종적으로 system("/bin/sh") 명령이 실행되는 것이다.

 

익스플로잇 코드

 

실행해주면.....

성공이다..!

반응형

+ Recent posts