J0N9HYUN

Protostar Heap 0 본문

Wargame/Protostar

Protostar Heap 0

j0n9hyun 2018.12.29 06:49

heap 0

#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <sys/types.h>

struct data {
  char name[64];
};

struct fp {
  int (*fp)();
};

void winner()
{
  printf("level passed\n");
}

void nowinner()
{
  printf("level has not been passed\n");
}

int main(int argc, char **argv)
{
  struct data *d;
  struct fp *f;

  d = malloc(sizeof(struct data));
  f = malloc(sizeof(struct fp));
  f->fp = nowinner;

  printf("data is at %p, fp is at %p\n", d, f);

  strcpy(d->name, argv[1]);
  
  f->fp();

}


malloc이 두개나 선언되어 있다. 첫번째로 d에서는 data에 대한 구조체 크기를 malloc하고 f에는 fp 구조체 크기를 malloc 한다.그리고 argv[1]으로 strcpy하는데 disassemble로 변화를 확인해보자




strcpy 부근에 bp를 걸고 AAAA를 주면 사진과 같이 배열되어 있다. 414141은 알다시피 우리가 입력한 값 A다 그리고 쭉 가다가 주소가 하나 등장하는데 이 노란 박스 주소는 nowinner 함수의 주소값을 가리키고 있다.  





그렇다면 이 주소값을 winner 함수로 변조한다면 우리가 원하는 흐름을 기대할 수 있을 것이다. 414141과 nowinner 함수 주소 사이을 패딩해주고 winner 함수 주소를 쓰면 성공!





'Wargame > Protostar' 카테고리의 다른 글

Protostar Heap 0  (0) 2018.12.29
Protostar Format 3  (0) 2018.12.23
Protostar Format 2  (0) 2018.12.23
Protostar Format 1  (0) 2018.12.22
Protostar Format 0  (0) 2018.12.22
Protostar Stack 7  (0) 2018.12.22
0 Comments
댓글쓰기 폼