MIPS공부 1. hello world

컴퓨터공부/임베디드 2014.12.23 05:12
크리에이티브 커먼즈 라이선스
Creative Commons License




helloworld를 gdb로 한번 열어봤다

mips 어셈블리는 처음보지만 이걸하겠다고 하나하나 구글에 쳐보는건 미친짓인것같아서

경험을 토대로 분석하기로 했다


우선 addiu가 눈에 띈다

아이유 안녕?


addiu sp, sp, -32

sw ra, 28(sp)

sw s8, 24(sp)

move s8 ,sp가

x86의

push ebp

mov esp, ebp

sub ~~, $esp

랑 똑같아보이는걸 보니 저게 프롤로그인것 같다


아마 ra는 return address의 약자일 것이고

s8은 frame pointer일 것같다

sp는 그냥 stack pointer고


우선 특징을 보면 왼쪽의 명령어 주소들이 4바이트단위로 딱딱 떨어지는것을 보아

mips는 RISC구조인것을 알 수 있다

RISC구조인데 주소가 4바이트이니

ARM의 mov.t mov.w 처럼 두번에 걸쳐서 4바이트 값을 다룰것이고

puts함수의 인자를 넣는 부분을 보면

lui v0, 0x40

addiu a0, v0, 2064 를 하는데

명령어 주소들이 0x0040으로 시작하는것으로 보아

바이너리 영역이 매핑된 주소가 0x00400000 일것이고

나는 printf("Hello, World\n");를 하는 프로그램을 작성했으니

Hello, World\n 문자열의 주소도 바이너리 영역의 주소이다

따라서 lui는 arm에서 mov.t처럼 상위 2바이트에 값을 넣는 명령이다





그다음에 함수호출을 하는데 jal명령으로 한다

함수 호출할때 리턴어드레스(0x40065c)는 ra레지스터에 저장될거같은데 한번 체크해보자


ra에 리턴어드레스가 저장된다는것은 맞췄는데 예상했던 0x40065c가 아니라 그 다음 명령을 가르키고 있었다

근데 어차피 move at, at 같은 nop like 명령이 있는것을 봐서 왜그런진 모르겠지만 저렇게 구현돼있나보다


분석하면서 하나 안게 있는데

mips도 arm처럼 ra에 리턴어드레스를 저장하긴 하지만

메인함수 코드를 보면


+4에서 ra를 스택에 저장하고

+36에서 다시 가져오는것을 볼 수 있다

이를 보아 함수내에서 다른함수를 호출하는일이 있으면 ra를 스택에 저장하고

아니면 그냥 코드 실행후 바로 jr ra를 할 것 같다

이건 나중에 체크해보자



함수 호출전에

move s8, sp

를 하고

함수 리턴 후

move sp, s8을 하는데

lw나 lui를 봐서 방향은 오른쪽에서 왼쪽이고

sp를 s8에 넣어 이전함수의 sp위치를 저장하고

move sp, s8로 다시 sp를 복구하는것을 볼 수 있다

s8을 처음에 생각한것처럼 frame pointer라고 생각하면 되는것 같다


hello world는 그렇게 다른게 없으니 여기서 끝

신고

'컴퓨터공부 > 임베디드' 카테고리의 다른 글

MIPS공부 1. hello world  (0) 2014.12.23
임베디드 공부 계획  (0) 2014.12.23

설정

트랙백

댓글

임베디드 공부 계획

컴퓨터공부/임베디드 2014.12.23 04:46
크리에이티브 커먼즈 라이선스
Creative Commons License

* 이 계획 활용 예

http://smleenull.tistory.com/431


[공부하면서 업데이트]


기간: 2014년 12월 24일 ~ 미정

공부 내용 : arm, mips, sparc,powerpc, msp430, arduino, avr등에 (올리는게 가능할경우) 리눅스를 올리고 x86에서 풀어본 문제들을 포팅해 x86이외의 플랫폼에서 문제를 풀어보고

임베디드 장비를 구입해 펌웨어를 분석하고 해킹해본다


1. qemu로 시스템 구축, 리버싱, 해킹

qemu-system-xxx로 구축가능한것들중 공부할 것들은

arm, mips, sparc.

세가지 가상머신에 리눅스를 올리고 간단한 프로그램을 제작해 분석해보며 각각의 형태를 익힌다

개이득 사이트 : https://people.debian.org/~aurel32/qemu/


1. hello world 프로그램 분석

2. 변수를 선언하고 값을 대입하는 프로그램 분석

3. 사용자의 입력을 처리하는 간단한 크랙미 제작및 분석

4. 서브함수를 호출하는 프로그램 분석

5. 다양한 데이터 형을 사용하는 프로그램 분석

6. 심플 보프 프로그램 분석 및 공격 테스트

7. 쉘코드 제작 및 쉘코드를 이용해 공격(가능할 경우)

8. ROP테스트 및 exploit-exercises.com/fusion 에서 소스코드 다운받아 컴파일후 문제풀이

신고

'컴퓨터공부 > 임베디드' 카테고리의 다른 글

MIPS공부 1. hello world  (0) 2014.12.23
임베디드 공부 계획  (0) 2014.12.23

설정

트랙백

댓글


티스토리 툴바