<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 |