목록Pwnable/Study (14)
Iriton's log
*본 포스트는 Dreamhack - Systemhacking Lecture 을 참고하여 작성되었습니다. 함수 호출 규약 함수의 호출 및 반환에 대한 약속을 말한다. 한 함수에서 다른 함수를 호출할 때, 프로그램의 실행 흐름은 다른 함수로 이동한다. 그리고 호출한 함수가 반환하면 다시 원래의 함수로 돌아와서 기존의 실행 흐름을 이어나간다. 따라서 함수를 호출할 때는 반환된 이후를 위해 호출자(Caller)의 상태(Stack frame) 및 반환 주소(Return Address)를 저장해야 한다. 또한, 호출자는 피호출자가 요구하는 인자를 전달해줘야 하며, 피호출자의 실행이 종료될 때는 반환 값을 전달받아야 한다. 함수 호출 규약을 적용하는 것은 일반적으로 컴파일러의 몫이다. 컴파일러가 호출 규약에 맞게 코..
*본 포스트는 Dreamhack - Systemhacking Lecture 을 참고하여 작성되었습니다. Shellcode 익스플로잇을 위해 제작된 어셈블리 코드 조각 해커가 rip을 자신이 작성한 쉘코드로 옮길 수 있으면 해커가 원하는 어셈블리 코드를 실행할 수 있게 된다. 어셈블리어는 기계어와 거의 일대일 대응되므로 사실상 원하는 모든 명령을 CPU에 내릴 수 있게 된다. 쉘코드는 어셈블리어로 구성되므로 공격을 수행할 대상 아키텍처와 운영체제에 따라, 그리고 쉘코드의 목적에 따라 다르게 작성된다. orw Shellcode 작성 /tmp/flag 를 읽는 쉘코드를 작성해보자. 참고 systemcall syscall rax arg0 (rdi) arg1 (rsi) arg2 (rdx) read 0x00 uns..
*본 포스트는 Dreamhack - Systemhacking Lecture 을 참고하여 작성되었습니다. gdb & pwndbg gdb는 리눅스의 대표적인 디버거 오픈 소스 실습 https://github.com/scwuaptx/Pwngdb 가이드라인을 따라서 다운로드 후 // Name: debugee.c // Compile: gcc -o debugee debugee.c -no-pie #include int main(void) { int sum = 0; int val1 = 1; int val2 = 2; sum = val1 + val2; printf("1 + 2 = %d\\n", sum); return 0; } 해당 코드를 컴파일 한다. 컴파일 방법은 주석 참고 여기서 gcc 컴파일러 옵션의 -no-pie는..
*본 포스트는 Dreamhack - Systemhacking Lecture 을 참고하여 작성되었습니다. 어셈블리어와 x86-64 x64 어셈블리 언어 명령 코드 데이터 이동(Data Transfer) mov, lea 산술 연산(Arithmetic) inc, dec, add, sub 논리 연산(Logical) and, or, xor, not 비교(Comparison) cmp, test 분기(Branch) jmp, je, jg 스택(Stack) push, pop 프로시져(Procedure) call, ret, leave 시스템 콜(System call) syscall 피연산자 상수 레지스터 메모리 []로 둘러싸인 것으로 표현되며 앞에 크기 지정자가 추가될 수 있다. 타입 BYTE - 1 WORD - 2 DW..
*본 포스트는 Dreamhack - Systemhacking Lecture 을 참고하여 작성되었습니다. 리눅스 프로세스의 메모리 구조 세그먼트 리눅스에서는 프로세서의 메모리를 크게 5가지의 세그먼트로 구분한다. 용도에 맞게 적절한 권한을 부여할 수 있다는 장점이 있다. 코드 세그먼트 실행 가능한 기계 코드가 위치하는 영역으로 텍스트 세그먼트라고도 불린다. 프로그램이 동작하려면 코드를 실행할 수 있어야 돼서 r-x 권한이 부여된다. 쓰기 권한이 없는 이유는 공격자가 악의적인 코드를 삽입하는 것을 방지하기 위해서이다. 데이터 세그먼트 컴파일 시점에 값이 정해진 전역 변수 및 전역 상수들이 위치한다. CPU가 데이터를 읽을 수 있어야 하므로 r— 권한이 부여된다. data segment 쓰기 가능한 세그먼트 ..
*본 포스트는 Dreamhack - Systemhacking Lecture 을 참고하여 작성되었습니다. 컴퓨터 구조와 명령어 집합 구조 컴퓨터 구조 컴퓨터가 효율적을 작동할 수 있도록 HW, SW의 기능을 고안하고 구성하는 방법을 말함. 폰 노이만 구조, 하버드 구조, 수정된 하버드 구조가 있다. CPU의 명령어에 대한 설계는 명령어 집합 구조(Instruction Set Architecture) - 명령어 설계 CPU의 하드웨어적 설계는 마이크로 아키텍처(Micro Architecture) - 회로 설계 폰 노이만 구조 중앙처리장치(Central Processing Unit, CPU) 연산, 제어 담당 산술논리장치 산술/논리 연산을 수행 제어장치 CPU 제어 레지스터 데이터 저장 기억장치 컴퓨터가 동작..