ipwn

[LOB(Lord Of Buffer overflow)] darkknight -> bugbear 본문

Write up/LOB

[LOB(Lord Of Buffer overflow)] darkknight -> bugbear

ipwn 2018. 1. 19. 00:53

이번 단계는 darkknight 단계이다.


바로 copy file을 만들고 파일을 확인해보겠다.


bugbear파일과 bugbear.c 코드가 있다.


바로 코드를 읽어보겠다.



코드를 보니 이번엔 예전과 다르게 return address의 마지막 byte의 부분이 \xbf가 아니어야한다.


그리고 힌트 부분을 보니 RTL을 사용하는 문제인 것 같다.


RTL(Return To Libc)는 Return address를 library function으로 덮어주어서 함수를 실행시키는 기법이다.


이 기법을 설명하기 이전에 일단 copy을 통해서 system함수의 주소를 얻어오자.



일단 system함수의 주소는 0x40058ae0이다.


만약 return address가 system 함수로 덮였다고 가정하면 system 함수를 실행시킬 것이다.


하지만 system함수는 모두가 알고있듯이 인자가 필요한 함수이다.


그래서 return address를 덮어줄 때 system함수의 주소로 덮어주고 인자값을 stack에 넣어주어야 한다.


그런데 인자값을 넣어줄 때는 system함수로 return address덮어준 뒤 dummy값 4개를 넣어주고 그 뒤에


전달할 인자값의 주소를 넣어주어야 한다.


예를 들어 /bin/sh를 실행시키고 싶다면, &system + AAAA+ &"/bin/sh"의 형태로 넣어줘야 한다는 것이다.


하지만 저 AAAA의 공간은 그냥 dummy값의 의미가 아니라 system함수가 종료되고 return될 다음 위치를 의미한다.


&system + &system + &"/bin/ls" + &"/bin/sh"의 값을 넘겨준다면 /bin/ls 명령을 실행시키고 shell을 띄울 것이다.


아무튼 이제 system함수로 return address를 덮는 것은 쉽다.


하지만 &"/bin/sh"를 얻는 것이 문제이다. 하지만(aslr이 걸려있지 않은 상태에서) 간단히 &"/bin/sh" 구하는 법이 있다.


직접 코드를 작성해서 &"/bin/sh"를 출력하는 것이다.



system 함수에는 "/bin/sh"의 값을 받았을 때의 실행할 결과가 들어있을 것이기 때문에 


system함수 내부에 "/bin/sh"의 값이 존재할 것이다.


아무튼 코드는 이렇게 구성이 되는데, 설명을 하자면 우선 shell변수에 system함수의 주소를 넣어준다.


while문을 돌면서 memcmp를 하는데 shell주소에 들어있는 값과, "/bin/sh"의 값이 같을 경우 0을 반환하고,


그 외의 경우에는 0보다 크거나 작은 값을 반환한다. 즉 같지 않을 경우 shell의 값을 점점 증가시켜서 


system 함수 내부에 존재할 "/bin/sh"의 주솟값을 shell변수에 저장한다


그리고 결과적으로는 shell의 값을 출력하고 shell의 위치에 존재하는 값을 string형태로 출력한다.


이 코드를 한 번 gcc로 컴파일 해보겠다.


컴파일 하고 실행했더니 /bin/sh의 주소가 출력됐고, shell변수 내부의 값이 /bin/sh라는 것을 출력을 해서 증명해준다.


이제 우리가 넘겨줄 payload가 명확해졌다.


먼저 dummy*44 + 0x40058ae0(&system) + dummy*4 + 0x400fbff9(&"/bin/sh")가 될 것이다.


한 번 제대로 shell이 가져와지는지 copy file에 payload를 넘겨주겠다.



성공적으로 shell이 가져와졌다.


아마 이 shell을 나가게 된다면 segmentation fault가 발생할 것이다. 


왜냐하면 system 함수가 종료되고 돌아갈 return address의 위치에 dummy*4의 값이 존재하기 때문이다.


아무튼 각설하고 제대로 shell이 가져와졌으니 원본 file에 payload를 넘겨주겠다.



성공적으로 shell을 가져왔다.


bugbear으로 넘어가는 password는 new divide이다.








Comments