티스토리 뷰

Pwnable/Heap

[Protostar] Heap0

D41JUNG0D 2018. 3. 11. 20:19

1. Introduce

heap을 얼마나 이해하고 있는지를 알기위해서 protostar의 heap시리즈의

           write-up을 작성해보겠습니다.


2. Analysis

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

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

}

Colored by Color Scripter

cs


코드를 보게되면 data, fp 라는 구조체를 선언하고 있고, 구조체 포인터 d와 f에 각각 구조체의 크기만큼 malloc 즉, 메모리를 할당해주고 있습니다.


그리고 fp 구조체의 fp 함수포인터에 nowwinner라는 함수의 주소를 넣어주고, 함수포인터를 실행시키는 것을 볼 수 있습니다.


근데 이 함수포인터를 실행시키기 전에 strcpy함수를 이용해서 data 구조체의 name멤버 변수에 argv[1]의 값을 복사시키고 있습니다.


strcpy 함수를 이용하여 값을 복사시키므로 heap over flow가 일어나게 되고, 어쩌면 fp 구조체의 함수포인터를 조작할 수 있을 것 같습니다.


아마 이 함수포인터를 winner의 주소로 조작하면 될 것 같습니다. 그리고 strcpy함수 전에 printf함수를 이용해서 구조체 포인터 d와 f의 주소를 출력해주고 있으므로 이 부분을 활용해서 heap over flow를 진행하면 될 것 같습니다.


3. Exploit



먼저  winner 함수의 주소를 구해줍니다.



그리고 구조체 포인터 d와 f의 주소를 알기위해 아무값이나 넣고 실행시켜보았습니다. 그런데 한가지 이상한 점이 있습니다.


구조체포인터에 할당한 크기는 name[64]의 크기, 즉 64byte만큼 할당이 되어있을텐데, d와 f의 주소의 차이를 구해보면 0x48 = 72 byte로 8byte만큼 늘어나 있는 것을 볼 수 있습니다.


이유는 heap에 메모리를 할당할 때 요청한 크기만큼만 할당해주지않고 할당한 메모리의 정보들이 추가로 할당되기 때문입니다.


이 부분은 Pwnable -> Heap 카테고리의 Heap 이해해 보기 포스팅에  자세하게 설명되어 있습니다.


따라서 우리는 heap over flow를 이용해 72byte만큼 dummy를 채워준 뒤 winner의 주소를 넣어주면 될 것 같습니다.



winner 함수가 실행되어 level passed라는 문구가 실행된걸 볼 수 있습니다.

'Pwnable > Heap' 카테고리의 다른 글

[Protostar] Heap3  (1) 2018.03.15
[Protostar] Heap2  (0) 2018.03.11
[Protostar] Heap1  (0) 2018.03.11
Heap 이해하기  (0) 2018.03.11
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함