전체보기

    [Dreamhack] Payload 백업 (System Stage 5, 6)

    보호되어 있는 글입니다.

    [System] SFP, RET

    기본적인 STACK의 기본 구조. Buffer + SFP + RET | ... | Low address +------------+ | ... | +------------+ | SFP | +------------+ | RET | +------------+ High address SFP는 Saved(Stack?) Frame Pointer의 약자로 이전 함수의 EBP값을 가지고 있다. 현재 가장 바닥에 있는 주소를 가리키는 것이 EBP인데, 새로운 함수를 호출할때마다 새로운 스택 프레임이 생성되어 EBP의 주소가 바뀌게 된다. 실행중인 함수가 종료될 때, 이전 함수의 주소(ebp)가 필요하게 되는데, 이 값을 저장하는 공간이 SFP이다. RET는 함수 호출 다음에 실행할 주소를 eip에 대입하고, 그 주소로 ..

    [Rev] 프로그램 정적 분석 접근 방식 1 - main 함수 분석 (Ghidra)

    [Rev] 프로그램 정적 분석 접근 방식 1 - main 함수 분석 (Ghidra)

    1. main 함수 분석 2. Import 함수 분석 3. 문자열 분석 1. main 함수 분석 main 함수 분석의 특징은 대상 프로그램을 전체적으로 분석하고 이해할 수 있다는 점이다. 그러나 프로그램의 처음부터 분석하고 싶거나 용량이 큰 프로그램의 분석에는 적합하지 않다. C 언어로 프로그램을 작성할 경우 main 함수가 최초로 실행되는 함수로 코드를 시작하지만 프로그램 실행 시에는 main 함수 앞에 초기화 처리 등이 진행된다. 보통 PE 포맷의 실행 파일은 PE 헤더 내의 AddressOfEntryPoint의 RVA(Relative Virtual Address)에 ImageBase를 가산한 주소에서 실행된다. 기드라에서 엔트리 포인트 심벌명은 entry이다. Symbol Tree 창의 [Expor..

    [Rev] 호출 규약

    호출 규약이란 함수 호출 시 인수 전달 방법과 반환값의 수취 방법을 정의한 것. 호출 규약에 따라 레지스터와 스택의 이용 방법이 다르기 때문에 리버싱을 통해 코드를 이해하기 위해선 호출 규약을 파악하는 것이 필수이다. 호출 규약은 아키텍처나 프로그램의 포맷, 컴파일러나 링커에 따라 변한다. cdecl x86의 C/C++에서 가장 일반적인 호출 규약. 함수의 인수는 역순으로 스택에 쌓이고 반환값은 EAX 레지스터에 저장되며 함수 호출원이 스택을 POP한다. stdcall 윈도우 API에서 이용되는 호출 규약. 함수의 인수는 역순으로 스택에 쌓이고 반환값은 EAX 레지스터에 저장되지만 함수가 종료될 때 그 함수 자체가 스택을 PUSH한다. 인수를 위해 확보한 스택 영역은 RET 명령 operand에 의해 P..

    [Rev] 메모리 영역

    [Rev] 메모리 영역

    모든 실행 파일은 메인 메모리에서 읽히고 CPU에서 실행된다. 메모리 공간은 프로세스별로 분리되어 있다. 코드(code) 영역 : 실행할 코드가 저장되는 메모리 영역 데이터(data) 영역 : 코드 실행 시 읽고 쓰는 데이터, 글로벌 변수가 저장되는 메모리 영역 힙(heap) 영역 : 프로그램 실행 시 동적으로 확보되는 메모리 영역 스택(stack) 영역 : 프로그램 실행 시 함수의 인수, 로컬 변수, 리턴 주소 등을 저장하기 위해 사용되는 영역

    [Dreamhack] Memory Corruption: Stack Buffer Overflow 정리

    [Dreamhack] Memory Corruption: Stack Buffer Overflow 정리

    먼저 스택 오버플로우와 스택 버퍼 오버플로우의 차이점. 스택 오버 플로우는 스택 영역이 너무 많이 확장돼서 발생하는 버그를 뜻하며, 스택 버퍼 오버플로우는 스택에 위치하 버퍼에 버퍼의 크기보다 많은 데이터가 입력되어 발생하는 버그를 뜻한다. 스택 버퍼 오버플로우 스택의 버퍼에서 발생하는 오버플로우를 뜻한다. 버퍼(Buffer)란? 데이터가 목적지로 이동되기 전에 보관되는 임시 저장소이다. 데이터의 처리속도가 다른 두 장치가 있을 때, 둘 사이에 오가는 데이터를 임시로 저장해 두는 것은 일종의 완충 작용을 한다. 예시로 키보드 입력보다 데이터 처리 속도가 더 느릴경우 데이터가 유실 될 수 있수 있어, 수신 송신 측 사이에 버퍼라는 임시 저장소를 두고 간접적으로 데이터를 전달한다. 빠른 속도로 이동하던 데이..

    [Dreamhack] Calling Convention 정리

    함수 호출 규약 함수의 호출 및 반환에 대한 약속. 함수의 흐름에 따라서, 함수를 호출하면 함수로 이동하고, 반환하면, 다시 원래 함수로 돌아가는 흐름을 보인다. 그래서 함수를 호출할 때는 반환된 이후를 위해 호출자(Caller)의 상태(Stack frame) 및 반환 주소(Return Address)를 저장해야 한다. 그리고 호출자는 피호출자(Callee)가 요구하는 인자를 전달 해줘야하고, 피호출자의 실행이 종료될 때는 반환 값을 전달받아야 한다. 일반적으로 컴파일러가 호출 규약에 맞게코드를 컴파일한다. 컴파일러는 CPU의 아키텍터에 적합한 호출규약을 선택한다. 하지만, 컴파일러의 도움 없이 어셈블릴 코드를 작성하려 하거나, 어셈블리로 작성된 코드를 읽으려면 함수 호출 규약을 알아야 한다. 함수 호출..

    [Dreamhack-System] Shell_basic WriteUp

    보호되어 있는 글입니다.

    [Dreamhack] x86 Assembly (2) 정리

    자료구조인 스택, C언어의 함수에 대응되는 프로시저, 시스템콜에 관한 어셈블리 내용이다. 스택 push val : val을 스택 최상단에 쌓음 pop reg : 스택 최상단의 값을 꺼내서 reg에 대입 프로시저 Procedure는 특정 기능을 수행하는 코드 조각을 말한다. 프로시저를 사용하면 반복되는 연산을 프로시저 호출로 대체할 수 있는 장점이 있다. 그리고 기능별로 코드 조각에 이름을 붙여 가독성을 높일 수 있다. 프로시저를 부르는 행위를 호출(Call)이라고 하고, 돌아오는 것을 반환(Return)이라 한다. 프로시저를 실행 하고 나서 원래 실행 흐름으로 돌아와야 하므로 call 다음의 명령어 주소 즉, 반환 주소(return address)를 스택에 저장하고 프로시저로 rip를 이동시킨다. cal..

    [Dreamhack] x86 Assembly (1) 정리

    어셈블리 언어와 어셈블러가 있다. 어셈블러는 어셈블리어 코드를 컴퓨터가 이해할 수 있는 기계어로 코드를 치환해준다. 소프트웨어를 역분석 하기위해, 기계어를 어셈블리 언어로 번역하는 역어셈블러(Disassembler)를 개발했다. 어셈블리 언어는 아키텍처마다 여러 종류가 있다. x64 어셈블리 언어의 기본 구조 구조는 명령어 즉, Operation Code(Opcode)와 피연산자(Operand)로 구성 된다. mov eax, 3 mov는 opcode로 대입하라. eax와 3은 각각 operand1, operand2를 나타낸다. operand1에 operand2를 대입하라는 문장이다. 명령코드 데이터 이동(Data Transfer) mov, lea 산술 연산(Arithmetic) inc, dec, add,..