mips에서도 bof가 발생할 경우 rop가 가능하다. 하지만 x64 rop와 큰 차이점이 2가지 있다.
첫 번째로
x64 rop는 pop rdi; ret ; pop rsi; pop rdx ; ret 뭐 이런식으로 rsp 가 움직이면서 인자 값을 레지스터에 딱 딱 넣는다.
그러나 mips의 레지스터에 값을 저장하는 방식은 sp를 기준으로 n만큼 떨어진 주소의 값을 가져오는 방식을 사용한다.
즉, sp는 가만히 있고 a0 = [sp+0x10] , a1 = [sp+0x20] 이렇게 인자를 가져오기 때문에 가젯을 구하는게 상당히 힘들다.
예를 들어서 가젯을 구했는데 a0의 값도 sp+0x10 에서 가져오고 a1의 값도 sp+0x10에서 가져온다면 두 가젯중 하나만 사용 가능해진다. 또한 깔끔한 가젯이 없기 때문에 a0의 값을 가져오는 가젯에서 sp+0xN 에 다른 값을 쓸 수 있다. 이럴때 발생하는 문제점은 예를 들어서, a0의 가젯은 sp+0x10에서 가져오고 a1의 가젯은 sp+0x20에서 가져오는데 a0의 가젯에 sp+0x20에 어떤 값을 쓰는 로직이 존재할 경우 두 가젯을 함께 사용하지 못한다.
두 번째로는
ret이 없다는 점이다. mips는 ret을 사용하지 않고 jump와 branch를 사용한다. 그래서 이 어셈블리어를 이용해서 chaining을 짜야 하는데 예를 들면 jalr의 경우 jalr을 하면 ra = pc+8 이 되어서 chaining이 끊켜 버린다. 그래서 jump를 한 곳에서 ra를 컨트롤 할 수 있어야 한다. 이러한 제약사항이 있어서 가젯 구하기가 힘들다.
'mips' 카테고리의 다른 글
mips shellcode (0) | 2025.03.18 |
---|---|
mips 스택프레임, 레지스터, 어셈블리어 (0) | 2025.03.10 |
mips - 기본 개념 (0) | 2025.02.16 |