passcode : here to stay
(NO DRAG, NO PASSCODE)
간단하게 PLT를 이용하여 푸는 문제이다. PLT에 관련된 내용은 RTL에서 다루었다. 간단히 말해서 함수를 호출할 때 우선 PLT를 참고하고, 이 PLT는 다시 GOT를 참고한다. 문제는 다음과 같은 알고리즘으로 해결한다.
- main 함수의 RET 값이 strcpy 함수의 주소로 덮인다.
- 또한 strcpy 함수의 RET 값이 “AAAA”로 덮이기 때문에 이를 strcpy 함수의 기능을 이용하여 shellcode의 주소로 덮는다.
- strcpy 함수를 이용하므로 인자의 개수 및 인자값을 잘 설정하여 argv[1]에 전달한다.
- strcpy(char *dest, char const source)
따라서 payload는 다음과 같다.
NOP + shellcode + dummy(19) + &(strcpy) + dummy(4) + parameter_1 + parameter_2
이렇게 되면 strcpy 함수가 실행되어 parameter_1(“AAAA”가 덮인 부분)에 parameter_2(&(buffer))가 들어가게 되면서 strcpy 함수의 RET이 &(buffer)로 변조되게 된다. 이로 인하여 buffer에 넣어준 NOP+shellcode 가 실행된다.
우선 argv[1]+44 값이 &(strcpy@plt)가 되어야 하므로 strcpy 함수의 PLT 주소를 우선 구해보자.
strcpy@plt -> 0x8048410
buffer 시작 주소 -> 0xbffffbd4
이를 이용하여 exploit 해보자.
지속적인 segmentation fault 오류 발생.
gdb 분석 결과 -> buffer의 시작 주소를 strcpy 함수의 RET 값으로 변조하려고 했으나 계속하여 1byte씩 오류가 발생하는 바람에 쉘은 따지 못하였다. LOB 파일에 오류가 생겼는지는 모르겠지만 정확한 이유는 모르겠다. 어쨋든 문제를 해결하는 알고리즘에는 오류가 없으므로 정상적인 환경에서는 쉘이 따질 것이다.
[nightmare] : beg for me
'Pwnable > LOB' 카테고리의 다른 글
[LOB] 19. XAVIUS (0) | 2020.08.28 |
---|---|
[LOB] 18. NIGHTMARE (0) | 2020.08.28 |
[LOB] 16. ZOMBIE_ASSASSIN (0) | 2020.08.28 |
[LOB] 15. ASSASSIN (0) | 2020.08.28 |
[LOB] 14. GIANT (0) | 2020.08.28 |