id : darkknight
password : new attacker
로그인 후 bugbear.c 코드를 확인해보면 다음과 같다.
이번 문제는 RTL을 이용한 문제이다.
RTL(Return To Library)란 공유 라이브러리 영역에 있는 함수의 주소를 이용해서 바이너리에 존재하지 않는 함수를 사용할 수 있도록 하는 기법이다.
바이너리에 존재하지 않는 함수에는 system 함수, execl 함수 등이 있다.
여기서 system 함수를 실행하여 쉘을 획득할 수 있도록 하면 된다.
system 함수는 운영체제의 명령어나 외부의 각종 실행 파일을 실행하기 위해서 사용한다.
쉘을 실행시키려면 /bin/sh를 호출해야 하기 때문에 system 함수를 실행시켜야 한다.
쉘코드 실행이 아닌 직접 공유 라이브러리의 함수를 호출해서 쉘코드가 필요 없다.
ls -al /bin/sh를 해보면 /bin/sh가 bash를 링크하고 있는 것을 알 수 있다.
그래서 /bin/sh를 호출해야 한다.
system 함수의 주소와 /bin/sh의 주소를 알아내면 될 것 같다.
일단 bash2로 바꿔주고 길이가 같은 이름으로 복사한 후 gdb로 분석해보았다.
strcpy 다음 주소인 main+98에 브레이크포인트를 걸고 실행시켰다.
system 함수나 exit 함수의 주소는 위와 같이 알아낼 수 있지만
/bin/sh의 주소는 따로 코드를 작성해서 알아내야 한다.
shell에 system 함수의 주소를 넣고 while문으로 /bin/sh 와 일치하는 주소를 찾아내서 출력하는 코드이다.
NOP(40) + SFP(4) + system 함수 주소(4) + dummy(4) + /bin/sh 주소(4)
입력해주면 쉘이 실행된다.
또한 비밀번호를 알아낼 수 있다.
SFP와 dummy는 NOP으로 채워주었다.
dummy를 채워야 하는 이유는 system 함수나 execl 함수는 ebp+8 위치(main 함수에서는 argc의 위치)의 인자를 인식하기 때문에 dummy를 4byte 채워줘서 /bin/sh를 불러올 수 있다.
system 함수의 인자로 /bin/sh 의 주소가 전달되어 /bin/sh가 실행되게 해주는 것이다.
system 함수의 주소 다음에 리턴어드레스를 쓰레기값으로 채우기 위해서라고 볼 수 있다.
'Wargame > Lord Of Buffer overflow' 카테고리의 다른 글
[LOB] 15번 giant -> assassin (0) | 2017.12.01 |
---|---|
[LOB] 11번 skeleton -> golem (0) | 2017.11.19 |
[LOB] 10번 vampire -> skeleton (0) | 2017.11.17 |
[LOB] 9번 troll -> vampire (0) | 2017.11.16 |
[LOB] 8번 orge -> troll (0) | 2017.11.16 |