본문 바로가기
Security/[게임] CTF 풀이

[exploit] Sharif CTF 2013 exploiting 200

by blackcon 2014. 2. 27.

포맷스트링버그 취약점이 있는 프로그램입니다.


readfile로 flag.txt를 읽고 strncpy로 저장하는 것을 볼 수있습니다. 저장된 공간은 0x804b0c0 바이너리에 저장된 것을 볼수 있습니다.




클라이언트측에서 %p %p %p를 입력하니 스택에 쌓여있던 주소가 출력되었습니다. 앞에서 출력 형식을 지정해주면 그 뒤에있는 인자들이 1대1 대응으로 해당 값이 출력됩니다. 포맷스트링에서 형식 인자 사이에 [숫자$]을 입력하면 출력될 인자에서부터 숫자만큼 떨어져있는 값이 출력됩니다.

 이게 포맷스트링버그인데, 포맷스트링 버그를 이용하여 바이너리에 박혀있는 flag.txt를 읽어오면 됩니다.

알고 있어야 할 정보는 flag.txt가 저장된 위치와, 출력하려는 스택의 위치인데, flag.txt저장위치는 위에서 봤듯이 0x804b0c0 이고 출력하려는 스택 위치 계산은 아래와 같이 하면 됩니다.



 

 ([값이 있는 BUF] - [현재 스택위치]) / 4, 위의 이미지를 예로 들면 ([0xbffff52c] - [0xbffff104])/4 = 266이 됩니다. 즉, 출력할 값은 266번째 뒤에 있다고 보시면 되고 최종 payload는 다음과 같습니다. 호출하고자하는 주소를 먼저 buf에 입력하고 %265$s로 다시한번 buf를 출력하면 끝!!!