Write up 작성에 앞서, 사실 홈페이지 내에서 풀이/Flag를 공유하지 말 것을 규칙으로 명시하고 있습니다. 그러나 저는 알고리즘이든 해킹이든 공부를 하면서 풀이를 적극적으로 참고하고, 또 이러한 공부 방법이 큰 도움이 된다고 생각합니다. 풀이가 널려있으면 고민을 덜 하고 풀이에 의존하게 되는 단점이 있지만, 아예 처음 들어보는 테크닉으로 해결해야하는 문제에서는 풀이가 없으면 아무것도 할 수가 없습니다. 무엇을 공부해야할지조차 알 수가 없으니까요. 특히 지금 저는 시스템 해킹/리버싱이 아직 많이 부족하기에 주변에 잘하는 친구들이 없었다면 아예 공부를 시작할 엄두조차 내지 못했을 것입니다. 그래서 저는 풀이를 공유하고, 다른 사람의 풀이를 보는 것이 그렇게까지 나쁜 것인지는 잘 모르겠습니다.(zigui님의 이 글에 굉장히 동의합니다.) 물론 사이트를 만들어주신 분의 노고에 정말 감사하고 그 뜻에 따르는게 맞지만, 위에 적은 이러한 이유들로 저는 풀이를 올리기로 결정했습니다. 이 점이 못마땅하더라도 어차피 현재 저의 실력으로는 앞쪽의 쉬운 문제들만 해결할테니 그나마 부작용이 적지 않다는 점을 양해해주시면 감사하겠습니다. 다만 혹시 관리자의 연락이 온다면 풀이는 전부 비공개로 돌리겠습니다.
--------------------------------------------------------------------------------------------------------------------------------------------
서론이 길었고, 바로 첫 번째 문제 Welcome의 풀이를 작성해보겠습니다.
코드를 보면 일단 $v3$에 0x40000 바이트를 malloc으로 할당을 받고, 첫 번째 바이트에 1을 씁니다. 그리고 길이 $len$을 입력으로 받아 $v5$에 $len$ 바이트를 malloc으로 할당 받고, 할당받은 곳의 마지막 바이트에 0을 씁니다.
맨 처음에는 $v3$과 $v5$가 어떻게 잘 겹쳐질 수 있어 이를 이용한 취약점인줄 알았는데 아무리 뭔가를 해봐도 그게 잘 되지 않았습니다.
이 스샷은 gdb-peda로 $len$을 0x40000으로 두어 테스트해본건데, 보면 $v5$의 주소는 @@@57010부터이고 $v3$의 주소는 @@@98010부터임을 알 수 있습니다. 이와 같이 아무리 해도 주소가 겹칠 수 없었습니다. 상식적으로 생각해도 malloc이 그렇게 할당한 영역이 겹치게끔 둘 리가 없었죠. 여기서부터 뇌정지 상태였는데, 지인에게 물어봐 문제를 해결할 수 있었습니다. 바로 malloc이 실패할 때의 흐름을 생각해보는 것입니다.
malloc은 할당에 실패할 경우 0을 반환합니다. 이제 그러면 바로 감이 올 것입니다. 이제 그냥 내가 원하는 곳에 0을 쓸 수 있는 것입니다.
플래그를 얻었습니다!
'워게임 > Pwnable.xyz' 카테고리의 다른 글
[Pwnable.xyz] GrownUp (0) | 2019.03.16 |
---|---|
[Pwnable.xyz] misalignment (0) | 2019.03.06 |
[Pwnable.xyz] add (0) | 2019.03.05 |
[Pwnable.xyz] sub (0) | 2019.03.05 |