감자 텃밭

[프로토스타] protostar - heap0 본문

protostar/heap

[프로토스타] protostar - heap0

g2h 2021. 8. 10. 10:59

이번에는 프로토스타에 heap0문제를 풀어보았다

힙에 대한 기본적인 지식을 요구하기에 heap에 대해 잘 몰랐지만 생각보다 재밌었던 문제이다.

기본적인 heap overflow문제인것 같았다.

일단 해당 프로그램의 소스코드를 보면

heap0.c

data와 fp 구조체를 선언하고 d와 p에 각각 data와 fp의 포인터를 선언한다 그 후 malloc를 통해 동적으로 메모리를 할당시킨다. 그 외에 winner와 nowinner라는 문자열을 출력해주는 함수가 있고 f->fp를 통해 nowinner함수를 fp구조체에 할당해주는 거 같다. 그 후 strcpy함수를 통해 d->name 즉 구조체 포인터 d에 argcv [1]의 값을 복사한다. 

이 부분에서 bof 가 일어나는 듯하다. 그 후 fp구조체의 fp함수 포인터의 함수를 출력시킨다.

우리는 여기서 nowinner 함수가 아닌 winner함수를 출력해야 한다.

 

bof를 일으켜 fp의 함수 주소를 바꾸면 된다고 생각될 수 있겠지만 그러기 위해서는 heap의 구조를 알아야 한다

힙은 헤더인 4byte(type)+4byte(size)와 +data로 구성되어 있으며 포인터로 잡고 있을 때 가리키는 값은 헤더가 아닌

데이터 부분을 가리키고 있다.

 

일단 천천히 접근해보았다.

첫 번째 메모리 할당 부분인

16번 줄을 실행시키고 21번째 줄에 breakpoint를 잡은 후 확인해 보았다.

eax의 주소가 0x804a 1a 0이기에 제대로 되었는지 확인했다.

제대로 찾은 거 같다 저 주소 값에서 -8을 한 이유는 앞에서 말했듯이 데이터 앞부분에 총 8바이트만큼의 헤더 값이 붙으며 데이터의 입력받아 저장하는  부분을 가르 키기기 때문에 헤더부터 모두 확인하려면 -8한 위치를 확인하면 된다.

 

이제 입력값이 제대로 들어가는지 확인해 보자.

입력을 받을 수 있도록 102번을 실행한 후 인 107 부분에 breakpoint를 잡고 특정값을 입력 후 확인해 보았다.

eax값을 확인하고 정상적으로 AAAA가 들어갔다 

제대로 들어간 거 같다.

A의 아스키코드값은 41414141이 들어갔고 그 뒤에를 보면 6번째 줄에 11은 fp구조체의 사이즈이다 그 후 나오는 것이

nowinner함수의 주소로 추측되어 확인해보았다.

예상과 같이 nowinner함수의 주소였다 그럼 우린 이 부분의 주소를  winner함수의 주소로 변조시키면 된다.

winner함수의 주소를 구해보았다.

그렇다면 이제 모든 건 다 구해졌다

우리가 입력받는 값부터 변조시키는 값까지의 거리를 계산해보면 80의 거리가 나온다

그럼 80개의 더미 값을 채운 후 winner의 주소를 넣으면 성공할 것이다.

성공!!!

heap에 대한 지식이 별로 없어 이해하더라도 설명하기에 많이 부족한 부분이 많았다. 

좀 더 공부를 해야겠다.

'protostar > heap' 카테고리의 다른 글

[프로토스타] protostar - heap2  (0) 2021.08.16
[프로토스타] prostar - heap1  (0) 2021.08.10