passcode : cantana
(NO DRAG, NO PASSCODE)
bash2 입력후 파일들을 살펴보자. 소스코드 분석 해보자.
이전 문제였던 goblin과 매우 동일하나 buffer의 값이 모두 0으로 채워져 있다. 따라서 buffer를 사용하지 못한다. 이럴 때는 어떻게 해야 할까?
일단 buffer 안에는 shellcode를 못 넣으므로, buffer + sfp 을 넘어서 ret 뒤에 NOP와 함께 shellcode를 붙여야겠다. 그러면 NOP Sled 를 타고 쉘이 실행될 것이다.
먼저 gdb로 메모리 구조를 분석하자.
메모리 구조는 다음과 같다.
—————————— High Address
| ret(4) |
——————————
| sfp(4) |
—————————— ← ebp
| buffer(40) |
——————————
| int(4) |
—————————— Low Address
먼저 ret 주소를 덮을 buffer의 시작 주소를 구해보자. 우선 wolfman.c 코드를 수정하여 buffer 의 주소를 출력하는 프로그램을 만들어서 실행해보자.
일단은 0xbffffb00 이라고 나와있다. 이를 이용하여 payload를 작성해보자.
strcpy 함수는 NULL 값까지 문자열을 복사하여 저장하기 때문에 주소의 마지막 \x00 부분을 적절하게 증가시켜 다시 짜보자.
core dump가 일어났다. 이제 core 파일을 분석하여 정확한 buffer의 주소를 찾아내자.
buffer의 주소는 0xbffffbc8 이다. 이를 이용하여 다시 payload를 짜보자.
이제까지 ret 주소를 buffer의 시작 주소로 덮었었는데 뭔가 정확하지 않다.
segmentation fault가 떴다. 주소가 또 잘못되었나 보다. 그런데 이렇게 주소를 구하여 ret 값을 주는 것보다 좋은 방법을 알아냈다. ret 주소를 기존의 ret 주소보다 더 큰, 즉 더 뒤의 주소로 덮는다면 이 주소로 이동할 것이기 때문에 NOP Sled 를 타고 바로 shellcode로 이동할 수 있다.
ret 보다 높은(더 뒤의) 주소로, 즉, 대충 0xbffffc10 정도로 ret을 덮어주면 더욱 깔끔해질 것 같다.
성공적으로 쉘을 땄다.
[wolfman] : love eynua
'Pwnable > LOB' 카테고리의 다른 글
[LOB] 6. DARKELF (0) | 2020.08.28 |
---|---|
[LOB] 5. WOLFMAN (0) | 2020.08.28 |
[LOB] 3. GOBLIN (0) | 2020.08.28 |
[LOB] 2. COBOLT (0) | 2020.08.28 |
[LOB] 1. GREMLIN (0) | 2020.08.28 |