공부한 것
Shellcode - orw Shellcode
hsnyus
2026. 5. 17. 18:29
Shellcode
셸코드(Shellcode): 익스플로잇을 위해 제작된 어셈블리 코드 조각.
orw Shellcode
orw 셸코드: 파일을 열고, 읽고 화면에 출력하는 셸코드.
char buf[0x30];
int fd = open("/tmp/flag", RD_ONLY, NULL);
read(fd, buf, 0x30);
write(1, buf, 0x30);
위의 C언어 코드를 셸코드로 구현해보자
orw Shellcode를 작성하기 위해 필요한 syscall은
syscall rax rdi rsi rdx
| read | 0x00 | unsigned int fd | chat *buf | size_t count |
| write | 0x01 | unsigned int fd | const char *buf | size_t count |
| open | 0x02 | const char *filename | int flags | umode_mode |
- int fd = open(”/tmp/flag”, O_RDONLY, NULL)
int fd = open("/tmp/flag", O_RDONLY, NULL);
push 0x67
mov rax, 0x616c662f706d742f
push rax
mov rdi, rsp
xor rsi, rsi
xor rdx, rdx
mov rax, 2
syscall
- read(fd, buf, 0x30)
read(fd, buf, 0x30)
mov rdi, rax
mov rsi, rsp
sub rsi, 0x30
mov rdx, 0x30
mov rax, 0x0
syscall
- write(1, buf, 0x30)
write(1, buf, 0x30)
mov rdi, 1
mov rax, 0x1
syscall
- 완성
push 0x67
mov rax, 0x616c662f706d742f
push rax
mov rdi, rsp
xor rsi, rsi
xor rdx, rdx
mov rax, 2
syscall
mov rdi, rax
mov rsi, rsp
sub rsi, 0x30
mov rdx, 0x30
mov rax, 0x0
syscall
mov rdi, 1
mov rax, 0x1
syscall
orw 셸코드의 컴파일, 실행
위에서 작성한 orw Shellcode 를 gcc를 사용해 컴파일하려면 C언어 코드로 만들어야한다.
C언어로 셸코드 실행이 가능한 스켈레톤 코드를 작성하고 거기에 Shellcode 를 넣는다.
아래는 스켈레톤 코드와, orw Shellcode 를 넣은 스켈레톤 코드이다.
__asm__();
void run_sh();
int main() {
run_sh();
}
__asm__(
".global run_sh\\n"
"run_sh:\\n"
"push 0x67\\n"
"mov rax, 0x616c662f706d742f \\n"
"push rax\\n"
"mov rdi, rsp\\n"
"xor rsi, rsi\\n"
"xor rdx, rdx\\n"
"mov rax, 2\\n"
"syscall\\n"
"\\n"
"mov rdi, rax\\n"
"mov rsi, rsp\\n"
"sub rsi, 0x30\\n"
"mov rdx, 0x30\\n"
"mov rax, 0x0\\n"
"syscall\\n"
"\\n"
"mov rdi, 1\\n"
"mov rax, 0x1\\n"
"syscall\\n"
"\\n"
"xor rdi, rdi\\n"
"mov rax, 0x3c\\n"
"syscall");
void run_sh();
int main() {
run_sh();
}