https://rninche01.tistory.com/entry/Linux-system-call-table-%EC%A0%95%EB%A6%ACx86-x64
$ syscall
syscall | rax | rdi | rsi | 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 |
close | 0x03 | unsigned int fd | ||
execve | 0x3b | const char *filename | const char const argv | const char const envp |
$ int 0x80
syscall | rax | rdi | rsi | rdx |
---|---|---|---|---|
read | 0x03 | unsigned int fd | char *buf | size_t count |
write | 0x04 | unsigned int fd | const char *buf | size_t count |
open | 0x05 | const char *filename | int flags | umode_t mode |
close | 0x06 | unsigned int fd | ||
execve | 0x0b | const char *filename | const char const argv | const char const envp |
C Code
// File name: sh-skeleton.c // Compile Option: gcc -o sh-skeleton sh-skeleton.c -masm=intel __asm__( ".global run_sh\n" "run_sh:\n" "Input your shellcode here.\n" "Each line of your shellcode should be\n" "seperated by '\n'\n" "xor rdi, rdi # rdi = 0\n" "mov rax, 0x3c # rax = sys_exit\n" "syscall # exit(0)"); void run_sh(); int main() { run_sh(); }
Compile
gcc -o orw orw.c -masm=intel
- 어셈블리 코드를 ~~.asm에 작성
nasm -f elf64 shellcode.asm (64비트) ld -o shellcode ./shellcode.o
- pwntools에 사용하기 쉽게
for i in \$(objdump -d ./shellcode | grep "^ "| cut -f2);do echo -n \\x$i; done
-m32 : 32비트 컴파일
-m64 : 64비트 컴파일
-fno-stack-protector : Stack Canary off
-fstack-protector : Stack Canary on
-fstack-protector-all : Canary full
-z execstack : Nx-bit off
-z relro : Partial Relro
-z relro -z now : Full Relro
-z norelro : No Relro
-fpie -pie : PIE on
-no-pie : PIE off
-mpreferred-stack-boundary=2 : Stack Boundary off
- start : 진입점부터 프로그램 분석
- break(b) : 중단점 지정
- continue(c) : 다음 중단점까지 실행
- run(r) : 단순 실행(중단점이 없다면 프로그램 끝까지)
- disassemble, u, disas, nearpc, pdisassemble : 함수 디스어셈블
- ni : next instruction, 다음 명령어 한줄 실행
- si : step into, 다음 명령어를 한줄 실행하되, 서브루틴 있다면 내부로 진입
- finish : 서브루틴에 진입했을 때 함수 끝까지 한 번에 실행
- x : 특정 주소에서 원하는 길이만큼의 데이터를 원하는 형식으로 인코딩
포맷 지정자 : o(8), x(16), d(10), i(instruction), s(string), ...
크기 지정자 : b(byte), h(halfword), w(word), g(giant, 8 bytes)- tele : 메모리 덤프 기능
- vmmap : 가상 메모리 레이아웃(매핑 영역까지)
- watch [addr] : 특정 주소에 저장된 값이 변경되면 프로세스를 중단
- catch [addr] : 특정 이벤트가 발생했을 때, 프로세스를 중단
우선 버퍼까지 recv 하고, 널 바이트를 제외하고 언패킹하여 저장해야 함
u64(b"\x00"+p.recvn(7)) # 32비트는 p.recvn(3)
이후 다시 패킹하여 익스플로잇
$ROPgadget --binary [binary] --re ["string"]