야금야금

Reversing #1_Hello World 본문

SWING/Reversing

Reversing #1_Hello World

hyk0425 2021. 3. 28. 12:08

목표 : 출력값인 Hello World!를 Hello Reversing!으로 바꾸기

 

사용 프로그램 : OllyDbg(올리디버거)
일반적으로 프로그램의 실행파일은 2진수(Binary)로 되어있다. 해당 2진수를 16진수(Hex)로 변환시키고 Disassemble과정을Disassemble 거쳐 어셈블리 코드 형태로 변환시켜주는 프로그램.

 

방법 : 컴퓨터는 메모리 주소를 호출하고 값을 반환하는 행위를 반복한다. 따라서 "Hello World!"라는 문장을 출력하는 함수(printf )를 호출하는 명령어를 찾아야 한다. 함수(printf )"Hello World!"라는 문자열이 담긴 메모리를 사용할 것이다. 따라서 해당 주소의 문자열 자체를 "Hello Reversing!"으로 바꾸거나 문자열을 참조하는 명령어를 변환하여 다른 메모리를 참조하게 해서 출력값을 바꾸는 방법이 있다.

 

 

1. 함수(printf) 찾기

우리는 현재 소스코드를 알고 있다.. 따라서 main함수 내부에 printf함수가 존재한다는 것을 알고 있다.

따라서 main함수를 먼저 찾아보도록 하자

 

(1) 직접 찾기
OllyDbg의 코드 창에서 f8(한 줄씩 실행, 함수 내부로 들어가지 않음) 키를) 누르며 콘솔 창에 Hello World! 가 출력될 때까지 문장을 실행해준다. OllyDbg에는 검색 기능이 있지만 디버깅 중 특정 CALL 명령에 의해서 외부에서 불러온 파일 등으로 이동했을 경우 검색이 안될 수 있다. 또한 아래의 (2), (3)번 방법은 소스코드를 미리 알고 있다는 전제 하에 진행될 수 있다.

 

(2) 검색 활용 [Ctrl + G]
위 프로그램에서는 소스코드를 알기 때문에 main함수가 존재한다는 사실을 알고 있다. 따라서 단축키를 통해 main함수를 검색한다. 검색 결과가 main함수의 시작 부분을 가리킬 것이다. (, main 함수가 명령어로 표현되었을 경우 검색되지 않는다)

(3)
문자열 검색 활용
위 프로그램에서는 문자열 수정이 목표이기 때문에 문자열을 검색하여 찾을 수 있다
.

 

 

직접 찾기 방법으로 찾은 메인 함수의 실행 부이다

 

위의 코드에서 f7(Step Into, 해당 함수로 들어감)을 눌러서 main함수 내부로 들어가면 아래의 5줄이 보인다.

 

 

 

 

 

첫째 줄에 PUSH OFFSET 00D82108이라는 명령어에서 우리는 Hello World!라는 문자열을 해당 메모리에서 꺼내서 PUSH 했다는 것을 알 수 있다.

, printf 함수의 시작점을 찾은 것이다.

 

2. 출력값 바꾸기

printf 함수를 찾았으므로 이제 출력값을 바꾸어 보도록 하자. 두 가지의 방법이 존재한다

 

[해당 주소의 문자열을 직접 수정하는 방법]

덤프 창에서 00D82108로 이동한다 [Ctrl+G][Ctrl+G]

 

 

 

Hello World! 뒷부분에 충분한 NULL공간이 존재하는 것을 볼 수 있다. 이제 해당 부분을 드래그하고[Ctrl + E]를 눌러 해당 부분을 편집한다.

 

메모리를 수정하여도 printf 함수가 참조하고 있던 주소는 동일하기 때문에 프로그램을 실행하면 Hello World! 가 아닌 Hello Reversing! 가 실행되는 것을 확인할 수 있다.

 

 

 

 

해당 주소를 찾아가서 수정하는 방법은 컴파일 될 때 배정받은 바이트만큼만 수정할 수 있다는 단점이 있다.

 

 

[다른 메모리 주소를 참조하도록 하는 방법]

위에서 확인했듯이 00D82108에 들어있던 Hello World!라는 문자열이 PUSH OFFSET 00D82108 라는 명령어를 통해 출력되었다. 그렇다면 00D8210800D82108 대신에 다른 주소를 넣는다면 넣은 주소의 값을 출력하게 될 것이라는 것을 유추할 수 있다.

 

덤프 창의 스크롤을 아래로 내리면 00으로 된 공간이 존재하는 것을 볼 수 있다. 이 부분에 새로 운 문자열을 저장하고 PUSH명령어에 넣어보도록 하자

 

└새로운 문자열 저장
└코드 창에서  PUSH  명령어의 주소값 수정

 

 

 

원하는 결과가 출력되는 것을 확인할 수 있다.

 

 

 

보통 문자열을 직접적으로 패치하는 것보다 다른 메모리를 참조하도록 하는 방법이 흔하게 사용된다. 하지만 이 방법은 컴파일러에 의해서 허용되지 않은 메모리 주소를 참조하였기 때문에 메모리 패치가 적용이 안될 수 있다.

 

[뉴스스터디] 리버싱_v.01.01.pdf
0.32MB

'SWING > Reversing' 카테고리의 다른 글

Reversing #4_Lena's Reversing for Newbies  (0) 2021.03.28
Reversing #3_Crackme2  (0) 2021.03.28
Reversing #2_Crackme1  (0) 2021.03.28