본문 바로가기

DreamHack: System Hacking

(45)
Background: Calling Convention(함수 호출 규약) 함수 호출 규약 1. 함수 호출 규약은 함수의 호출 및 반환에 대한 약속이다. 2. 함수 호출 규약은 아키텍처 그리고 운영체제에 따라서 달라지며, 프로그래머가 코드에 어떤 함수 호출 규약을 사용할지 선택할 수도 있다. 3. 함수 호출 규약를 분류하는 방식은 다음과 같다. 즉, 함수 호출 규약에 따라 다음의 것들이 달라진다. 1) 인자 전달 순서 ( 왼쪽 인자 -> 오른쪽 인자 or 오른쪽 인자 -> 왼쪽 인자 ) 2) 인자 전달 방법 ( 스택 or 레지스터 ) 3) Stack Frame을 정리하는 방법 ( 함수 호출자[caller] or 함수 피호출자[callee] ) 함수 호출 규약의 종류 - x86(32bit) 아키텍처는 레지스터를 통해 피호출자의 인자를 전달하기에는 레지스터의 수가 적으므로, 스택으..
[혼자 실습] shell_basic 풀이 1 /home/shell_basic/flag_name_is_loooooong 0x676e6f6f6f6f6f6f/6c5f73695f656d61/6e5f67616c662f63/697361625f6c6c65/68732f656d6f682f(->리틀엔디안 /home/shell_basic/flag_name_is_loooooong) ############어셈블리 코드(shell.asm) BITS 64 section .text global _start _start: push 0x0 mov rax, 0x676e6f6f6f6f6f6f push rax mov rax, 0x6c5f73695f656d61 push rax mov rax, 0x6e5f67616c662f63 push rax mov rax, 0x697361625..
Exploit Tech: Shellcode Shellcode shellcode란, 익스플로잇(==상대 시스템을 공격하는 것)을 위해 제작된 어셈블리 코드 조각이다. shellcode에는 아주 다양한 종류가 있으며 이번 스테이지에서는 orw(open-read-write) shell code와 execve shell code에 대해 다뤄볼 것이다 shellcode는, 일반적으로 shell을 획득하는 것을 목적으로 사용된다. ORW(Open-Read-Write) Shellcode orw 셸코드는 파일을 열고, 읽은 뒤 화면에 출력해주는 shellcode이다. 이 게시글에서는 "/tmp/flag"를 읽는 셸코드를 작성해볼 것이다. orw shellcode를 C언어로 표현해보면 다음과 같다 이제 이 코드를 어셈블리어로 구현해보자. 1. int fd = o..
Tool: pwntools (pwntools 사용법 및 명령어 정리) pwntools 0. import python에서 "from pwn import *"를 첫 줄에 적어준다 ----------------------------------------------------------------------------------------------------------------------------------------------------------------- process, remote == 익스플로잇 함수 process == "로컬 바이너리" 대상 익스플로잇 함수(보통 테스트&디버깅을 위해 사용) remote == "원격 서버" 대상 익스플로잇 함수(대상 서버를 실제로 공격하기 위해 사용) ex) from pwn import * p = process('./test') ..
Tool: gdb (gdb 명령어 정리) Linux 실행파일 형식 == ELF ELF는 '헤더&섹션'으로 구성되어있다. 헤더: 실행에 필요한 여러 정보가 들어있음 섹션: 컴파일된 기계어&프로그램 문자열&여러 데이터가 들어있음 ELF가 실행될 때는 Entry Point(EP)부터 프로그램이 실행됨.(명령어: readelf -h "실행 프로그램 이름") ---------------------------------------------------------------------------------------------------------------------------------------- context context는 크게 4개의 영역으로 구분된다. 1. registers: 레지스터의 상태를 보여줍니다. 2. disasm: rip부터 여러 줄..
Quiz: x86 Assembly 2 문제: 다음 어셈블리 코드를 실행했을 때 출력되는 결과로 올바른 것은? [Code] main: push rbp mov rbp, rsp mov esi, 0xf mov rdi, 0x400500 call 0x400497 mov eax, 0x0 pop rbp ret write_n: push rbp mov rbp, rsp mov QWORD PTR [rbp-0x8],rdi mov DWORD PTR [rbp-0xc],esi xor rdx, rdx mov edx, DWORD PTR [rbp-0xc] mov rsi,QWORD PTR [rbp-0x8] mov rdi, 0x1 mov rax, 0x1 syscall pop rbp ret ================================== [Memory] 0x4005..
Quiz: x86 Assembly 1 문제: end로 점프하면 프로그램이 종료된다고 가정하자. 프로그램이 종료됐을 때, 0x400000 부터 0x400019까지의 데이터를 대응되는 아스키 문자로 변환하면 어느 문자열이 나오는가? [Register] rcx = 0 rdx = 0 rsi = 0x400000 ======================= [Memory] 0x400000 | 0x67 0x55 0x5c 0x53 0x5f 0x5d 0x55 0x10 0x400008 | 0x44 0x5f 0x10 0x51 0x43 0x43 0x55 0x5d 0x400010 | 0x52 0x5c 0x49 0x10 0x47 0x5f 0x42 0x5c 0x400018 | 0x54 0x11 0x00 0x00 0x00 0x00 0x00 0x00 ============..
Background: x86 Assembly Essential Part(2) 스택, 프로시저, 시스템 콜 스택🧱(push, pop) - push val : val을 스택 최상단에 쌓음 연산 rsp -= 8 [rsp] = val - pop reg : 스택 최상단의 값을 꺼내서 reg에 대입 연산 rsp += 8 reg = [rsp-8] 주의할 점⚠️ 1) 스택은 확장될 때 주소값이 낮아지고, 축소될 때 주소값이 높아진다는 걸 유념하자(스택은 아래로 자란다) 2) push와 pop 명령어는 현재 rsp가 가리키는 곳을 기준으로 이루어진다는 것을 유념하자 3) pop 명령어는 스택 최상단의 값을 꺼낸 뒤, 대입까지 한다는 걸 잊지 말자 프로시저📜(call, leave, ret) 프로시저를 부르는 행위를 호출(Call)이라고 부르며, 프로시저에서 돌아오는 것을 반환(Return)이라고 부른다. x64어셈블리언어에는..