System Hacking - 유용한 모음집

곽무경·2022년 7월 22일
0

System Hacking

목록 보기
27/27

syscall table

https://rninche01.tistory.com/entry/Linux-system-call-table-%EC%A0%95%EB%A6%ACx86-x64

▶ 64-bit

$ syscall
syscallraxrdirsirdx
read0x00unsigned int fdchar *bufsize_t count
write0x01unsigned int fdconst char *bufsize_t count
open0x02const char *filenameint flagsumode_t mode
close0x03unsigned int fd
execve0x3bconst char *filenameconst char const argvconst char const envp

▶ 32-bit

$ int 0x80
syscallraxrdirsirdx
read0x03unsigned int fdchar *bufsize_t count
write0x04unsigned int fdconst char *bufsize_t count
open0x05const char *filenameint flagsumode_t mode
close0x06unsigned int fd
execve0x0bconst char *filenameconst char const argvconst char const envp
  • read : fd, 버퍼 위치, 크기
  • write : fd, 버퍼 위치, 크기
  • open : 파일 이름, 플래그(RDONLY - WRONLY - RDWR), 모드(RDONLY 일때는 무의미)
  • execve : 파일 이름, argv(실행 파일에 넘겨줄 인자), envp(환경변수)
    sh만 실행할 때에는 argv와 envp를 NULL로 설정해도 됨

셸코드를 실행할 수 있는 스켈레톤 코드

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

gcc 보호기법 옵션

-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

pwndbg 명령어

  • 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] : 특정 이벤트가 발생했을 때, 프로세스를 중단

Canary Leak

우선 버퍼까지 recv 하고, 널 바이트를 제외하고 언패킹하여 저장해야 함

u64(b"\x00"+p.recvn(7)) # 32비트는 p.recvn(3)

이후 다시 패킹하여 익스플로잇

ROPgadget

$ROPgadget --binary [binary] --re ["string"]

0개의 댓글