mips

mips

mips rop

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에서 가져온다면 두 가젯중 하나만 사용 가능해진다. 또한 깔끔한 가젯이 없기 때문에..

mips

mips shellcode

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

mips 스택프레임, 레지스터, 어셈블리어

mips 스택프레임#include void a(){ char buf[0x30]; printf("this is a\n"); read(0, buf, 0x30); b();}void b(){ printf("this is b\n");}int main(){ printf("this is main\n"); a();}위 함수를 예제로 하여 설명해겠다. 프롤로그addiu sp, sp, -32sw ra, 28(sp)sw s8, 24(sp)move s8, spsp에 -32를 빼서 공간을 확보한다.sw ra, 28(sp) 로 sp + 28 에 ra를 저장한다. 이는 복귀주소를 저장해놓은 것이다. (ret)sw s8, 24(sp) 로 sp +..

mips

mips - 기본 개념

mips 란?Microprocessor without Interlocked Pipelined Stages 아키텍처 중 하나로 4byte 주소체계를 가진 RISC 기반 명령어이다.mips의 특징중에는 특이한 것이 하나 있는데 바로 "delay slot" 이라는 것을 사용한다.이는 branch 나 jump같은 분기 명령이 실행될 때 다음 줄 명령까지 실행한다는 것이다. 그렇기 때문에 rop 를 짤때 마지막 한 줄을 생각해줘야 한다.예를 들어서 다음 코드를 보자.1) lw gp,24(s8)2) li a0,13) lw v0,-32584(gp)4) move t9,v05) jalr t96) nop다음과 같은 어셈블리 코드가 실행이 된다고 치자. 원래같으면 1, 2, 3, 4, ..