본문 바로가기

wargame/LOB

[LOB]01 GREMLIN

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]argcretsfp(현재 %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절의 내용을 수행한다.

  1. 위의 코드는 AT&T 방식으로 작성되어 인터넷에서 흔히 볼 수 있는 intel 방식과는 반대로 작성되었다. [본문으로]

'wargame > LOB' 카테고리의 다른 글

[LOB]03 cobolt  (0) 2019.11.20
[LOB]02 COBOLT  (0) 2019.11.20