스터디 그룹/ProjectH4C

ProjectH4C 3개월 1주차 과제(HackCTF - Basic FSB)

우선 이번 문제의 이름은 Basic FSB이다. FSB가 무엇인지 먼저 공부를 해보자.

먼저 FSB는 Format String Bug의 줄임말이다.

 

포맷스트링 버그는 이전에 공부를 해본적이 있다. (엄청 예전에 ....)

 

우선 문제를 풀면서 복습을 해보자.

 


📖 1) 문제 파악

이렇게 기본적으로 aa를 넣는다면 aa가 출력이 되지만, 서식문자를 집어넣는다면, 그에 해당하는 값을 출력하게 된다.

 

좀 더 자세히 알기 위해 gdb와 IDA를 통해 까보도록 하자.

 

어셈블리 코드는 꽤 간단하다. vuln함수를 좀 더 알아보자.

그렇군.... ??

 

IDA로도 열어보자.

먼저, main 함수이다. 마찬가지로 vuln 함수를 좀 더 까보자.

흠....ㅁ..ㅁ.ㅁ.ㅁ.ㅁ.ㅁ,ㅁ,ㅁ,ㅁ,ㅁ,ㅁ,ㅁ,ㅁ,ㅁ,ㅁ,ㅁ,ㅁ,ㅁ,ㅁ,ㅁ,ㅁ,ㅁ,,

flag() 함수를 실행시킬 방법을 찾아보아야 하겠다. 


📖 2) 문제 분석

뭘 어떻게 접근해야 할까. fgets에서 포맷 스트링을 넘겨주면 그걸 통째로 format에 넣어주게 된다.

 

개인적으로 printf(format) 부분을 flag()로 바꿀 수만 있으면 된다고 생각한다. 물론 아닐 수도 있겠지만. ..

 

우선 Got Overwrite에 대하여 알 필요가 있다. ( 이 부분은 따로 공부해보도록 하자. )

간단하게 설명하자면, plt는 got을 가리킨다. 그리고 got에는 실제 함수 주소가 들어있다.

이 때 got을 원하는 함수의 주소로 변경할 수만 있다면, 공격하는데 성공한다.

 

우선 해당 프로그램을 가지고 좀 더 놀아보도록 하자.

 

즉 처음에 넣은 값이 뒤에서 참조된다? 정도로 생각해주면 될 것 같다.

조금만 더 가지고 놀아보자...

이런 발상이 된 것이다. 그래서 이를 이용한 공격 중 하나가 Format String Bug 인 것이고, 문제 제목인 것이다.

 

자, 그럼 다시 0x61616161에 어떻게 우리가 원하는 값을 넣을 수 있을까.

바로 %n 이라는 포맷을 이용하는것이다.

 

이런 과정을 좀 더 살펴보자.

 

먼저 %n은 바이트를 다 계산하고, 출력 포맷이라고 생각했던 곳에 주소를 집어넣게 된다.(0x61616161에 ...)

 

만약 이렇게 입력을 하였다면, %n 이 뜨기 전 까지는 4바이트 + 공백 + 4바이트 +공백이 나오게 된다.

즉, 10바이트가 계산되고, 이것은 %n에 위치한 값인 0x61616161에 들어가게 된다.

 

그럼 바이트 수를 flag()함수의 주소만큼, %n이 오는 주소를 printf_got으로 설정해주면 되겠다.

먼저 flag함수는 0x080485b4 에 위치해있다. 10진수로 나타내면 134514100이다.

 

그리고, printf_got은 0x804a00c 이다.

 

이제, 페이로드를 작성해보자.


📖 3) 문제 풀이

먼저 억지로 집어넣어야 하는 바이트를 계산해야 한다.

134514096 만큼 넣어주어야 한다. ( flag위치를 10진수로 나타낸 134514100 - 4 )

이런 경우는 그냥 %134514096x 로 처리해주면 된다.

 

#printf_got = 804a00c = \x0C\xA0\x04\x08
#flag = 080485b4 #BYTE = 

from pwn import *

p = remote("ctf.j0n9hyun.xyz", 3002)

payload = "\x0C\xA0\x04\x08" + "%134514096x%n"

p.recvuntil("input : ")
p.sendline(payload)
p.interactive()

 

이렇게 파이썬 코드를 작성해주자.

 


📖 4) 문제 해결, 느낀 점

매우매우 재미있다 헤헤헤헤ㅔ헤