본문 바로가기

wargame/LOB

[LOB]03 cobolt

cobolt

다음 문제를 풀어보자.


디렉터리를 살펴보자. tmp 디렉터리를 만들고 goblin.c를 복사해서 내가 디버깅할 수 있는 goblin을 만들었다.
(여기서 실수를 했음)



goblin.c를 살펴보자.

strcpy가 gets로 변환한 걸 제외하면 동일하다.

gets는 strcpy와 달리 잘 모르니까 gets가 메모리에 어떻게 적용되는지 살펴보자.


A로 buffer의 16바이트를 채우려고 했다.(실제로는 환경변수를 채웠기 때문에 착각임)


어셈블리 코드를 보면 *main+18 현재,
sfp - (현재 ebp 위치) - buf(16바이트) - (현재 esp 위치)임을 예상할 수 있다.

$esp에서 매우 떨어진 위치에 A가 들어간 걸 보면 알 수 있듯이 "A" 16개는 main함수의 범위 위, 환경변수 영역에 존재한다.

이 때 strcpy와 차별되는 gets의 특징을 깨달았다.
strcpy는 argv에 저장한 후에 buf에 저장하고, gets는 표준입력에서 페이로드를 받아 buf에 저장한다.

표준입력에서 주면 되는 점을 제외하면 나머지는 동일하므로 cobolt 문제처럼 해결하되
goblin를 실행할 때 파라미터로 페이로드를 주지 말고 표준입력으로 주도록 해보자.

ㄴ (쉘코드 값을 가진 환경변수 생성)


ㄴ (환경변수의 주소를 출력하는 함수 생성)

환경변수의 주소를 알아보자.


goblin을 실행하되 버퍼와 sfp를 nop으로 채우고 ret에 환경변수의 주소를 buf에 넣어 쉘코드가 실행되게 했다.

결과는 실패.
No such file or directory 관련해서 검색해보니 dos의 CRLF, unix의 LF 변환문제 때문에 많이 발생한다고 한다.
이 경우와는 전혀 달라서 다른 방향으로 찾아봤다. 명확히 나온 게 없어서 다른 방향으로 살펴보다 문제점을 깨달았다.

여러가지 실수를 저질렀다.
첫번째는 `(역따옴표)를 쓴 것. 명령어 대치할 필요가 없으므로 쓰지 않아도 된다.

두번째는 처음에 tmp를 만들고 gremlin.c를 복사할 때 home directory의 gremlin을 컴파일했다.
goblin.c의 권한으로 변환되었기 때문에 root 권한을 탈취할 수 없었다.

(ㄴ goblin.c와 권한이 동일하다)

결국 초기화했다. 하는 김에 폰트도 바꿨다.

하지만 여전히 fail.

검색해보니 cat을 써야한다고 한다.


끝.

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

[LOB]02 COBOLT  (0) 2019.11.20
[LOB]01 GREMLIN  (0) 2019.11.18