◾문제 파악 우선 PowerShell로 chall1.exe를 실행시켜 보자 그러면 문자열을 입력했을 때 flag 값과 일치하지 않으면 Wrong을 출력해내는 프로그램이라는 것을 파악할 수 있다 ◾문제 분석 정적 분석을 하기 위해 IDA 프로그램으로 chall1.exe를 선택한다 그러면 메인 함수는 크게 이러한 구조로 이루어졌다는 것을 알 수 있다 운이 좋게도 Correct와 Wrong 문자열을 쉽게 찾을 수 있었다 그러면 메인 함수를 F5를 눌러 디컴파일 해보자 그러면 if 문에서 입력받은 값이 sub_140001000 함수로 이동하여 그에 따른 결과 값에 따라 출력될 문자열이 달라진다는 것을 알 수 있다 그러면 sub_140001000 함수를 더블 클릭하여 더 분석해보자 _BOOL8 __fastcall..
◾문제 파악 프로그램을 실행시키면 문자열을 입력하라는 Input 메시지가 뜨게 되고 아무 문자열이나 입력하면 Wrong 이라는 결과 값이 표시가 된다 고로 Correct를 표시하게 하는 문자열도 존재한다는 것을 알 수 있다 ◾정적 분석 IDA 프로그램을 사용하여 chall0.exe 파일을 분석해본다 우선 Correct라는 문자열이 사용된 위치를 찾기 위해 문자열 검색을 하자 shift + F12를 누르면 문자열 리스트가 나오게 된다 여기서 Correct라는 문자열을 쉽게 찾을 수 있다 더블 클릭하여 어셈블리 코드에서 문자열을 출력하는 위치를 찾는다 버퍼에 Correct가 저장되어 출력되는 것이므로 Buffer를 선택하고 x 단축기를 눌 상호참조를 해본다 그러면 이런식으로 메인 함수로 이동하게 되고, F5..
1. lsLiSt의 약자, 디렉토리에 있는 파일의 목록을 나열하는 명령자주 사용하는 옵션-l: 파일들을 나열할 때 자세히 출력-a: 경로 안의 모든 파일 나열(숨김 파일도)2. cdChange Directory의 약자, 디렉토리를 이동하는 명령.: 현재 디렉토리..: 상위 디렉토리3. pwdPrint Working Directory의 약자, 현재 디렉토리의 전체 경로 표시파일 이름이나 디렉토리 제일 앞 글자를 '.'으로 지정하면 자동으로 숨김 파일이 됨 4. rmReMove의 약자, 파일이나 디렉토리 삭제, 삭제할 때 권한 필요-f: 강제로 삭제, 대상이 없는 경우에는 메시지 출력하지 않음-r: 디렉토리 내부의 모든 내용 삭제-d: 비어있는 디렉토리들만 제거-i: 매번 삭제할 때마다 사용자에게 삭제 여부..
정적 분석은 주로 main 함수를 찾고 분석하므로서 시작됨 함수를 찾는 방법은 크게 진입점(EntryPoint, EP)를 찾아 분석 대상 함수의 특성이나 외적 정보 분석 이 두 가지 정도가 있는데, 보통 진입점과 main 함수의 시작 시점이 동일하지 않기 때문에 진입점을 찾아 그 지점부터 분석하는 것 보다는 main 함수의 특성이나 외적 정보를 이용하여 찾음 1. 문자열 찾기 정적 분석을 할 때, 가장 많이 사용되는 정보는 "문자열" 디버깅 메세지나 로그 파일 생성 시에 여러 문자열들이 포함됨 로그 관련 문자열에는 로그를 생성하는 함수의 이름과 인자가 포함됨 shift + F12를 해서 문자열을 찾는 화면으로 이동한다 2. 상호 참조 해당 문자열이 어디서 사용됐는지 x를 눌러서 상호 참조 기능으로 해당 ..
PE File Format이란? Windows 실행 파일의 구성 방식 개발자가 코드를 작성하면 개발도구(VisualStudio)의 컴파일러가 PE File Format에 맞게 실행 파일로 만들어줌 - 컴파일 과정: 전처리기 -> 컴파일러 -> 어셈블러 -> 링커 PE File 구조 - PE Header: DOS Header, Dos stub, NT Header, Section Header로 구성 - PE Body: 섹션들로 구성 PE File Header 작은 구조체들이 모여서 만들어진 데이터 덩어리 DOS Header: DOS와 호환성을 위해서 만들어짐. 파일의 처음에 위치하고 0x40 크기를 가짐 DOS Stub: PE 파일이 MS-DOS에서 실행될 경우, 화면에 출력될 메시지와 코드가 기록되어 있음..
1. x64 어셈블리어 개요 어셈블리 언어는 컴퓨터의 기계어와 치환되는 언어다. 따라서 기계어의 종류가 다양하다면 어셈블리 언어 또한 다양하게 존재한다. 필자는 ISA x64를 사용하기 때문에 x64 어셈블리어를 배울 예정이다. 2. 어셈블리어 구조 어셈블리어는 opcode(명령어)와 operand(피연산자)로 이루어져있다. opcode operand1 operand2 mov eax 3 명령어는 이런 종류가 올 수 있고, 명령어 데이터 이동 mov, lea 산술 연산 inc, dec, add, sub 논리 연산 and, or, xor, not 비교 cmp, test 분기 jmp, je, jg 스택 push, pop 프로시져 call, ret, leave 시스템 콜 syscall 피연산자에는 세 종류가 올..
1. 스택 프레임이란? 함수가 호출될 때에도 스택의 원리를 사용하게 됩니다. 예를 들어 아래와 같은 프로그램이 있다고 칩시다. int main() { func1(); } void func1() { func2(); } void func2() { } 그러면 스택에는 이런 식으로 함수들이 쌓이게 되겠죠. step1 step2 step3 main() func1() func2() main() func1() main() 이렇게 스택 영역에 차례대로 저장되는 각각의 함수 호출 정보를 스택 프레임 이라고 합니다. 예를 들자면 step 3에서는 스택 프레임 3개가 존재하게 되는 것입니다. 스택 프레임들도 마찬가지로 호출된 후 모든 프로그램 수행을 마치면 스택에서 삭제되겠죠? step4 step5 step6 func1()..