허우... Grown up은 FSB인데... 어려워서... note로 넘어왔는데... 이것도 어렵네여...
이렇게 4개 함수가 있으며,
win 함수로 클리어하면 되는 문제입니다.
우선 이 문제를 풀기 위해 보아야 할 곳은 .bss 영역입니다.
BSS 영역이 이런식으로 구성되어 있는데 여기서 s변수와 buf 변수의 거리가 32라는 것을 알아야합니다.
물론 다른 방법으로 풀 수도 있겠지만요.
아무튼, BSS영역이란 변수를 선언할 때 초기값이 0이나 null 값인 경우 데이터가 할당되는 공간입니다. 이와 반대로 어떤 값이 들어간 상태로 변수가 선언되면, 다른 DATA 영역으로 들어가게 됩니다.
왜 이렇게 구분되는지는 잘 모르겠지만 인터넷이 그렇다고 하네요...
다시 돌아와서 우리가 저 부분을 어떻게 사용할거냐? 라고 한다면!
edit_note 부분에서 strncpy로 buf의 데이터를 v0만큼 s에 붙여넣게 되는데, 여기서 처음에 buf에 입력시켜줄 때 v0가 32보다 크게 된다면 저기 bss영역에 데이터가 들어갈 때 s를 넘어서서 buf에까지 데이터를 덮어쓰게 됩니다.
free를 통해 할당한 메모리를 해제하더라도 데이터는 남게 되는거죠.
저걸 잘 이용한다면 문제를 풀 수 있는데요. 문제를 정말 풀기 전에 이 개념도 알아야합니다.
PLT와 GOT의 개념입니다.
모든 함수에는 이 PLT와 GOT가 존재합니다.(아마도요..?)
PLT는 GOT로 점프하는 코드가 들어있으며, GOT는 실제 함수의 주소를 가지고 있습니다.
말하자면 PLT는 GOT의 값을 참고해서 실제 함수의 주소로 점프한다는 것이죠.
아직 제 식견이 부족해서 맞는지는 모르겠지만 이 문제는 GOT Overwrite 문제가 아닐까 싶습니다.
다시 또 문제로 돌아와서, 위의 edit_note에 s에 strncpy를 통해 값을 넣는데 이를 이용해서 buf에도 덮어쓸 수 있다고 했었습니다.
이제 이 코드를 실행하게 되면 buf에 32만큼의 데이터를 입력받게 되는데요.
입력받기 전에 저기 if문 보이나요?
저 부분 때문에 이런 공격이 가능한 겁니다.
buf에 값이 없을 때 malloc을 통해 동적 할당한다. 이기 때문에 아까 우리는 위에서 buf에 덮어써서 값이 존재하는 상태이므로 넘어갈 수 있게 됩니다.
그. 래. 서 read를 할 때 사용하는 buf에는 이미 데이터가 존재하는 상태라는 것이죠.
이 다음부터는 저도 큰 확신을 가지고 풀이를 작성하는것이 아닙니다...
이제 아무것도 몰라서 풀이를 봤는데... 저 buf에 read나 printf의 GOT 값을 넣더라고요?
그래서 GDB로 확인해봤습니다.
만약에 32개만큼 A를 넣고 64비트니까 8바이트 주소를 입력하면?
왜인지는 모르겠지만... RSI에 BBBBBBBB(주소입력자리)가 들어가서, 두번째 인자로 들어가네요?
아무튼 저기가 원래 그 자리인가봐여...
그래서? 저 B의 자리에 read의 GOT의 주소를 넣을 수 있게 되며, 그 뒤에 edit_desc에서 buf에 win의 주소를 넣으면, GOT에서 jmp 하는 주소가 win의 주소가 되게 됩니다.
이렇게 입력하면 됩니다.
addr2가 read의 GOT이고, addr이 win의 주소입니다.
끄읕... 질문 해결하러 공부하러갑니다...
* 질문: bss 영역에 있는 s변수를 오버플로우 시켜 buf 변수에 GOT 주소를 덮어씌우고, 다시 read를 통해서 buf에 일정 바이트를 입력 받을 때 왜 GOT의 주소에 그 데이터가 들어가는 것일까? buf 변수에 GOT 주소가 값으로 들어간거라면, 똑같이 buf 변수에 데이터가 입력받아져야 하는거 아닐까?
* 질문: 위의 질문에서 혹시 오버플로우를 시키고 buf 변수에 덮어씌울 때 첫 8바이트는 buf의 주소를 나타내는 값이 아니었을까?
* 질문: 어떤 함수의 인자로 들어갈 때 그게 주소값이면, 주소값 내에 있는 값을 가져오는걸까..?
'Hacking-기초 > [PWN] Pwnable.xyz' 카테고리의 다른 글
[PWN] GrownUp (50pts) (0) | 2020.08.07 |
---|---|
[PWN] xor (50pts) (0) | 2020.08.01 |
[PWN] misalignment (50pts) (0) | 2020.07.28 |
[PWN] add (50pts) (0) | 2020.07.28 |
[PWN] sub (50pts) (0) | 2020.07.28 |