Search
Duplicate
🥕

Attacklab 풀이(CS:APP)

간단소개
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
C
Scrap
태그
9 more properties

Summary

CMU 15-213: Introduction to Computer Systems
Attack Lab
BOF 공격을 해보라는 문제임

Phase 1

Phase 1~3은 ASLR이 적용되어있지 않고 stack이 executable함.
BOF로 retaddr을 원하는 목적지 함수로 덮어쓰면 끝.

Phase 2

Touch2 함수를 호출하는데
인자로 쿠키값을 넣어줘야함.
스택에 rdi를 쿠키값으로 설정하는 코드를 넣은다음
(mov rdi cookie, push touch2, ret)
Retaddr을 rsp 주소로 변조.(aslr 안켜져있어 가능)
스택에 작성한 코드를 실행 후 touch2 실행.

Phase 3

이번엔 인자로 구조체에 대한 포인터를 넣어줘야 함.
운이 안 좋게 스택이 모자람.
HexMatch 함수에서 스택에 레지스터 3개를 푸시하는걸 발견.(rbx, rbp, r12)
rbp, r12에 원하는 구조체값을 바이트로 대입 후
해당 레지스터가 푸시될 주소를 인자로 호출. 해결.
인자설정과 호출 과정은 phase2와 같음.

Phase 4

이제 Phase 4부터는 ASLR이 활성화되고 stack이 executable 하지 않음.
이제 스택에 코드를 직접 쓰는것이 불가능하니 가젯을 수집하여 사용해야함.
Phase4는 바뀐 조건에서 phase2 문제를 그대로 다시 풀어야 함.
Pop rax, mov rdi rax 를 사용할 수 있는 가젯 발견.
Retaddr을 순서대로 가젯1, 쿠키값, 가젯2, touch2의 주소로 덮어 씀.
해결.

Phase 5

보너스 문제임. phase 3문제를 풀 것. 풀지 않아도 95점. 풀면 5점 줌.
필요한 가젯이 많이 필요함.
ASLR이 켜져 있으므로 구조체의 위치를 특정하려면 mov rax rsp, 그리고 add rsp, offset이 필요함.
시간을 좀 들여 가젯을 6개 가량 찾음.
덧셈 연산은 add_xy 가젯 사용.
가젯과 pop될 피연산자, 구조체를 조합하여 총 12 * 8byte를 retaddr위치에 덮어씌워 해결.