• 티스토리 홈
  • 프로필사진
    SiJun-Park
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
SiJun-Park
  • 프로필사진
    SiJun-Park
    • 분류 전체보기 (121)
      • Unity (80)
        • RPG Project (39)
        • FPS Project (30)
        • 기타 - 개발 (11)
      • 개발 (35)
        • 임베디드 소프트웨어 (7)
        • 컴파일러 (6)
        • 기계학습 (8)
        • 보안 (8)
        • 그래픽스 (2)
        • 그 외 (4)
      • 코딩문제 (5)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
        등록된 공지가 없습니다.
      # Home
      # 공지사항
      #
      # 태그
      # 검색결과
      # 방명록
      • Format String Bug
        2024년 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가 출력이 됩니다!

         

         

        '개발 > 보안' 카테고리의 다른 글

        OPTEE  (0) 2024.10.03
        BOF  (0) 2024.10.02
        Set-UID  (0) 2024.10.02
        Port Scan  (0) 2024.10.02
        Snort  (0) 2024.10.02
        다음글
        다음 글이 없습니다.
        이전글
        이전 글이 없습니다.
        댓글
      조회된 결과가 없습니다.
      스킨 업데이트 안내
      현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
      ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
      목차
      표시할 목차가 없습니다.
        • 안녕하세요
        • 감사해요
        • 잘있어요

        티스토리툴바