본문 바로가기

리버싱

리버싱 #02 Hello world 디버깅

2장에서는 처음 프로그래밍을 배울 때 만드는 hello world를 출력하는 프로그램을 디버깅할 것이다.

 

helloworld 소스코드

 

프로그램을 올리 디버거를 통해서 열고 실행시키게 되면

heloworld.exe 실행결과

Hello World! 메시지가 적힌 메시지 박스가 나타난다.

이번 장에서는 메시지 박스에 출력되는 Hello World를 다른 문자로 변환시켜 Hello World가 아닌 다른 문자가 출력되게 하는 것 까지 수행해 볼 것이다.

 

helloworld.exe 시작주소

[Ctrl + F2]를 통해 프로세스를 재실행하게 되면 실행파일의 코드가 004011A0 주소부터 시작하게 된다.

첫 시작 코드 주소인 004011A0 주소에는 CALL명령어가 있다. [F7]를 통해 함수 안으로 따라 들어가게 되면 0040270C주소로 이동하게 된다.

004011A0의 call명령어 수행 후

MessageBox()에 Hello World! 를 변환하기 위해선 MessageBox() 함수를 찾아야 하고 MessageBox() 함수를 찾기 위해서는 main함수를 찾아야 한다.

CALL명령어를 통해 따라 들어간 함수가 main함수인지는 함수 내에 MeassageBox함수 유무를 통해 main함수인지 구분할 수 있다. ( helloworld 소스코드 참고 )

 

함수를 쭉 수행시키다 보면 004027A1주소에 RETN 명령어를 통해 함수가 종료된다.

함수가 종료된 후 주소 004011A 5로 오게 된다.

004011A5주소에 JMP명령어를 통해 0040104F주소로 이동한다.

004011A5주소 JMP명령어 수행후 0040104F주소

여기서 호출되는 함수 명령어를 따라 디버깅을 하다 보면 00401144 주소에 CALL명령어로 이동한 00401000 주소에 MessageBox() 함수를 찾을 수 있다.

 

00401000주소

이제 Hello World! 문자열을 변환시켜주면 된다.

문자열을 변환하는 방법에는 문자열 버퍼를 직접 수정하는 방법다른 메모리 영역에 새로운 문자열 생성하는 방법이 존재한다. 

 

1) 문자열 버퍼를 직접 수정하는 방법

Hello World! 문자열은 004092A0 ~ 004092B4 영역을 차지한다.

덤프창

덤프 창에서 [Ctrl + G] ( goto 명령)을 통해 004092A0주소를 통해 이동한 후 [Ctrl + E]를 통해 문자열을 수정하면 된다.

기존 Hello World! 문자열을 i dont know라는 새로운 문자열로 덮어쓸 것이다.

edit 다이얼로그 문자열 수정 전
문자열 수정 후

 

2) 다른 메모리 영역에 새로운 문자열 생성하는 방법

 

코드 섹션의 크기를 다 채우지 못하게 되면 남은 영역은 NULL(0)으로 채우게 된다.

이때 NULL로 채워지는 영역을 NULL padding 영역이라고 부르고 이영역에 문자열을 생성하여 사용하는 방법이다.

NULL Padding 영역

 

NULL Padding 영역에 새로운 문자열인 i dont know!를 생성한다.

NULL Padding 영역에 새로운 문자열 생성 후

새로운 문자열을 생성한 뒤 MessageBox함수에 새로운 문자열의 버퍼 주소를 파라미터로 전달해주어야 된다.

기존의 Hello World!문자열을 파라미터로 전달하는 명령어는 PUSH 004092A0이다.

이것을 [ PUSH 새로운 버퍼주소 ]로 변경해주어야한다.

파라미터 변경 후

이렇게 파라미터를 전달까지 하게 되면 2번째 방법 또한 끝나게된다.

 

 

 

1번째나 2번째 방법을 수행한 후 [F9]를 통해 주소00401000부터 실행 시켜주면 MessageBox에 문자열이 바뀐것을 확인할 수 있다.

다음장에서는 리틀 앤디언 표기법, IA-32 Register 기본 설명, 스택, 스택 프레임

3장 ~ 5장은 건너 뛰고 다음 실습인 abex crackme #1을 진행하겠습니다.

'리버싱' 카테고리의 다른 글

리버싱 #04 abex crackme 2 분석  (0) 2021.01.24
리버싱 #03 abex crackme 1 분석  (0) 2021.01.22
리버싱 #01 리버싱 스토리  (3) 2020.12.28
리버싱 #00 intro  (2) 2020.12.27