Layer7(18)
-
ELF 파일 구조
- ELF 파일 실행 가능한 바이너리, 오브젝트 파일의 형식을 규정한 파일. 여기서 ELF는 Executable and Linkable Format의 약자입니다. (실행, 링킹이 가능한 포멧) ELF 파일은 ELF 헤더, 프로그램 헤더 테이블, 섹션 헤더 테이블로 이루어져있습니다. ELF 헤더는 ELF 파일의 구성을 나타내는 부분입니다. 파일의 가장 첫 부분을 차지하며, 파일의 특성을 알 수 있는 아주 중요한 부분입니다. 프로그램 헤더 테이블은 ELF 안의 *세그먼트들에 대한 정보들로 * 런타임 중에 사용될 메모리 정보 프로세스 이미지를 어떻게 구현해야 할지 나와있는 부분입니다. *섹션 헤더 테이블은 ELF 안에 있는 섹션들에 대한 정보들을 모아둔 부분입니다. * 실행 파일의 정보가 담긴 공간 - ELF..
2021.06.02 -
리버싱 실전 | 워게임 풀이 - Ubuntu Linux
- main 파일 분석 (반복문 전) 우선 main 파일 분석이 우선일 것 같아 메모장에 적어가며 분석했습니다. s : 사용자가 입력한 문자열이 들어가는 string형 변수 0x555555755080 dest : s가 복사될 변수 0x5555557550c0 n : s의 길이가 담겨있는 변수 a : rbp-4 b : rbp-8 c : rip+0x2076c d : rip+0x2007dd 1. read 0, s, 0x31가 인자로 들어간 상태에서 입력을 받습니다. +) read 함수는 자세하게 분석 하지 않아도 될 것 같아서 딱 여기까지만 하고 끝냈습니다 2. strlen 사용자가 입력한 s라는 문자열의 길이를 반환합니다. +) 이것 역시 이정도 정의만 생각해놓고 생략 3. strcpy strcpy에 dest..
2021.05.31 -
pwndbg로 C 소스파일 분석하기 - Ubuntu Linux
- 사전 준비 #include int test(int num){ if (num == (100%260)){ return 1; } return 0; } void win(int a, int b, int c, int d, int e){ printf("good\n"); } void lose(){ printf("bad\n"); } int main(){ int num; int res; printf("Enter Num : "); scanf("%d", &num); res = test(num); if (res == 1){ win(1,2,3,4,5); } else if (res == 0){ lose(); } return 0; } 우선은 vim을 사용하여 위와 같은 내용의 소스파일을 만들고 ESC -> :wq로 저장을 해줍니..
2021.05.26 -
X64 레지스터에 대하여
- X64란? Intel, AMD의 64bit CPU가 사용하는 ISA를 뜻합니다. X86 ISA의 상위 호환이라 보면 됩니다. X64의 다른 이름은 아래와 같이 3가지가 있습니다. X86-64 AMD64 Intel64 - X64 레지스터의 크기 구조 여기서 dword(32)라고 써져있는 부분까지는 위에서 말한 X86 레지스터입니다. qword(64)까지가 우리가 주로 보고 있는 X64 레지스터입니다. X64 레지스터는 여러가지로 나눠집니다. 범용 레지스터 (범용으로 쓰이는 레지스터) 인덱스 레지스터 (주소와 관련된 레지스터) 포인터 레지스터 (특정한 위치를 가리키는 레지스터) 이 세 가지의 레지스터는 아래에서 자세하게 설명하겠습니다. 설명은 괄호 안과 뒤에 추가적으로 적어놓겠습니다. - 범용 레지스터,..
2021.05.21 -
pwndbg 명령어 정리 - Ubuntu Linux
r : 실행하기 CTRL + c : 실행 중단 q : 종료 c : continue reload : pwndbg reload ni, si : 한 줄씩 코드 진행, 함수 내부 까지 b *[주소값] : break point help all에 관해서는 추가적으로 쓰지 않겠습니다.
2021.05.17 -
실행파일이 만들어지는 과정 - Ubuntu Linux
- 리눅스란 무엇일까? 리눅스는 윈도우와 같은 OS의 한 종류입니다. 차이점이 있다면 윈도우는 사용자 친화적인 OS이고, 리눅스는 컴퓨터 친화적인 OS입니다. 윈도우는 굉장히 간편한 UI와 사용법이 특징이기에 사용자 친화적인 OS라 하는 것이고, 리눅스는 UI가 복잡하며, 거의 모든 것을 명령어로 해결해야한다고 봐도 무방합니다. 또한, 리눅스는 어셈블리 언어로 되어있기 때문에 윈도우보다 더욱 세부적인 내용을 다룰 수 있습니다. - 리눅스와 윈도우에서의 C 소스코드 컴파일 컴파일러나 환경, 앱 종류에 따라 달라지겠지만 윈도우의 Dev C++을 기준으로 설명하겠습니다. 우리가 소스코드를 작성하고 실행을 하려면 컴파일이라는 과정을 거쳐야 합니다. 그리고 컴파일을 하기 위해선 컴파일러가 필요합니다. 또한, 컴파..
2021.05.16