본문 바로가기

Heap 0번 본문

wargame/Protostar

Heap 0번

Seongjun_You 2021. 11. 27. 01:29
#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();
}

현재 코드의 변수를 넣은 힙 영역 구조이다.

 

 

일단 data와 fp의 위치를 찾아보기로 했다.

함수는 리턴 값을 담기 위한 레지스터로 eax를 사용한다.

malloc함수 다음 줄에 있는 main+21, main+37에서 주소를 구할 수 있을 것이다.

바로 break를 걸고 eax를 확인하여 힙 영역을 찾아보았다.

 

 

 

A를 세 개 입력했다.  0x51data 헤더 영역의 사이즈를 뜻 한다.

저 아래 0x11fp헤더의 사이즈다 그 옆에 0x8048478이 보인다. 저 주소가 nowinner 함수의 주소이다. 이제 저 주소를 바꾸면 된다.

 

winner 주소를 구했다.

 

이때 ASLR을 안 꺼서

삽질했던 기억이 있다.

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

Heap 2번  (0) 2021.11.27
Heap 1번  (0) 2021.11.27
Format 4번  (0) 2021.11.25
Format 3번  (0) 2021.11.25
Format 2번  (0) 2021.11.25
Comments