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에서 가져온다면 두 가젯중 하나만 사용 가능해진다. 또한 깔끔한 가젯이 없기 때문에..
execve("/bin/sh",0,0) 를 실행하는 main 함수의 어셈블리 코드는 다음과 같다.mips도 execve 함수 내부에서 syscall 이 이루어진다.x64에서는 syscall이 호출되었을 때 rax 값에 따라 어떤 작업을 수행할 지 결정되는데 misp는 해당 역할을 v0이 수행한다. 인자 순서는 a0, a1, a2 순서이다.syscall 직전에 레지스터 값을 확인해보자.v0 : 0xfaba0 : "/bin/sh" 주소a1 : 0a2 : 0 이제 쉘코드를 만들어 보자. 다음과 같이 어셈블리코드를 짤 수 있다..section .text .globl _start_start: li $t0, 0x2f62696e sw $t0, ($sp) li $t0, 0x2f2f7368 s..
mips 란?Microprocessor without Interlocked Pipelined Stages 아키텍처 중 하나로 4byte 주소체계를 가진 RISC 기반 명령어이다.RISC 계열 프로세서는 고성능.저전력 특성을 살려 주로 임베디드 시스템, 모바일,휴대용 디바이스, IoT 기기 등에 쓰인다. mips는 다음과 같은 특징이 있다.branch나 jump를 하면 다음 줄 명령까지 실행하고 간다. 이를 delay slot 이라고 한다.그렇기 때문에 rop gadget을 짤 때 마지막 한 줄을 생각해야 한다.mips 는 cpu, 제품 제조사 등 마다 다 다르기 때문에 커스터마이징이 될 수 있다. 그래서 어디서는 되고 다른 곳에서는 안될수 있다. 컴파일amd64에서 mips와 같은 타 아키텍처를 컴파일,..