본문 바로가기

system

mips 쉘코드 작성

mips 쉘코드 작성

mips 쉘코드 작성

다른 아키텍처와 마찬가지로 mips 아키텍처에도 syscall instruction이 존재한다.

이를 이용해 원하는 함수를 부를 수 있으며, intel에서 eaxmips에서 v0으로 간주하고 작성하면 편하다.

(실제로 함수의 리턴 값도 v0으로 넘어온다.)

 

mipssyscall number는 아래 링크에서 확인이 가능하다.

http://syscalls.kernelgrok.com/

 

mips__NR_Linux 변수에 의해 4000 ~ 4999 rangesyscall number를 가진다.

 

execve 쉘코드를 작성하기에 앞서, hello Mips!를 출력해주는 어셈블리 코드를 작성해 보자.

위 코드를 gdb로 열어보면

 

위와 같다.

위 코드를 그대로 어셈블리로 옮겨보자.

 

하나하나 설명하자면,

  1. data 섹션에 Hello Mips!\n 문자열을 저장한다.
  2. mainexport한다.
  3. $v0write syscall num 저장
  4. $a0, $a1, $a2에 인자 저장
  5. syscall
  6. $v0exit syscall num 저장
  7. syscall

위와 같이 아주 간단하다.

 

실행 결과도 아주 훌륭하다 ㅎㅎ

 

그러면 이제 execve 코드를 작성하여 gdb로 열어보자.

그리고 다시 이걸 어셈블리로 바꿔보자!

 

여기서 중요한게 있는데, 쉘 코드에서는 data 섹션을 쓸 수 없으므로 /bin/sh 문자열을 직접 제작하여 사용해야 한다.

그렇게 해서 완성된 execve 쉘코드!

하지만 아직 NULL이 너무 많다..

이제 xor 연산을 이용하여 NULL값을 어셈블리 코드에서 없애보자.

 

gdb로 디버깅해보면 한결 나아진 것을 확인할 수 있다.

하지만, 맨 뒤쪽에 0x00이 거슬린다..

찾아보니 syscall 뒤에 나오는 패딩? 비슷한 거라는데 0x01로 바꿔도 무의미한 instruction이 되므로 0x01로 바꿔주자.

 

대충 gdb 내용 끌어와서 vim에서 파싱하면 된다.

그러면 위와 같은 쉘코드가 탄생한다~~

마지막으로 위 코드를 통해 검증을 해보자.

 

쉘이 떳다!

 

ref

https://richong.tistory.com/189

https://smleenull.com/453

https://orang.tistory.com/entry/%EC%9E%84%EB%B2%A0%EB%94%94%EB%93%9C-MIPS-Shellcode-%EC%9E%91%EC%84%B1


'system' 카테고리의 다른 글

qemu 설치 및 mips 셋팅  (2) 2019.08.10
peda-arm, peda-mips  (0) 2019.08.10
arm, mips 크로스 컴파일링 및 디버깅  (1) 2019.08.10