목록리버싱 기초 (76)
Self-Improvement
x64dbg를 sourceforge에서 다운로드 받았을때 snowman 기능이 존재하지 않았다. https://github.com/x64dbg/snowman/releases/tag/plugin-v1 x64dbg/snowman Snowman Decompiler for x64dbg (LOOKING FOR MAINTAINER) - x64dbg/snowman github.com snowman.dp32, snowman.dp64를 다운로드 해준다. 각 파일을 x32dbg, x64dbg plugin 폴더에 넣어준 뒤 실행하면 snowman 기능을 사용할 수 있다.
CASE구문 소스코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 #include int main() { int n; printf("INput number:"); scanf_s(" %d",&n); printf("before switch statement\n"); switch (n) { case 0:printf("[zero]"); break; case 1:printf("[one]"); break; case 2:printf("[two]"); break; case 3:printf("[three]"); break; case 4:printf("[four]"); break; case 5:printf("[five]"); break; ..
소스코드1 1 2 3 4 5 6 7 #include int main() { printf("hellow world!!"); return 0; } cs Visual Studio로 컴파일을 해준뒤 x96dbg로 열어주면 hellow world를 출력하는 main과 printf를 찾지 못하며 이상한? 곳에서 시작을한다. 이는 컴파일러가 기본적인 구성을 확인하기 위한 절차로 컴파일한 프로그램, 버전 등에 상이하게 되어있다. 위의 소스코드의 어셈블리어를 볼라면 Main을 찾아 BP을 걸어준다. 그 다음 F9를 눌러 BP를 설정한 곳까지 진행을 해준 뒤 F7로 진입해준다. 진입을 하면 드디어 우리가 찾는 소스코드의 어셈블리어를 볼 수 있다. 여기서는 F8로 한 라인씩 진행을 해줘도 된다. 해당 어셈블리 코드에서 스택..
*MOV 옵코드 MOV는 단지 값을 넣는 역할을 한다. 예를 들면 MOV eax, 1은 eax에 1을 넣는 코드가 되고, MOV ebx, ecx는 ebx에 ecx를 넣는 코드가 된다. *LEA LEA는 MOV와 다르게 단순하다. MOV는 값을 가져오는 것이라면 LEA는 주소를 가져온다. 따라서 LEA는 가져올 src 오퍼랜드가 주소라는 의미로 대부분 []로 둘러싸여 있다. *예시 esi : 0x401000 *esi : 5640ec83 esp+8 : 0x13ff40 *(esp+8) : 33 1. lea eax, dword ptr ds:[esi] = esi가 0x401000이므로 eax에는 0x401000이 들어온다. 2. mov eax, dword ptr ds:[esi] = esi가 0x401000이므로 ..
먼저 stack1의 소스코드를 확인해보도록 한다. 인자가 무조건 존재해야 하며 modified 변수는 초기값으로 0이 주어지고 0x61626364가 되면 해결이 되어지는 문제이다. 역시나 gcc로 컴파일을 해준다. gdb-multiarch로 stack1 디버깅을 시작해준다. 필자는 빅엔디안과 intel로 셋팅을 해놓고 시작하였다. disass main으로 디스어셈블리를 확인하던 중 쉽게 비교구문을 찾을 수가 있었다. 바로 브레이크포인트를 설정하고 run AAAA로 실행해 보았다. 정상적으로 브레이크포인트에서 멈춘걸로 확인이 된다. 이때 cmp에서 사용되는 eax 레지스터의 값을 확인해보니 0으로 그대로 설정되어 있다. 당연히 continue을 하게되면 풀이에 실패하게 된다. 다시 run A*76dcba(..
먼저 풀어야할 stack0의 소스코드이며 리눅스에서 작성을 해준다. stack0.c을 컴파일 하기위해 gcc을 이용하지만 기본적으로 컴파일할 시엔 stackoverflow?가 막히기 때문에 아래의 옵션을 추가하여 컴파일을 진행한다.gcc -z execstack -no-pie -w -o stack0 stack0.c 컴파일 되어진 stack0을 gdb-multiarch로 디버깅을 시작한다. 이때 설정하는 것은 개인에 따라 다르겠지만 필자는 big 엔디안과 intel 형식으로 셋팅하였다. 먼저 disass main 명령어로 메인의 디스어셈블을 확인한다.확인해보니 test(main+42)에서 modified의 값이 0인지 아닌지를 비교하는 구문으로 확인된다. 먼저 test 명령어가 있는 위치에 브레이크 포인트를..
*섹션 헤더 각 섹션의 속성을 정의한 것이 섹션 헤더 입니다. PE 파일은 code, data, resource 등을 각각의 섹션으로 나눠서 저장한다. 종류 액세스 권한 code 실행, 읽기 권한 data 비실행, 읽기, 쓰기 권한 resourse 비실행, 읽기 권한 *구조체의 구성 멤버 text 섹션 rdata 섹션 data 섹션 - Virtual Size : 메모리에서 섹션이 차지하는 크기 - Virtual Address : 메모리에서 섹션의 시작 주소(RVA) - Size of Raw Data : 파일에서 섹션이 차지하는 크기 - Pointer to Raw Data : 파일에서 섹션의 시작 위치 - Characteristics : 섹션의 속성 text 섹션 크기 RAW?
*NT Header 3개의 멤버로 구성 되어 있으며 제일 첫 번째는 Signature로 50450000로 되어 있으며 그리고 File Header와 Optional Header 구조체 멤버가 있습니다. *NT Header - Signature *NT Header - File Header 파일의 개략적인 속성을 나타내는 구조체 이다. 구성은 Machine, Number of Sections, Time Date Stamp, Pointer to Symbol Table, Number of Symbols, Size of Optional Header, Characteristics이다. 이중에서 가장 중요한 것은 Pointer to Symbol Table, Number of Symbols, Size of Option..
*DOS STUB DOS Header 밑에는 DOS Stub가 존재합니다. 존재 여부는 옵션이며 크기도 일저앟지 않으며 없어도 파일 실행에 문제가 없다. PE View로 확인시 오프셋 000000C7까지가 DOS Stub이다. HexEditer에서 확인 하면 오프셋 000000C7까지 DOS Stub이며 그 뒤부터는 NT Header이다.