본문 바로가기
System Hacking/해커스쿨 L.O.B Hacking Zone

해커스쿨 L.O.B level 5 [orc]

by En_Geon 2020. 5. 21.

orc 로그인 후 파일을 확인한다.

 

orc 파일

 

코드 파일을 열어 코드를 분석한다.

 

wolfman.c

 

level 4 [gobilin] 문제와 비슷한데 buffer hunter가 생겼다. 

level 4에서 배운 memset을 분석하면 buffer 변수의 메모리를 0으로 40byte만큼 초기화한다.

 

gdb로 메모리를 분석한다.

이때, 권한문제를 피해 복사해서 열어야 하는 건 많이 해서 이제는 알 것이다.

 

gdb woflman

 

이전 메모리들은 이전 문제와 같고 이 부분만 추가됐으므로 이 부분문 가져왔다.

어셈블리 코드를 보지 않아도 될 정도다. 주소만 보자면 "ebp-40"이고 메모리 스택을 도식화해본다.

 

int i 4byte
char buffer[40] 40byte
SFP 4byte
RET 4byte

 

여기서도 변수 i는 신경 쓰지 않아도 되고 dummy도 들어있지 않은 메모리 스택을 가졌다.

 

더보기

 

level 4와 너무 비슷하다. 그래서 level 4의 풀이와 같은 방법으로 풀어보려고 한다.

 

break

 

main에 break를 걸고 인수를 두 개 주고 실행한다.

 

x/100x $esp

 

실행하고 $esp를 찾아보면 argv[2]가 "0xbffffc68"에서 시작하는 걸 알 수 있다.

앞 문제와 같이 argv[2]의 주소를 가지고 RET에 셸 코드를 넘겨준다.

 

페이로드

 

argv[2]의 주소로 페이로드를 넣으면 셸이 실행되는 것을 볼 수 있다.

다른 문제들은 level 4에서 해결한 것과 같다.

 

 

 

이 문제를 처음 풀 때 argv[2]의 주소를 찾고 주소에 대해 넣었지만, 오류가 났던 적이 있다.

실패 사례에 대해 공유하려고 한다.

 

Illegal instruction 오류

 

 이 오류를 어떻게 할지 몰라 질문을 통해 답변을 받았다. 이 오류는 정확하게 올바른 셸 코드를 가리키는 것이 아니라 조금 비틀려서 가리키고 있을 수도 있다고 한다.

 

"\x90"

 

이 페이로드처럼 두 번째 인수에서 "0x90"을 넣어 주었더니 셸이 실행되었다. 이때 "0x90"은 싱글 바이트 명령어라서 셸 코드가 비틀릴 일이 없기서 주솟값 보정을 도와줘서 정상적으로 셸 코드가 실행된다고 한다.

오류가 나거나 리턴 어드레스에 셸 코드 주소로 정확하게 맞는다고 판단되지 않았을 때는 셸 코드 앞에 "0x90"을 넣으면 주솟값을 보정을 도와줘서 쉽게 해결할 수 있다고 한다.

 

"0x90"은 nop로 아무것도 안 하고 다음 명령어로 넘어가기 때문에 eip를 정확하게 맞춰주지 않아도 nop 안으로만 맞추면 셸 코드가 정상 작동하게 된다고 한다.

 

 

댓글