Lord of the BufferOverflow Fedora Core3

[ Level2_Iron_golem -> Dark_eyes ]


Level2 시작합니다.



Level1과 마찬가지로 바로 힌트를 주네요. 주어진 힌트는 RET Sleding입니다. RET Sleding이란 말 그대로 RET operation을 연속적으로 사용해 썰매 타듯이 이동하는 기법을 말합니다. NOP Sleding과 약간 비슷하다고 보면 될 것 같습니다.

이 RET Sleding을 어떤식으로 이용하면 좋을 지 gdb로 스택을 분석해보도록 하죠. 일단 코드 영역에 있는 RET 가젯을 찾아보도록 하겠습니다.



main함수를 disassemble 한 상태입니다. 코드 에필로그 부분에 RET가젯이 존재하는 것을 확인 할 수 있습니다. 꼭 main함수의 ret 가젯이 아닌, objdump 등을 통해 다른 ret 가젯을 찾아 이용해도 무방합니다.


- RET 주소 : 0x080484b9


이제 스택을 살펴보도록 하죠. 함수 에필로그가 진행되기 직전인 *main+176에 breakpoint를 잡고 분석해보겠습니다.



esp 부분부터 차근차근 살펴보면, esp+32 부분부터 'A'가 연속적으로 나타나는 것을 확인 할 수 있습니다. esp+32 부분이 buffer 변수 부분입니다. (main 함수를 disassemble 했을 때 나타나는 buffer의 주소인 ebp-264의 주소와도 동일한 위치입니다.)

0xfefe4afc 부분이 SFP입니다. 조금 아래쪽을 살펴 보니 NULL바이트 직전에 0x83eff4가 있는 것을 확인 할 수 있습니다. 여러 번 실행 해 본 결과, 해당 주소는 바뀌지 않는 걸 보니 이 주소를 이용하여 RTL로 풀이하면 될 것 같습니다.

그리고 0xfefe4b10부터 return address까지의 거리는 20byte입니다. RTL 시 execl의 return address를 제외한 16byte, 그리고 execl 함수를 넣을 4byte를 제외하면 총 12byte가 남습니다. 이 12byte는 payload를 작성 할 때 다시 확인 하도록 하겠습니다.


- return address까지의 거리 : 12byte



0x83eff4 안에 있는 주소를 확인하면 0x83ed3c가 있습니다. 이 이름을 실행시키고자 하는 프로그램의 이름으로 심볼릭 링크를 걸어 execl함수로 RTL을 하면 될것같습니다.


- 프로그램 명 : 0x83ed3c


그럼 필요한 준비는 모두 끝났습니다. execl 함수의 주소를 알아 낸 후 RET Sleding을 이용하면 깔끔하게 shell을 획득 할 수 있을 것입니다.



- execl의 주소 : 0x7a5720


다음으로, payload를 작성해보도록 하겠습니다.


위 그림이 현재 스택 구조이고, 아래 그림이 우리가 작성 할 payload 양식입니다.

buffer과 dummy, SFP 모두 A로 채워주고, return address에는 우리가 이전에 찾은 ret gadget의 주소를 넣어줍니다. 여기서 ret gadget을 총 3개 넣어주는 이유는 위에서 스택을 살펴 볼 때 구했던 return address와 path 사이의 거리가 총 20byte, 즉 execl과 execl의 return address를 제외하면 총 12byte이기때문입니다. ret gadget 이후에는 execl의 주소를 넣어주고, 다음 4바이트는 return address, 다음 4byte는 arg1이지만 이미 이 값들은 정해져 있기 때문에 신경쓰지 않아도 됩니다.(어차피 execl 함수가 0x00으로 끝나기 때문에 다음 8바이트가 의미 없긴 마찬가지입니다.)



gdb로 먼저 payload를 실행 해 본 결과입니다. execl의 주소인 0x7a5720에 포함되어 있는 0x20은 ASCII문자로 공백에 해당하므로 그대로 전송 할 경우 제대로 된 값이 전달되지 않습니다. 따라서 인자를 전달 할 때 double quotation으로 한번 더 묶어주었습니다.

스택을 확인 해 보면, execl 함수와 0x83eff4 모두 정상적으로 남아 있는 것을 확인 할 수 있습니다.

그럼 이제 execl로 실행 할 프로그램을 짜야 할 차례입니다. 이전 Level1에서 사용했던 프로그램과 동일합니다.



execl로 쉘을 띄워주는 프로그램입니다.



이 프로그램을 우리가 이전에 구했던 파일명으로 심볼릭링크를 걸어주고



payload를 넣어 실행 해 주면 쉘이 정상적으로 띄워집니다.



+ Recent posts