포멧 스트링 버그, Format String Bug
저번 포스팅에서 포멧 스트링 버그를 이용해서 메모리 릭을 하는 방법과 %n 포멧스트링을 어떻게 사용하는지 까지 설명하였다. 이번 포스팅에서는 직접 원하는 메모리에 %n 포멧스트링을 이용하여 원하는 값을 넣어보자.
먼저 확인할 코드!
메모리가 제대로 조작되는지 확인하기 위해 저번 포스팅의 코드에서 dumpcode만 추가 하였다.
dumpcode함수를 사용하기 위해서는 dumpcode.h파일이 있어야한다.
위의 포스팅으로 들어가서 코드를 복사한뒤 dumpcode.h파일을 만들어 붙여넣기 하면 된다.
버퍼부터 시작하여 100bytes 만큼의 메모리를 출력해준다. 이제 %n을 이용해서 아무 메모리에나 값을 써보자.
0xffffd6d8에 값을 써보기로 한다.
0xffffd6d8에 출력된 문자열의 길이인 0xe값이 들어갔다 성공이다! 근데 메모리를 변조하여 공부하려면 최소한 4bytes는 변조를 해야하는데 한번에 0~65535, 0x00~0xFF, 2byte 밖에 수정하지 못한다. 그래서 두번에 나누어 주소값을 써줘야 한다.
처음번에 0xffffd6d8에 값을 쓰고 두번째에는 0xffffd6da에 나머지 값을 써야한다. exploit을 할때는 당연히 엔디언을 생각해서 제대로된 값이 들어가도록 해야한다.
지금은 테스트이고 귀찮으니까 그냥 0xffffd6d8에 0xffffffff 값을 써넣어 보자.
엄청난 공백이 생기고 0xffffd6d8에 0xffffffff의 값이 써진것을 확인할 수 있다.
python -c 'print "\xd8\xd6\xff\xffAAAA\xda\xd6\xff\xff%65521x%x%n%65536x%n"' | ./fsb1
쉘코드를 보면 \xd8\xd6\xff\xff와 뒤쪽의 첫번째 %n과 매치가 된다. 여기에 들어가는 값을 조정하기 위해 %n앞에 %x%x 이 두개를 이용해 메모리에 쓸 값을 맞출 수 있다. 그리고 다음 2bytes를 덮기 위해서는 \xda\xd6\xff\xff을 %n과 매치시켜주면 되지만 바로 매치시키면 메모리에 쓸 데이터 조절을 할수가 없다. 그래서 임의로 의미없는 데이터인 AAAA를 %x로 출력해주고 이 부분에서 뒷부분 2bytes에 들어갈 값을 조절할 수 있게 된다.
이제 fsb가 발생하면 원하는 주소의 메모리값을 바꿀수 있게 되었다. 이를 이용해 ret, got, dtor등을 조작해 exploit에 성공할 수 있다.
코드 4번쨰줄에 main이 아니라 void main() 맞죠?
답글삭제