[DreamHack] [Pwnable] rop

저번에 RTL 진행하면서 rop를 사용한 적이 있었는데, 이번에는 rop 문제를 풀어보려고 선택했다.

환경 분석부터 하고 가겠다.

image.png

취약점 분석

// Name: rop.c
// Compile: gcc -o rop rop.c -fno-PIE -no-pie

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

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

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

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

  // Do ROP
  puts("[2] Input ROP payload");
  write(1, "Buf: ", 5);
  read(0, buf, 0x100);

  return 0;
}

전체 코드 중, 취약점이 대놓고 적혀 있다.

Leak canary부분은 저번 RTL 풀이 때랑 비슷하고, Do ROP 부분이 새로운 부분이다.

달라진 부분이라면 write() 함수를 이용해 출력을 하는 부분이다.

write(fd, buf, size) 함수는 유닉스 계열 시스템에서 사용하는 시스템 콜로,

buf에 있는 데이터를 fdsize만큼 출력한다.

이 부분이 있기 때문에 stack canary 유출이 가능하다.

char buf[0x30];
  puts("[1] Leak Canary");
  write(1, "Buf: ", 5);
  read(0, buf, 0x100);

전체 스택 buf는 0x30 = 48 바이트인데, read() 함수로 0x100 = 256 바이트를 입력 받기 때문에