해커스쿨 LOB level7
-분량 많습니다.
이번에도 비슷한 맥락으로 풀 수 있으려니 했지만 좀 다른 방식으로 풀어야 하겠습니다
//here is changed! 이 부분이 argv[0]의 크기가 77이어야 BOF를 일으킬 수 있게 만드는데, 이는 평소에 풀던 방법과는 좀 다르게 심볼릭 링크를 사용해서 문제를 풀어야 합니다.
그것땜에 level 다시 보고 왔죠 근데 별 도움 안되드라 다른 풀이가 짱이야 bb
ln -s orge link을 예시로 들어보면, 같은 디렉토리에 orge의 심볼릭 파일인 link가 생성되는 겁니다
확인하고자 ./link을 입력하면 그 실행 결과가 ./orge의 실행 결과와 일치하는 것을 볼 수 있지요 하하
이를 모의로 실험해보고자 tmp 디렉토리를 만든 뒤 거기에 orge의 또 다른 심볼릭 파일을 만들었습니다
절대경로가 아닌 상대경로로 모의 실험하기 때문에 파일의 이름을 59바이트로 해야 해요, 왜냐면 /home/darkelf/tmp/까지가 딱 18바이트이기 때문이죠 (18 + 59 = 77)
그래서 `python -c 'print "A"*59'`로 파일 이름이 A가 59개인 파일을 만들어줬고, 이 뒤에 123을 붙여서 실행하면 argv error이 아닌 stack 어쩌고 하는 에러 문구가 뜨는 것을 볼 수 있습니다.
진진자라 진진 자 다음은 gdb를 켜서 strcpy의 위치를 확인해야겠죠 <main+275>인 것을 확인했으니 BP 걸고
아니지 A가 59개인 파일을 디버그해야 되는데 잘못했군요 그래서 상대경로로 실행시킨 다음에 \xbf를 48개 추가하면 일단 에러 문구는 뜨지 않습니다
그리고 esp 레지스터의 메모리를 뜯어봐야겠죠 어라 근데 평소랑 다르네 싶다가 0xbffffbf0부터 파일 이름(A...)의 아스키코드가 반복되는 걸 확인할 수 있어요
그 다음엔 bf가 반복되겠죠
그럼 0xbffffc2c부터가 argv[2]의 시작주소임을 알 수 있어요! 와!
그럼 이제 이대로 쉘을 따...ㄹ 수가 없네요 처음보는 코어 덤프 에러
그래서 코어로 디버그를 다시 해보면 그 메모리 주소가 다른 걸 확인할 수 있습니다. 이번에는 0xbffffba8이네요 기억하고
\x90을 19개(A파일 직전까지의 상대경로) 넣고, 쉘코드 + argv[2]의 시작주소(bf)까지 하면 모의 실험에서는 성공적으로 쉘이 따인 것을 볼 수 있습니다
약간 어려울 수 있는데(ㅇ주인장이 어려워서요) 단순한 뇌피셜임을 감안하고 이를 해석한다면
어 방금 전까진 괜찮았는데 해석을 못하겠넹 ㅋㅋㅋㅋㅋㅋ\x90이 왜 19번밖에 안 쓰이지ㅋㅋㅋㅋㅋ
아 네 저는 이해했는데 설명을 못하겠어요 모르겠네요 허허 몰라 넘어갈래요
1. darkelf 디렉토리에서 절대경로로 실행할 A파일의 파일 이름은 A가 75개여야 합니다. ./(A파일)이기 때문에..
2. 그 뒤에 tmp 디렉토리에서 모의 실험했던 거랑 똑같이 하면 됩
3. 어 안되네 그럼 주소를 살짝쿵 바꿔봅시다
4. 짜잔 쉘이 따였네요!
ㅋㅋㅋㅋ아 재밌다 4개인가 연속으로 풀이하니까 약간 러너스하이 온 기분이에요ㅋㅋㅋ아 뿌듯행
2019.7.14