딩굴댕굴

[Hackerschool FTZ] level 20 - Fomat String Buffer Overflow

by jennysgap

BOX


[Hackerschool FTZ] level 20 - Fomat String Buffer Overflow


Password: we are just regular guys


setreuid() 함수 호출뒤에 call 함수를 호출하는데, 이 함수의 호출을 임의의 쉘코드 주소로 변경하는 것이 이 문제의 핵심이다.

즉, 임의의 쉘코드 등록과 실행 방법을 이해하고 있는지에 관한 문제이다

printf(bleh); 포멧스트링 취약점이 있는 코드


printf는 다양한 포맷문자형이 있다.

포맷을 정하지 않고 그냥 문자를 출력할 때 생기는 문제가 포맷스트링 취약점이다.



※ 포맷문자열은 다음 주소글짜를 표기하는데, 스택의 현재위치($esp)에서 포맷(%x)을 만나게 되면 무조건 4만큼 이동하게 된다.



4byte씩 3번 총 12byte를 넘어갔더니 버퍼의 시작지점이라는 것을 알게 되었다.

※ 이동을 통해서 버퍼의 첫 위치를 알아내는 것이 매우 중요하다.






AAAA낮은주소BBBB높은주소%8x%8x%8x  | %64128c%n%50519c%n

                                                                      버퍼의시작점(현재esp의 위치: AAAA)

64128: 앞에 AAAA낮은주소BBBB높은주소(40)을 찍고 64128개의 문자를 찍어라 

%c: 4byte 이동 (현재위치: 낮은주소)

%n: 지금까지 출력된 모든 문자 숫자 (40+64128=64168 값을 낮은주소가 가리키고 있는 주소에 쓰라!

50519: 앞에 출력된 값에다가 50519개의 문자를 더해 찍어라

%c: 4byte 이동 (현재위치: 높은주소)

%n: 지금까지 출력된 모든 문자 40+64128+50519 값을 높은주소가 가리키고 있는 주소에 쓰라!


RET처럼 점핑 시킬 곳이 어딘가???


덮어쓸 주소 심볼 삭제 (.dtors값으로 컴파일시 제거)


# nm 명령어는 오브젝트 파일, 라이브러리, 프로그램에 쓰인 함수가 어떤 것인지 확인할 때 유용하다.

여기서 심볼은 열려 있는 라이브러리에서 실제로 호출하는 함수의 이름이다.

참고 네이버 백과사전 



# objdump -h attackme




level11 Password: what!@#$?



※ 문제 푸는 순서와 개념을 정확히 이해하고 공식을 외워서 문제를 풀어도 된다.








반응형

블로그의 정보

jennysgap

jennysgap

활동하기