본문 바로가기

2. Reversing (리버싱)/1) Write UP

[2020.06.16] 리버싱 핵심원리 | Hello World 문제

예전에 언젠가 푼 적이 있는 문제지만, 기억이 나지를 않아 한번 더 풀어보았다.

먼저, EP인 4011A0 주소에서 Step Info F7을 이용하면 40270C 함수로 이동 가능하다

붉은색 글씨의 A들= 코드에서 호출되는 API함수들의 이름이다

우리가 원문 소스코드에서 사용한 코드들이 아니라는 뜻이다

이것은 Visual C++에서 프로그램 실행을 위해 추가시킨 Visual C++ Stub Code이다

(정리2: 40270C 안에 들어와서 보니 함수 젤 끝에 4027A1이 있더라. 여기에 근데 RETN함수가 써졌다)

(정리3: 그래서 이 명령대로 돌아온다면, 아까 실행한 주소 바로 다음인 4011A5로 가게 되는것이다)

(정리4:4027A1에 RETN명령어는 함수에 끝에서 사용되며, 호출된 원래 함수쪽으로 돌아감(이 경우 4011A5)

4027A1 주소에 있는 명령까지 Step Over(F8)하거나 Execute till Return(Ctrl+F9) 이용하면 한방에 감

+ 리턴 명령어 실행(F7/F8)하면, 4011A5로 돌아오게 됨)->F8 천천히 계속 누르면 실제로 4011A5로 가는거 실습으로 확인함

↓↓↓여기서 4011A5 주소의 JMP 0040104F의명령을 실행해서 40104F로 가준다.

이 창에서 F7를 누르면 0040104F 함수가 실행되어서

바로 이 창이 뜨는 것을 확인할 수 있다

(정리5: 4011A5 주소의 JMP 0040104F명령을 실행(F7)을 눌러주고 40104F로 가진 상태이다)

방금 전 사진에서 한 F7을 두번정도 눌러주자마자 이렇게 CALL 함수를 발견하게 된다

해석:401056 주소의 CALL 402524 함수 호출 명령어를 발견한 것이다

Step Info(F7)으로 402524 내부로 들어갈 수 있다

(정리6: main()함수를 찾기 위해서 40104F에서 시작해서 F7을 두번 눌러준 결과, CALL함수를 찾았다

다시 F7을 눌러 여기 CALL함수로 들어갈 수 있다)

해당 사진은 이제 CALL함수, 즉 402524 함수 안에 들어온 사진이다

그러나 여기서 402524 함수는 main()함수라고 보기 어렵다!

MessageBox() API 호출 코드가 보이지 않기 때문!(이라는데 뭔 헛소리인지 모르겠어서 찾아봄)

-------------------------------------------------------------------------------------

MessageBox()

메시지 박스는 별도의 윈도우를 열어서 사용자에게 정보를 주거나 질문을 하는 장치이며 MessageBox()함수 호출 만으로 간단히 만들 수 있다!

-------------------------------------------------------------------------------------

음, 그러니깐... Hello World!를 cpp파일로 Visual Studio Code로 열었을 때 내용에 main()함수가 있고..

그 안에 메세지 박스가 있었던 것으로 보아 해당 내용을 찾는 느낌이다(맞는지는 모르겠고 그런거같다. 맞는거같다)

하여튼, 위에 사진을 다시 가져왔다.

F7를 누르면 한줄씩 천천히 읽어줬는데 Ctrl+F9(Execute till Return)를 누르면

한방에 402568주소의 RETN명령어 위치까지 디버깅이 진행된다!

그럼 이제 RETN함수에 도달했으니 Step Into(F7) 또는 Step Over(F8)을 눌러 명령어 실행하면,

탈함수402524하여 그 다음 함수인 40105B로 넘어가게 되는 것이다!

(정리7: RETN함수를 발견하여 실행해주니 다음 함수인 40105B로 넘어가게 되었다)

이후 계속 호출을 보고 흘러 들어가 main()함수인지 확인해주고

main()함수가 아니라면 Execute till Return(F9)명령으로 계속 탈함수해서 디버깅을 계속 해준다

반가운 CALL함수를 발견해 F7눌러 또 안으로 들어가주고

함수가 떴을 때는 계속 F7을 누르지말고, 밑으로 쭉내려서 API 함수들에 원하는 내용이 없으면

바로 Ctrl+F9를 눌러서 돌아갈 수 있도록 하는게 핵심인 것 같다

(정리8: ​함수 안으로 들어왔을 때는 F7을 무작정 누르지 말고, API부분을 눈으로 쭉 훑고 원하는 내용이 없다면 바로 Ctrl+F9를 눌러 RETN함수로 날아가서 바로 빠져나올 수 있도록 하자! 그래야 안꼬인다)

이후 CALL KERNEL32.GerCommandLineW 명령어를 발견하였다

이것은 Win32 API호출코드이라고 한다. 지금은 들어갈 필요가 없어서 Step Over인 F8을 사용해 넘어갈 수 있다

근데 앞에서까지는 괜찮았는데 이 회색줄을 여기까지 내리는데 유난히 정말 큰.... 난관이있었다

<어려웠던 부분>

일단,저 줄에 가기까지 하나하나 캡쳐를 했어여...이하 F7을 계속 누른 부분이다

저 부분을 탈출하고

다시 CALL함수를 접했다

그래 들어온거까지 좋았고....

근데 여기가 문제이다

습관적으로 F7을 계속누르다가

(정리9: 함수 안으로 계속 들어가지 말고.... 제발 본인이 지금 어디에 들어와있는지 파악을 해줘야한다. 그러니깐 이 경우에는 Ctrl+F9눌러서 돌아가주자. 함부로 깊숙히 들어가지 말고)

그래야 이렇게... 원래대로 어디서 많이 보던 창이 다시 나온다

<난관 끝-------------------------------------------->

쨋든 그래서, 여기서 다시 F8을 눌러주면(이 라인은 건너뛰어줄거기때문에 F7이 아니고 F8이다)

쨋든 잘 따라오면 이것이 보인다

401144주소에 CALL 401000 보이면 F7을 눌러 저기 안으로 들어가보자

감동의 첫 Message Box가 나온다

MessageBoxW() API를 호출하는 코드가 나타나는데,

그 API의 파라미터 값이 "www.reversecore.com"과 "Hello World!"문자열이다

그래서 HelloWorld.cpp의 소스코드의 내용과 일치하는 것이다

따라서 401000 함수가 바로 main()함수이다