감자 텃밭

[프로토스타] prostar - heap1 본문

protostar/heap

[프로토스타] prostar - heap1

g2h 2021. 8. 10. 19:46

이번에는 프로토스타의 heap1번 문제이다 이번 문제는 heap0번 문제보다 수준이 높아 보였다.

malloc와 포인터에 대해 좀 더 상세히 살펴봐야했다.

일단 해당 문제의 소스코드는 아래와 같다.

internet라는 구조체를 만들며 int형 priority와 char형 포인터 변수 name을 선언했다 또한 winner함수가 존재하며

main함수에는 구조체 포인터 i1, i2, i3를 선언하고

i1, i2에 각각 internet의 크기만큼 메모리를 할당해주고 있다 또한 priority에 1을 할당하고 name에는 또 8만큼의 메모리를 할당해주고 있다. 

그 후 strcpy를 통해 i1포인터 구조체의 name변수에 argv [1]을 할당하고 그다음 strcpy함수에 의해

i2포인터 구조체의 name변수에 argv [2]를 할당한다 그 후 printf 함수를 통해 해당 문자열을 출력하는 듯하다

이 부분에서 bof가 일어날 것이다.!!!

해당 문제에 접근하기 위한 방법은 첫 번째 strcpy를 통해 bof를 일으켜 i2->name 위치에 접근하여 i2가 포인터로 가리키는 값을 printf함수의 got로 변조시킨 후 argv2의 값으로 winner함수의 주소를 넣으면 된다 그럼 got overwrite로 인해

printf함수가 실행될 때 printf가 아닌 winner함수가 실행될 것이다.

일단 입력값을 주고 메모리가 어떻게 할당되는지 확인했다.

-8 부분인 헤더 부분부터 출력시켜서 확인하였다 1 부분이 priority부분이고 그다음 부분에 name부분의 포인터 즉 41414141이 들어간 주소 값이 된다 확인해보니 일치하였다.

그럼 저 기부분을 쭉 더미 값으로 채운 후 42424242를 가리키는 포인터의 주소 값을 printf함수의 got로 변조 후 

두 번째 argv [2] 값으로 winner함수의 주소를 넣으면 된다.

그럼 결론은 argv [1] =  20개의 더미 값 + printf got  argv [2] = winner함수의 주소를 넣으면 될 것이다.

성공적으로 winner함수가 출력되는 것을 확인할 수 있었다

이번 문제는 조금 복잡하게 꼬여있었던 거 같지만 나름 재미있었다.

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

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