- Format String Bug2024년 10월 03일
- SiJun-Park
- 작성자
- 2024.10.03.:12
1) 포맷 스트링 및 스택
-정상적으로 printf(“포맷스트링”, 변수명);로 출력했을 때의 스택 구조 분석
task1.c
*sudo syctl -w kernel.randomize_va_space=0 => ASLR 해제
-컴파일 된 프로그램 task1을 디버깅 하여 printf가 호출되기 직전의 스택 구조 분석
분석을 해보면
esp = format address
esp + 4 = int a의 값 10(0xa)
esp + 8 : int b의 값 20(0x14)
esp + 12 : int n의 주소 0xbfffed44
2)Format String Bug
-포맷 스트링 버그가 발생할 수 있는 취약한 프로그램을 만들고 문제점 분석
task2.c
컴파일
가장 처음 input을 AAAA를 주니 AAAA가 정상적으로 output이 되는 것이 확인이 된다.
그러면 %x %x %x를 넣는다면? 스택의 값이 나온다!
한번 쭉 출력을 해본다. 그러면 의미있는 주소들이 보이기 시작한다
+58에 breakpoint를 걸고 확인을 해본 결과 취약점이 발생한 것을 확인이 가능 합니다.
그 이유는 입력으로 받은 것이 “%x”를 받는다면 printf(“%x”)가 되어 버립니다 .
그러면 %x를 출력할 변수가 지정을 하지 않아. 스택의 값을 읽어오게 됩니다.
3)Format String & %n
-포맷 파라미터 중 데이터의 쓰기가 가능한 %n에 대해 알아본다
- 임의의 정수 값 10이 num에 들어가도록!
task3.c
컴파일
이렇게 나온 이유는 %n은 지금까지 출력된 문자열의 길이입니다.
그 길이를 저장을 할 수 있습니다.
즉 %n 전 까지 출력된 문자의 개수를 지정된 변수에 넣을 수 있습니다.
지금 문자열을 불러오기 전까지는 “buf=”로 길이가 4입니다.
이제 여기서 “abcdef”라는 6개의 문자를 넣어주면 총합 10이 되어 num변수에 10이 저장되게 됩니다.
4)ExpLoit Format String Bug
-포맷 스트링 버그와 %n을 이용하여 원하는 주소에 위치한 변수를 임의의 값으로 조작
task4.c
목표는 Success라는 문자열을 출력하는 것이다.
가장 먼저 전역변수 int num의 주소를 찾아준다. 0x0804a028이라는 것을 확인을 하였다.
스택 중 사용자의 입력 값이 저장이 되는 버퍼를 찾기 위해 A*4를 넣어 위치를 찾아 냅니다.
처음에 도출해낸 int num 주소를 적어준다. 그러면 %x 대신 %n을 쓰면 값을 변경이 가능해진다.
즉 현재 나온 printf를 보면 %n을 7번째 %x 대신에 넣는다면 in num의 값을 변경을 할 수 있다!
한번 넣어보니 A 4개 = 4byte + 주소 4byte + %x 6개로 출력되는 문자열 길이 = 41byte
=> 총 49byte가 num의 값으로 들어감.
그래서 출력으로 num : 49가 출력이 되었습니다.
하지만 우리의 목표는 num이 7777이 되어 success문자열을 출력을 해야합니다.
그러면 목표값과 차이를 계산을 해줍니다.
A * 4개 4byte 와 int num의 주소 4byte와 %x 5개 = 41.
목표는 7777이니깐 7777- 41 = 7736.
$ (python –c ‘print “A”*4+“\x28\xa0\x04\x08”+“%x”*5+“%7736x”+“%n”’) | task4
=> 입력을 합니다.
그러면 num이 1111에서 7777이 되어 success가 출력이 됩니다!
다음글이전글이전 글이 없습니다.댓글