티스토리 뷰

정보보호

7/23 수업

ljy98 2021. 7. 24. 01:49

1. 함수 호출 규약

2. reverseMe.exe 분석


1. 함수 호출 규약

[그림 1] cdecl.exe의 main 함수
[그림 2] cdecl.exe의 main 함수의 CALL 내부

cdecl 함수 호출 규약은 [그림 1]처럼 CALL 뒤에 ADD가 나온다. 이는 main 함수가 직접 스택을 정리해준다는 의미를 가진다.

 

[그림 3] stdcall.exe의 main 함수
[그림 4] stdcall.exe의 main 함수의 CALL 내부

[그림 4]에서는 main 함수의 내부 함수에서 RETN 10으로 끝나는 것을 볼 수 있다. stdcall 함수 호출 규약에서는 RETN이 아닌 RETN N 형식이 나타나는데, 이는 각각의 내부 함수가 스택을 정리하기 때문이다.

 

함수 호출 규약 cdecl stdcall fastcall
OS x86 (32bit) x86 (32bit) x86 (bit)
표준 C/C++ Win32 -
인자 전달 방법 스택(Stack) 사용 스택(Stack) 사용 ECX(첫 번째 인자), EDX(두 번째 인자), 스택(나머지 인자) 사용
매개 변수 전달 순서 오른쪽 → 왼쪽 오른쪽 → 왼쪽 오른쪽 → 왼쪽
스택 정리 주체 호출자(Caller) 피호출자(Callee) 피호출자(Callee)

- 일반적으로 피호출자(Callee)가 스택을 정리하는 것이 효율적이다. 그런데 cdecl 함수 규약에서 호출자(Caller)가 스택을 정리한다.

   C언어에서는 가변 인자 함수(매개 변수 개수가 유동적)때문에 호출자가 스택을 정리한다.

- Win32 표준 라이브러리 내에 있는 Window API 함수들은 가변 인자 함수가 없기 때문에 피호출자가 스택을 정리한다.

- fastcall은 레지스터와 스택을 동시에 사용함으로써 스택을 적게 사용하여 성능 향상을 위한 함수 호출 규약이다.

  구조가 복잡해진 요즘 CPU의 경우 성능 향상에 도움되지 않는다. 비표준화 방법이기 때문에 컴파일러마다 다르게 처리될 수 있다.

 

* 호출자(Caller)와 피호출자(Callee)는 무엇을 의미할까?

코드를 작성하면 main 함수가 해당 함수들을 CALL 명령어로 호출하게 된다. 이때 main 함수가 호출자(Caller)이고, printf나 scanf와 같은 내부 함수들이 피호출자(Callee)이다. 같은 내부 함수를 여러 번 호출한다고 가정할 때, 스택 정리의 주체가 호출자라면 내부 함수를 호출할 때 마다 계속 스택을 정리해줘야 한다. 스택 정리의 주체가 피호출자일 때에는 각 내부 함수별로 함수 접미 부분에 스택을 정리하는 코드를 1번만 작성하면 되기 때문에 더 효율적이다.

 

 

2. reverseMe.exe 분석

[그림 5] reverseMe.exe의 main 함수
[그림 6] reverseMe.exe의 main 함수2
[그림 7] reverseMe.exe를 실행했을 때 모습

reverseMe.exe를 한 줄씩 F8로 실행하다 보면 [그림 5]에 표시된 부분에서 넘어가지 않고 [그림 7]와 같은 창이 뜬다. "You really did it! Congratz !!!"이 출력될 수 있도록 patch하기 위해 아래와 같이 고친 후 재실행했다.

 

[그림 8] reverseMe.exe의 main 함수 patch
[그림 9] reverseMe.exe를 patch한 후 실행

직접 명령어를 바꾸어 patch하는 방법 외에 reverseMe.exe의 main 함수를 건드리지 않고 "You really did it! Congratz !!!" 팝업을 띄우는 방법도 있다. "Keyfile.dat"라는 문서를 reverseMe.exe가 있는 라이브러리 안에 만들어주면 된다. 단, "Keyfile.dat" 문서 안의 내용은 16 Byte 이상이어야 하며, 'G'가 8개 이상 포함되어야 한다.

[그림 10] Keyfile.dat 파일 생성 예시

[그림 0]과 같이 조건을 만족하는 Keyfile.dat 파일을 생성하게 되면 reverseMe.exe의 main 함수를 직접 고치지 않고도 같은 결과를 얻을 수 있다.

'정보보호' 카테고리의 다른 글

보안 솔루션 종류와 이해  (0) 2021.08.16
8/3 과제 - IP Spoofing 공격 및 대응 방안  (0) 2021.08.03
7/22 과제  (0) 2021.07.23
7/22 수업  (0) 2021.07.22
7/21 과제  (0) 2021.07.21
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
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 28
29 30 31
글 보관함