본문 바로가기

Wargame/Lord Of Buffer overflow

[LOB] 13번 darkknight -> bugbear















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