// 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");
  printf("Buf: ");
  read(0, buf, 0x100);
  printf("Buf: %s\\n", buf);
  // Do ROP
  puts("[2] Input ROP payload");
  printf("Buf: ");
  read(0, buf, 0x100);
  return 0;
}

ROP 실습 코드

ROP 페이로드는 리턴 가젯으로 구성되는데, ret 단위로 여러 코드가 연쇄적으로 실행되는 모습에서 ROP chain이라고도 불립니다.

Untitled

적용된 보호기법

system함수를 호출하지 않아서 PLT에 등록되지 않고 있습니다.

“/bin/sh” 문자열도 데이터 섹션에 기록하지 않습니다.

따라서 system함수를 익스플로잇에 사용하려면 함수의 주소를 직접 구해야 합니다.

“/bin/sh” 문자열을 사용할 다른 방법을 고민해야 합니다.

2. system 함수의 주소 계산

system 함수는 libc.so.6에 정의되어 있습니다.