passcode : aspirin
(NO DRAG, NO PASSCODE)
bash2. vampire 프로그램과 소스코드가 있다. 분석해보자.
이번 문제는 shellcode 를 export 해도 된다. shellcode의 주소를 ret 주소에 넣으면 될 것 같다. 하지만 argv[1][46] == '\xff' 이어야 한다. 지금까지의 buffer 주소 및 NOP의 주소는 0xbfffxxxx 의 형태였다. 하지만 이 문제는 그런 주소를 사용하지 못한다.
우선 메모리 구조는 다음과 같다.
—————————— High Address
| ret(4) |
——————————
| sfp(4) |
—————————— ← ebp
| buffer(40) |
—————————— Low Address
따라서 주소를 바꿔야 하는데, 우선 프로그램이 실행될 때 스택에 어떤 정보가 들어가는지를 알아야 한다. troll 프로그램을 실행하게 되면 우선 main 함수가 스택에 쌓이게 되는데, 높은 주소부터 인자, ret, sfp, buffer 순으로 쌓이게 된다. 메모리 구조를 살펴보자.
—————————— High Address
| argv[1] |
——————————
| argv[0] |
——————————
| ret(4) |
——————————
| sfp(4) |
—————————— ← ebp
| buffer(40) |
—————————— Low Address
인자가 ret 주소 위에, 즉 가장 높은 주소에 있는 것을 볼 수 있다. 따라서 인자의 길이를 엄청나게 증가시키면 buffer나 NOP의 주소가 점점 감소한다는 것을 알 수 있다.
그럼 어디까지 증가시켜야 할까? 보통의 프로그램을 실행하게 되면 거의 모든 메모리 영역이 0xbfffxxxx 으로 시작하는 것을 볼 수 있다. 또한 argv[1][46] = '\xff' 이 되면 안되므로 인자의 길이를 약 0x10000 증가시키면 메모리 영역이 0xbffexxxx 이 될 것이다. 그럼 프로세스를 종료시키지 않는 조건만을 채운 뒤에 gdb로 실행하여 적절한 주소를 찾아보자.
일단은 버퍼의 시작 주소가 0xbffefaad 임을 알 수 있다. 우선 이 주소를 넣어 쉘을 따보자.
쉘을 성공적으로 땄다. 이번에는 NOP Sled 기법을 이용하여 쉘을 따보자. ret 보다 높은 주소 중에서 적당하게 0xbffefb5c 를 선택하여 payload를 짜서 쉘을 따보자.
깔끔하게 둘 다 쉘을 얻었다.
[vampire] : music world
'Pwnable > LOB' 카테고리의 다른 글
[LOB] 10. SKELETON (0) | 2020.08.28 |
---|---|
[LOB] 9. VAMPIRE (0) | 2020.08.28 |
[LOB] 7. ORGE (0) | 2020.08.28 |
[LOB] 6. DARKELF (0) | 2020.08.28 |
[LOB] 5. WOLFMAN (0) | 2020.08.28 |