orc 로그인 후 파일을 확인한다.
코드 파일을 열어 코드를 분석한다.
level 4 [gobilin] 문제와 비슷한데 buffer hunter가 생겼다.
level 4에서 배운 memset을 분석하면 buffer 변수의 메모리를 0으로 40byte만큼 초기화한다.
gdb로 메모리를 분석한다.
이때, 권한문제를 피해 복사해서 열어야 하는 건 많이 해서 이제는 알 것이다.
이전 메모리들은 이전 문제와 같고 이 부분만 추가됐으므로 이 부분문 가져왔다.
어셈블리 코드를 보지 않아도 될 정도다. 주소만 보자면 "ebp-40"이고 메모리 스택을 도식화해본다.
int i 4byte |
char buffer[40] 40byte |
SFP 4byte |
RET 4byte |
여기서도 변수 i는 신경 쓰지 않아도 되고 dummy도 들어있지 않은 메모리 스택을 가졌다.
level 4와 너무 비슷하다. 그래서 level 4의 풀이와 같은 방법으로 풀어보려고 한다.
main에 break를 걸고 인수를 두 개 주고 실행한다.
실행하고 $esp를 찾아보면 argv[2]가 "0xbffffc68"에서 시작하는 걸 알 수 있다.
앞 문제와 같이 argv[2]의 주소를 가지고 RET에 셸 코드를 넘겨준다.
argv[2]의 주소로 페이로드를 넣으면 셸이 실행되는 것을 볼 수 있다.
다른 문제들은 level 4에서 해결한 것과 같다.
이 문제를 처음 풀 때 argv[2]의 주소를 찾고 주소에 대해 넣었지만, 오류가 났던 적이 있다.
실패 사례에 대해 공유하려고 한다.
이 오류를 어떻게 할지 몰라 질문을 통해 답변을 받았다. 이 오류는 정확하게 올바른 셸 코드를 가리키는 것이 아니라 조금 비틀려서 가리키고 있을 수도 있다고 한다.
이 페이로드처럼 두 번째 인수에서 "0x90"을 넣어 주었더니 셸이 실행되었다. 이때 "0x90"은 싱글 바이트 명령어라서 셸 코드가 비틀릴 일이 없기서 주솟값 보정을 도와줘서 정상적으로 셸 코드가 실행된다고 한다.
오류가 나거나 리턴 어드레스에 셸 코드 주소로 정확하게 맞는다고 판단되지 않았을 때는 셸 코드 앞에 "0x90"을 넣으면 주솟값을 보정을 도와줘서 쉽게 해결할 수 있다고 한다.
"0x90"은 nop로 아무것도 안 하고 다음 명령어로 넘어가기 때문에 eip를 정확하게 맞춰주지 않아도 nop 안으로만 맞추면 셸 코드가 정상 작동하게 된다고 한다.
'System Hacking > 해커스쿨 L.O.B Hacking Zone' 카테고리의 다른 글
해커스쿨 L.O.B level 7 [darkelf] (0) | 2020.05.28 |
---|---|
해커스쿨 L.O.B level 6 [wolfman] (0) | 2020.05.25 |
해커스쿨 L.O.B level 4 [goblin] (0) | 2020.05.18 |
해커스쿨 L.O.B level 3 [cobolt] (0) | 2020.05.17 |
해커스쿨 L.O.B level 2 [gremlin] (0) | 2020.05.16 |
댓글