본문 바로가기

[Wargame Write-up]/Lord of Buffer Overflow

[LoB RedHat 6.2] LEVEL 13: darkknight -> bugbear

LEVEL 13: RTL1

 

 

ret 자리에 0xbf로 시작하는 주소 즉, 스택의 주소를 넣을 수 없다.

 

그래서 RTL이라는 키워드를 주었다.

 

RTL은 Return To Libc의 준말로, 스택에서의 코드 실행 방지 기술(NX)을 우회하는 기법이다.

 

공유 라이브러리의 함수들을 이용해 공격하는 방법이다. 주로 system이나 exec** 계열 함수 등을 이용한다.

 

 

 

system 함수의 주소를 알아보자.

 

 

 

0x40058ae0에 위치하고 있다.

 

 

 

환경변수로 /bin/sh를 주고, 주소를 찾아도 되겠지만, system 함수가 사실 내부에서 /bin/sh을 이용하기 때문에,

 

공유 라이브러리 영역에 있을 수 밖에 없다.

 

그래서 아래와 같이 "/bin/sh"의 주소를 찾기 위한 코드를 작성한다.

 

0x400fbff9에 있나 보다.

 

 

 

buffer+sfp의 44바이트는 dummy, ret을 system 함수 주소,

 

그 다음 system의 ret 4바이트를 dummy, 그 다음은 "/bin/sh"의 주소로

 

payload를 작성하면 쉘을 얻을 수 있다.

 

하지만 종료 시, system 함수 주소와 "/bin/sh" 주소 사이에 들어간 dummy 값을 실행할 수 없어, 세그폴트가 발생한다.

 

 

 

깔끔한 마무리를 위해 exit 함수의 주소를 찾아 삽입해주자.

 

exit 함수는 0x400391e0에 있다고 확인된다.

 

 

 

A 4개 대신 저 주소를 넣어주면, 깔끔하게 종료된다.