<LOB gate->gremlin>
gremlin파일에 setuid가 걸려있다.
저 주석이 힌트인 것 같은데, gremlin 파일을 사용하라는 것 같고, 간단한 BOF 문제라고 한다.
main함수를 보면 인자를 인자를 받는다. 만약 argc는 인자의 개수이므로 argc < 2이면, 즉 인자를 주지 않으면 “argv error”를 출력하고 exit한다. 그렇지 않으면 argv[1]을 buffer에 복사한다. 그리고 buffer에 복사된 것을 출력한다. 그리고 strcpy함수는 문자열 길이를 검사하지 않기 때문에 취약점을 가지고, 따라서 버퍼오버플로우 공격이 가능한 것이다.
★RTL(Return-into-libc) 기법 사용
-RET 주소에 공유 라이브러리 함수의 주소를 넣어서 쉘 코드 없이도 exploit을 할 수 있는 방법
-overflow 공격에 기반하여 버퍼를 overflow시켜서 return address를 조작해 실행의 흐름을 libc 영역으로 돌려서 원하는 libc 함수를 수행하게 하는 것
1. ret 전 채워야 할 NOP
grelin 파일을 복사해서 gremlin3 파일을 만든다.
gdb로 “disass main”해서 BOF가 발생하는 strcpy() 함수 다음 라인인 add 부분에 break를 건다.
r “python -c “print “”A””*256””으로 더미를 넣고,
x/2x $ebp러 주소를 출력해보면 buffer(256) + sfp(4) + ret(4)의 구조를 가지므로
buffer에 dummy 256개가 넣어진 후 sfp와 ret 주소가 출력된다. ret 주소는 0x400309cb임을 알 수 있다.
따라서 260byte의 NOP을 채워야 한다.
2. libc 함수인 system() 함수의 실행 후 address 찾기
일단 system 파일을 만들었다.
컴파일한다.
system() 함수가 실행되는 시점을 유의해야 한다. vall instruction은 다음 수행할 address인 return address를 스택에 PUSH한 후 해당 함수의 시작점으로 이동한다.
함수 프롤로그 후, system함수를 call한다. system함수의 호출 지점은 0x00482e8이지만
실행 시점에 공유 라이브러리를 로딩한 후의 system()함수의 시작점을 찾아야 하므로 break point를 잡아보자.
실행 후 system() 함수의 address: 0x40058ae0
3. “”/bin/sh””의 위치 찾기
system() 함수는 내부적으로 execve() 함수를 실행하는데, execve() 함수는 “”/bin/sh””를 통해 동작한다. 따라서 execve() 함수에는 “”/bin/sh””가 존재한다.
따라서 system() 함수의 시작주소로부터 “”/bin/sh””가 있는 거리를 shell++을 하면서 구한다.
int memcmp(void* src1, void* src2, size_t size);
src1: 비교할 첫 번째 주소, src2: 비교할 두 번째 주소, size: 비교할 크기
반환값(return): 같으면 0, src1 > src2이면 1, src1 < src2이면 -1을 반환
memcmp함수는 메모리 비교 함수인데, shell의 주소와 “”/bin/sh””의 주소(문자열 상수이기 때문에그것 자체가 주소를 의미)를 비교한다. 따라서 주소가 같으면 while문을 끝내고 shell을 출력한다.
“”/bin/sh””가 위치한 주소는 0x400fbff9이다.
4. payload 작성
RTL(return-into-libc)기법을 이용한다.
buffer(256) + SFP(4) + system() addr(0x40058ae0) + dummy(4)(원래는 system() 함수 호출된 후 실행할 주소, 즉 다음 실행할 명령 주소) + “”/bin/sh”” addr(0x400fbff9)
이 구성으로 작성하면 된다.
1에서처럼 buffer(256) + SFP(4)는 NOP으로 채운다.
주소는 little endian 방식으로 쓴다.
NOP으로 채울 때는 되지 않았는데 문자로 dummy를 채우니까 성공했다.
bash쉘이 떴고 my-pass 명령을 입력하자 다음 레벨의 패스워드를 얻을 수 있었다.
[LOB] level10: vampire -> skeleton (0) | 2019.05.01 |
---|---|
[LOB] level8: orge->troll (0) | 2019.04.28 |
[LOB] level3: cobolt -> goblin (0) | 2019.04.01 |
BOF(Buffer Overflow) 공격-고전적인 방법 (0) | 2019.03.29 |
[LOB] gremlin -> cobolt (0) | 2019.03.28 |