목록전체 글 (77)
Jiyong's STUDY

여기서 Hello.00501000이 main 함수라는 것을 알 수 있다. F7로 자세히 들어가보면 esi(source index)에 printf의 위치가 저장되고 edi에는 10이 저장되며 시작함. 반복문에서 jnz의 조건이 맞으면 00501010으로 돌아가게 된다. jnz의 flag는 edi이며, 루프문 안에는 dec edi로 루프를 돌 때마다 --연산이 된다. 반복하는 내용은 "Hello.."를 push한 후에 esi를 호출하여(printf 함수) 출력한다. 10번 반복 후엔 그대로 리턴 후에 main 함수를 종료하며 프로그램이 종료된다.

함수 진입때의 EBP는 00D9FCB0었고 프롤로그 이후 바뀌었으나 에필로그 이후 다시 00D9FCB0으로 돌아왔다. push ebp로 함수 진입시의 ebp값을 스택에 저장한 이후에 mov ebp, esp로 ebp에 esp의 값을 저장하고 함수가 끝날 때 esp와 ebp가 원상복구 되면서 함수 진입 직전의 주소를 기억하며 돌아갈 수 있는 것이다. main 함수에서 f1 함수로 진입하여 연산 후 리턴하여 main 함수로 돌아가는 구조인데, esp 하나뿐이면 esp는 함수 안에서 계속해서 바뀌기 때문에 다시 돌아갈 수 없다. 그렇기에 ebp에 저장을 해둔 뒤에 돌아갈 수 있는 것이다. 쉽게 함수는 자신만의 공간을 가지게 되며, 이를 스택프레임이라 한다.
바이트 저장 순서는 엔디언(endian)이라 한다. 우리가 흔히 사용하는 순서는 빅 엔디언이다. 이것의 반대 방향은 리틀 엔디언이라고 한다. 0x12345678이라는 dword값이 있을 때, 12 34 56 78 이렇게 읽어나가면 빅 엔디언이고 78 56 34 12 이렇게 읽어나가면 리틀 엔디언이다. 이것은 인텔 CPU에서 채택한 방법이다. 리버싱을 할 때 보통 2바이트나 4바이트 값은 리틀 엔디언을 사용한다고 생각하자.

module has entry point outside the code와 같은 문제가 발생한다면 코드를 빌드할 때 debug로 하지 말고 release로 빌드하면 된다. 아무튼 빌드한 exe 프로그램을 ollydbg에 올리면 이런 화면이 나오는데 여기서 Hello World!를 출력하는 부분을 찾아야 한다. F7(함수 내로 들어감)이나 F8로 한 줄씩 실행하며 가다가 프로그램에서 Hello World!가 출력되는 부분을 찾으면 F2로 BP를 찍어두고 Ctrl+F2로 재실행하면 된다. 또는 Ctrl+G로 main 함수를 찾을 수도 있다. 아무튼 찾은 이후 아래 Dump Window에서 Ctrl+G로 주소를 검색하면 이제 메모리에 직접 접근하여 수정을 할 수 있다. 다만 여기서 직접 수정하는 경우엔 Hell..
자료구조에서 배울 수 있는 stack 자료구조에 대한 설명. 일단 stack 자료구조의 ADT와 예제 func.h #pragma once #ifndef __AB_STACK_H__ #define __AB_STACK_H__ #define TRUE 1 #define FALSE 0 #define STACK_LEN 100 typedef int Data; typedef struct _arrayStack { Data stackArr[STACK_LEN]; int topIndex; }ArrayStack; typedef ArrayStack Stack; void StackInit(Stack* pstack); int SIsEmpty(Stack* pstack); void SPush(Stack* pstack, Data data)..
//책에서는 명령어를 강제적으로 외우지 않는 것을 권함. PUSH, POP 스택에 값을 넣는 것을 PUSH, 그리고 스택에 있는 값을 가져오는 것이 POP다. (PUSHAD, POPAD는 모든 레지스터를 PUSH, POP 하라는 명령어다) MOV MOV는 단지 값을 넣는 역할을 한다. LEA LEA는 주소를 가져오는 역할이다. MOV와 헷갈릴 수 있다. MOV는 값을, LEA는 주소를 가져온다. 대부분 가져올 src 오퍼랜드가 주소라는 의미로 []로 둘러쌓여 있다. 예시로 esi: 0x401000 *esi: 5640EC83 esp+8: 0x13FF40 *(esp+8): 33 lea eax, dword ptr ds:[esi] : esi가 0x401000이므로 eax에는 0x401000이 들어온다. mov ..