orw 셸코드는 파일을 열고, 읽은 뒤 화면에 출력해주는 셸코드입니다. 이번 강의에서는 “/tmp/flag”를 읽는 셸코드를 작성해보겠습니다.
구현하려는 셸코드의 동작을 C언어 형식의 의사코드로 표현하면 다음과 같습니다.
char buf[0x30];
int fd = open("/tmp/flag", RD_ONLY, NULL);
read(fd, buf, 0x30);
write(1, buf, 0x30);
orw 셸코드를 작성하기 위해 알아야 하는 syscall은 아래와 같습니다.
| syscall | rax | arg0 (rdi) | arg1 (rsi) | arg2 (rdx) |
|---|---|---|---|---|
| read | 0x00 | unsigned int fd | char *buf | size_t count |
| write | 0x01 | unsigned int fd | const char *buf | size_t count |
| open | 0x02 | const char *filename | int flags | umode_t mode |
의사코드의 각 줄을 어셈블리로 구현해보겠습니다.
| syscall | rax | arg0 (rdi) | arg1 (rsi) | arg2 (rdx) |
|---|---|---|---|---|
| open | 0x02 | const char *filename | int flags | umode_t mode |