Henu
개발냥발
Henu
전체 방문자
오늘
어제
  • 분류 전체보기 (411)
    • DevOps (52)
      • Kubernetes (19)
      • Docker (14)
      • AWS (3)
      • Nginx (4)
      • Linux (4)
      • ArgoCD (1)
      • CN (2)
      • NATS (0)
      • Git (5)
    • Back-End (30)
      • Django (18)
      • Spring (5)
      • JPA (1)
      • MSA (5)
    • CS (87)
      • SystemSoftware (20)
      • OS (25)
      • Computer Architecture (16)
      • Network (23)
      • Database (2)
    • Lang (21)
      • Java (9)
      • Python (4)
      • C# (8)
    • Life (12)
    • 블록체인 (2)
    • Algorithm (204)
      • BOJ (160)
      • 프로그래머스 (19)
      • LeetCode (4)
      • SWEA (1)
      • 알고리즘 문제 해결 전략 (8)
      • DS, algorithms (7)
      • Checkio (5)
    • IT (2)

블로그 메뉴

  • GitHub
  • 글쓰기
  • 관리자

공지사항

  • Free!

인기 글

태그

  • 다이나믹 프로그래밍
  • Kubernetes
  • django
  • boj
  • docker
  • Network
  • 프로그래머스
  • 백트래킹
  • DFS
  • BFS

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Henu

개발냥발

Attack Lab Solution  Phase_1 ~ Phase_5
CS/SystemSoftware

Attack Lab Solution Phase_1 ~ Phase_5

2021. 5. 31. 04:05

<phase_1> - Code Injection Attacks : CTARGET

%rsp를 0x38 만큼 빼주는 것으로 보아 buffer의 크기는 0x38bytes임을 알 수 있습니다.

 

Phase1은 touch1을 호출만 하면 되므로 입력에 0x38bytes 만큼 dummy값을 준 후 touch1함수가 존재하는 주소인 40 18 c5 값을 리틀-엔디안 방식으로 입력해주었습니다.

Answer : 


<phase_2> - Code Injection Attacks : CTARGET

화질 왜이래

Touch2를 실행하고 %edi값과 Cookie값을 비교해서 같은 경우에 통과합니다.

Touch2함수를 실행하기 전에 %rdi 레지스터에 Cookie값을 넣어주고 Touch2 함수를 실행해야 합니다.

Buffer공간을 0x38만큼 할당 받은 후의 %rsp위치를 보니 0x5566bd58 입니다.

화질

위 그림과 같이 return address를 0x5566bd58로 설정해 주고, buffer의 첫 부분에 ‘%rdi에 cookie를 넣고 touch2 함수로 이동하는 코드’를 삽입해주면 됩니다.

 

위 코드를 objdump 해보면 아래와 같이 출력됩니다.

 

0x38 bytes 이후에 0x5566bd58 부분을 리틀-엔디안 방식으로 입력 해주었습니다.

Answer : 


<phase_3> - Code Injection Attacks : CTARGET

Phase_2와 달리 cookie값을 숫자로 바로 받는게 아닌 문자열로 받기 때문에 Cookie가 위치한 주소값을 %rdi에 입력해 주어야 합니다

Buffer Stack의 첫 주소가 0x5566bd58이고 buffer의 크기가 0x38이므로 return address가 위치한 첫 주소는 0x5566bd90 이 됩니다.

따라서 입력을 받을 때 %rdi에 Cookie주소를 넣고 touch3를 호출하는 코드를 삽입, return address의 첫 부분(0x5566bd90)에는 코드가 위치한 0x5566bd90를 삽입, return address의 다음 8bytes부분에 Cookie의 주소를 삽입합니다.

 cookie값을 아스키 코드를 이용해 문자열로 바꾸면 : 32 64 36 66 63 32 64 35

쿠키의 주소를 %rdi에 넣는 코드는 위와 같습니다.

 

Answer : 


<phase_4> - ROP level2 : RTARGET

Cookie 값을 가젯을 이용해 touch2의 인자인 %rdi로 옮겨야 합니다.

우선 Stack에 있는 cookie값을 %rax로 옮기기 위해 58명령이 있는 가젯을 찾았습니다.

Popq %rax 명령(58)의 위치는 40 1a c8 + 4 이므로 

0x38 만큼의 dummy값 이후에 401ac8 + 4,

Cookie값 을 순서대로 넣어줍니다. (cookie값을 %rax에 입력해 주는 작업입니다.)

 

이제 %rax -> %rdi 작업이 필요합니다.

따라서 48 89 c7 가젯을 찾아보면 

401aa6 + 2 부분에 존재함을 찾을 수 있었습니다.

이어서 401aa6 + 2값을 Stack에 넣어줍니다.

마지막으로 Touch2의 주소인 4018f1까지 Stack에 넣어서 Touch2가 호출되게하면 완료입니다.

Answer : 


<phase_5> - ROP level3 : RTARGET

가젯에서 사용할 수 있는 명령어를 다 찾아 보았습니다.

기계어 명령 수행 작업 주소
89 c2 %eax -> %edx <401b7b> + 0x3
89 d1 %edx -> %ecx <40a1e8> + 0x2
89 e0 %esp -> %eax <401b9c> + 0x3
48 89 e0 %rsp -> %rax <401b9c> + 0x2
89 c7 %eax -> %edi <401aa6> + 0x3
48 89 c7 %rax -> %rdi <401aa6> + 0x2
89 ce %ecx -> %esi <401b59> + 0x2
(add_xy) %rdi + %rsi = %rax <401adc>

 

%rdi에 cookie문자열의 주소를 넘겨주어야 하기 때문에

%rsp -> %rax -> %rdi 순서로 문자열의 주소를 넘겨주면 됨을 알 수 있습니다.

Cookie의 주소를 구하기 위해서 add_xy함수를 사용해 %rdi값(%rsp)과 %rsi값을 더해 %rdi로 다시 이동시킵니다.

이제 %rsi값을 구해야 합니다.

%rsp -> %rax로 넘어가는 순간의 %rsp값과 cookie주소와의 거리가 %rsi값이 되어야 합니다. 

따라서 %rsi 값에 0x20을 넣어주기 위해서 %eax -> %edx -> %edx -> %ecx -> %esi 순서로 이동시켜줄 수 밖에 없음을 가젯 현황을 통해 알 수 있습니다.

%eax에 0x20을 popq를 통해 넣어주고 위 순서대로 %esi 값까지 이동시켜줍니다.

 

마지막으로 (add_xy)%rdi + %rsi = %rax 값을 %rdi에 대입해 touch3로 넘겨주면 됩니다.

 

Answer : 

 

다들 화이팅! 

궁금한 사항 있으시면 질문해 주세요

'CS > SystemSoftware' 카테고리의 다른 글

SystemSoftware - Linking #2  (0) 2021.06.04
SystemSoftware - Linking #1  (0) 2021.06.03
SystemSoftware - Buffer OverFlow #2  (0) 2021.05.19
SystemSoftware - Buffer OverFlow #1  (0) 2021.05.19
Bomb Lab Solution Phase_1 ~ secret_phase  (1) 2021.05.10
    'CS/SystemSoftware' 카테고리의 다른 글
    • SystemSoftware - Linking #2
    • SystemSoftware - Linking #1
    • SystemSoftware - Buffer OverFlow #2
    • SystemSoftware - Buffer OverFlow #1

    티스토리툴바