gremlin
+) sfp, ebp 개념 혼동하여 작성함. 나중에 수정할 수도 있고
기본적인 설정을 마치고 문제를 풀어보기로 했다.
login : gate / password : gate로 접속할 수 있다.
접속하면 gremlin.c와 그 실행파일이 있다.
gremlin.c의 내용을 확인할 수 있다.
이제 한 번 문제를 해결해보자.
gremlin을 실행시키면 권한이 허용되지 않았다는 말과 함께 실행되지 않는다.
root 권한으로 실행하면 문제가 없다고 한다(출처)
권한을 다시 설정할 필요가 있다.
tmp 디렉터리를 만들어 gremlin을 새로 생성했다. 이제 파일은 내 소유이므로 실행가능하다.
strcpy 실행 후를 bp(break point)를 잡고 260개(buf 256+sfp 4)의 "A"를 매개변수로 주어 실행해보자.
bp에 걸릴 때(strcpy명령어가 끝난 후), 스택은 이런 식으로 구성된다.(left : high value, right : low value)
...(환경변수) | argv[1] | argv[0] | argv[0] | argc | ret | sfp | (현재 %ebp 위치) | buffer(256byte) | (현재 %esp 위치) |
strcpy는 매개변수로 받은 값을 buffer에 저장하는데 256byte를 초과할 경우 위의 메모리(sfp, ret 등)을 차례로 침범한다.
메모리에 "A"가 채워진 것을 확인할 수 있다.
쉘코드를 삽입한다. nop을 앞뒤로 채워 정확한 ret 값을 몰라도 쉘코드를 실행할 수 있도록 한다. nop과 쉘코드를 합쳐 260바이트를 만들고 뒤에 ret 값으로 적당한 값("A"로 채워진 메모리의 주소)을 넣어준다.
확인해보면 쉘을 획득했음을 확인할 수 있다.
비밀번호는 다음과 같음을 알 수 있다.
끝
아직 해결 못한 문제
- 어셈블리 코드에서 cmpl $0x1, 0x8(%ebp) 인 이유
A. cmp1는 (%ebp-0x8) - $0x1을 비교한다.(intel 방식) 왼쪽이 더 크면(즉 argc > 1이면) jg(jump greate)가 수행되어 if절의 내용을 건너뛴다.
하지만 argc<=1 즉 argc<2이면 jp가 수행되지 않아 if절의 내용을 수행한다.
- 위의 코드는 AT&T 방식으로 작성되어 인터넷에서 흔히 볼 수 있는 intel 방식과는 반대로 작성되었다. [본문으로]
'wargame > LOB' 카테고리의 다른 글
[LOB]03 cobolt (0) | 2019.11.20 |
---|---|
[LOB]02 COBOLT (0) | 2019.11.20 |