본문 바로가기

List/Embedded

[mips] 기초

[+] Calling Convention

함수에 사용되는 인자 중 4개 까지는 a0 ~ a3 레지스터에 저장되고, 이보다 많은 개수의 인자들은 스택에 저장된다. 


[+] 범용 레지스터

mips 는 32개의 범용 레지스터를 사용하고, 구성은 다음 사진과 같다. 



이 중 s8 레지스터는 base register로 사용되고, ra 레지스터는 함수 복귀 주소를 가진다. 


[+] ra 레지스터의 쓰임

함수 프롤로그 

   0x00400670 <+0>: addiu sp,sp,-136

   0x00400674 <+4>: sw ra,132(sp)

   0x00400678 <+8>: sw s8,128(sp)

   0x0040067c <+12>: move s8,sp


함수 에필로그

   0x004006ac <+60>: move sp,s8

   0x004006b0 <+64>: lw ra,132(sp)

   0x004006b4 <+68>: lw s8,128(sp)

   0x004006b8 <+72>: addiu sp,sp,136

   0x004006bc <+76>: jr ra


함수 프롤로그에서 ra 레지스터에 들어있는 복귀 주소를 스택에 옮기고 함수 에필로그에서 다시 읽어와서 
jr ra 명령으로 복귀 주소로 복귀하는 것을 볼 수 있다. 

따라서, 스택에 있는 값을 bof 취약점 같은 것을 이용하여 우리가 변경시킬 수 있다면 exploit이 가능하다.

추가로 frame pointer로 쓰이는 레지스터인 s8 레지스터 또한 프롤로그와 에필로그에서 스택에 저장하고 다시 불러와서 사용하는 것을 보면 fake ebp 같은 공격도 가능할 것 같다. 


[+] return value

return value 같은 경우는 v0 레지스터를 이용한다. 


[+] NOP

move $gp, $gp #this not null 0x0380e021


[+] move at, at 명령

출처 : http://sangu1ne.tistory.com/123

(정확한 내용 아님)

검색을 조금 해보니, 이건 파이프라인 프로세서에서 나타나는 특징중에 하나인데, 딜레이 슬롯 이라고 해서 분기가 실행될 시점에서 분기 명령 다음에 있는 명령은 이미 파이프라인 안에 들어와있기 때문에 NOP likely한 명령으로 채운다, 근데 at레지스터의 기능을 보면, 

$at Register[edit]

The $at (Assembler Temporary) register is used for temporary values within pseudo commands. It is not preserved across function calls. For example, with the (slt $at, $a0, $s2) command, $at is set to one if $a0 is less than $t2, otherwise it is set to zero.

수도커맨드 사이에서 임시저장용으로만 쓰이고 함수호출에서는 값이 유지되지 않는다.라는 식으로 해석 할 수 있을꺼 같다.

이와 같이 wiki에 설명되어있는데, 자세한것은 모르겟지만,  저 명령으로 나머지 파이프라인을 채워 줄 수 있는 것 같다.



[+] lw, sw, move 명령

lw : 방향은 <- 이고, 오른쪽 오퍼랜드의 값을 왼쪽 레지스터로 읽어온다.

sw : 방향은 -> 이고, 왼쪽 오퍼랜드의 값을 오른쪽 레지스터에 저장한다. 

move : 방향은 <- 이고, 오른쪽 오퍼랜드의 값을 왼쪽 오퍼랜드로 옮긴다. 

'List > Embedded' 카테고리의 다른 글

binwalk 설치 및 사용법  (0) 2016.01.07
Explain about MIPS ROP using router vuln  (0) 2015.09.05
[arm] RTL  (0) 2015.09.04
[armel] 기초  (0) 2015.09.04
Embedded 환경 구축  (0) 2015.06.18