0. ๋ฆฌ๋ฒ์ฑ์ด๋?
- ๋ฆฌ๋ฒ์ค ์์ง๋์ด๋ง: ์ญ๊ณตํ
(1) ๋ฆฌ๋ฒ์ค ์ฝ๋ ์์ง๋์ด๋ง
- ์ํํธ์จ์ด ๋ถ์ผ์ ๋ฆฌ๋ฒ์ค ์์ง๋์ด๋ง
(2) ๋ฆฌ๋ฒ์ฑ ๋ถ์ ๋ฐฉ๋ฒ
- ์ ์ ๋ถ์: ํ์ผ์ ๊ฒ๋ชจ์ต์ ๊ด์ฐฐํ์ฌ ๋ถ์
- ํ์ผ ์คํ์์ด, ํ์ผ์ ์ข ๋ฅ๋ ํฌ๊ธฐ, ํค๋ ์ ๋ณด ๋ฑ์ ํตํด ๋ด์ฉ์ ํ์ธํ๋ค
- ๋์ค์ด์ ๋ธ๋ฌ๋ฅผ ์ด์ฉํ์ฌ ๋ด๋ถ ์ฝ๋์ ๊ทธ ๊ตฌ์กฐ๋ฅผ ํ์ธํ๋ ๊ฒ ๋ํ ์ ์ ๋ถ์์ ๋ฒ์ฃผ์ ๋ค์ด๊ฐ ์ ์๋ค.
- ๋์ ๋ถ์: ํ์ผ์ ์ง์ ์คํ์์ผ, ๊ทธ ํ์๋ฅผ ๋ถ์ํ๊ณ ๋๋ฒ๊น
์ ํตํ์ฌ ์ฝ๋ ํ๋ฆ๊ณผ ๋ฉ๋ชจ๋ฆฌ ์ํ๋ฑ์ ์์ธํ ์ดํด๋ณด๋ ๋ฐฉ๋ฒ
- ํ์ผ, ๋ ์ง์คํ ๋ฆฌ, ๋คํธ์ํฌ ๋ฑ์ ๊ด์ฐฐํ์ฌ ํ๋ก๊ทธ๋จ์ ํ์๋ฅผ ๋ถ์ํ๋ค
- ๋๋ฒ๊ฑฐ๋ฅผ ์ด์ฉํ์ฌ ํ๋ก๊ทธ๋จ ๋ด๋ถ ๊ตฌ์กฐ์ ๋์ ์๋ฆฌ๋ฅผ ๋ถ์ํ ์ ์๋ค
- ํ์๋ ๋จผ์ ์ ์ ๋ถ์์ ํตํด ์ ๋ณด๋ฅผ ์์งํ๋ฉด์ ์์ธก ํ ๋์ ๋ถ์ ๋ฐฉ๋ฒ์ ์ํํ๋ค๊ณ ํจ
- ๋ฆฌ๋ฒ์ฑ != ๋๋ฒ๊น //๋ฆฌ๋ฒ์ฑ์๋ ๋ง์ ๋ฐฉ๋ฒ์ด ์๋ค
1. Hello World ํ๋ก๊ทธ๋จ_ C++
//Visual Studio 2019 ์ฌ์ฉ
(1) ์ค์ต์ ์ํ ์ต์ ์ค์
- ๋ฆด๋ฆฌ์ฆ ๋ชจ๋๋ก ๋ณ๊ฒฝ (๋๋ฒ๊น ์ ์ํด์)
- ํ๋ก์ ํธ > HelloWorld ์์ฑ > ๋ง์ปค > ๊ณ ๊ธ > ์์ ๊ธฐ์ค ์ฃผ์ "์๋์"๋ก ๋ณ๊ฒฝ
- ์์ํ ๋ ๋ง๋ค ์ฃผ์๊ฐ ๋ณํ๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํจ
(2) HelloWorld.cpp
//codeblocks: ์ฑ ์ด๋ ๋๊ฐ์ด ํ๋ฉด ์๋ฌ ๋ฐ์ (L ์์ ์ผ ํจ)
#include "windows.h"
#include "tchar.h"
int _tmain(int argc, TCHAR* argv[])
{
MessageBox(NULL,L"Hello World!", L"www.reversing.com", MB_OK);
return 0;
}
(3) ์คํ ํ๋ฉด
- ์ง์ ๋ ๊ฒฝ๋ก์ HelloWorld.exe ์์ฑํ์ธ (๋ฆด๋ฆฌ์ฆ ํ์ผ์์ ์๋ exe ํ์ผ ์ฌ์ฉ)
- ์ด์ฒ๋ผ C์ธ์ด ์์ค์ฝ๋๋ฅผ ๋น๋ํ๋ฉด, ์คํํ์ผ(exe)๊ฐ ์์ฑ๋๋ค. ์ด ๊ณผ์ ์ ๊ฒฐ๊ตญ ์ฌ๋์ด ์ดํดํ๊ธฐ ์ฌ์ด C์ธ์ด ์์ค์ฝ๋(cpp) ๋ฅผ ๊ธฐ๊ณ๊ฐ ์ดํดํ๊ธฐ ์ฌ์ด ๊ธฐ๊ณ์ด(exe)๋ก ๋ณํํ๋ ๊ฒ์ด๋ค.
- ์ด๋ฐ ๊ธฐ๊ณ์ด๋ ์ฌ๋์ด ๋ณด๊ธฐ ์ด๋ ต๊ธฐ ๋๋ฌธ์ ์ข ๋ ํธํ๊ฒ ๋ณด๊ธฐ ์ํด์ ๋๋ฒ๊ฑฐ ์ ํธ๋ฆฌํฐ๋ฅผ ์ฌ์ฉํ๋ค. (๊ธฐ๊ณ์ด -> ์ด์ ๋ธ๋ฆฌ)
2. ๋๋ฒ๊น
//immunity debugger ์ฌ์ฉ
(1) ๋๋ฒ๊ฑฐ ์คํํ๋ฉด
//๋ง์ฝ ์์ ๋ค๋ฅธ ์ฐฝ์ด ๋ฌ๋ค๋ฉด view > CPU ์ ํ
- Code Window: disassembly code ํ์
- ๊ฐ์ข comment, label์ ๋ณด์ฌ์ค
- ์ฝ๋๋ฅผ ๋ถ์ํ์ฌ loop, jump ์์น ๋ฑ์ ์ ๋ณด ํ์
- Register Window: CPU register ๊ฐ์ ์ค์๊ฐ์ผ๋ก ํ์ํ๋ฉฐ ํน์ register๋ค์ ์์ ๋ ๊ฐ๋ฅํจ
- DUMP Window: ํ๋ก์ธ์ค์์ ์ํ๋ memory ์ฃผ์ ์์น๋ฅผ Hex์ ์์คํค/์ ๋ ๊ฐ์ผ๋ก ํ์ํ๊ณ ์์ ๋ ๊ฐ๋ฅํจ
- Stack Window: ESP register๊ฐ ๊ฐ๋ฅดํค๋ ํ๋ก์ธ์ค stack memory๋ฅผ ์ค์๊ฐ์ผ๋ก ํ์ํ๊ณ ์์ ๋ ๊ฐ๋ฅํจ
(2) Code Window
- Address(004014C0): ํ๋ก์ธ์ค์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๋ด์ ์ฃผ์
- Instruction(83EC 1C): IA32(๋๋ x86) CPU ๋ช ๋ น์ด
- Disassembled code(SUB ESP 1C): OP code๋ฅผ ๋ณด๊ธฐ ์ฝ๊ฒ ์ด์ ๋ธ๋ฆฌ๋ก ๋ณํํ ์ฝ๋ //์บก์ณํ๋ฉด ์ฐธ๊ณ
- comment(*HelloWor.00401590): ๋๋ฒ๊ฑฐ์์ ์ถ๊ฐํ ์ฃผ์ //option
3. EP (Entry Point)
- ์๋์ฐ ์คํ ํ์ผ์ ์์์ (์ ํ๋ฉด์์๋ 0040126C)
- CALL ๋ช ๋ น: ํธ์ถ
- JMP: ํด๋น ์ฃผ์๋ก ์ด๋
4. ๋๋ฒ๊ฑฐ ์ฌ์ฉ๋ฒ
- Run - ๋๊น์ง ์คํ : F9
- Step Over - ํ๋์ OP code ์คํ (CALL ๋ช ๋ น์ ๋ง๋๋ฉด, ๋ฐ๋ผ ๋ค์ด๊ฐ์ง ์๊ณ ๊ทธ๋ฅ ํจ์ ์์ฒด๋ฅผ ์คํ) : F8
- Step Into - ํ๋์ OP code ์คํ(CALL ๋ช ๋ น์ ๋ง๋๋ฉด, ๊ทธ ํจ์ ์ฝ๋ ๋ด๋ถ๋ก ๋ฐ๋ผ ๋ค์ด๊ฐ) : F7
- Execute till Return - ํจ์ ์ฝ๋ ๋ด์์ RETN ๋ช ๋ น์ด๊น์ง ์คํ(ํจ์ ํ์ถ ๋ชฉ์ ) : Ctrl+F9
- Restart - ๋ค์ ์ฒ์๋ถํฐ ๋๋ฒ๊น ์์ : Ctrl+F2
๋๋ฒ๊ฑฐ์ ์ ์ฉํ ๊ธฐ๋ฅ
(1) Go to [Ctrl+G]
- ์ํ๋ ์ฃผ์๋ก ์ด๋ (์ฝ๋/๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ธํ ๋ ์ฌ์ฉ)
- ์คํ๋๋ ๊ฒ์ ์๋
(2) Execute till Cursor(F4)
- cursor ์์น๊น์ง ์คํ(๋๋ฒ๊น ํ๊ณ ์ถ์ ์ฃผ์๊น์ง ๋ฐ๋ก ๊ฐ ์ ์์)
โ
(3) Comment (;)
- ์ฃผ์(comment) ์ถ๊ฐ
โ
(4) User-defined comment
- ๋ง์ฐ์ค ์ฐ์ธก ๋ฉ๋ด Search for User-defined comment
โ
(4) Label(:)
- Label ์ถ๊ฐ (์ํ๋ ์ฃผ์์ ํน์ ์ด๋ฆ ๋ถ์ฌ์ค)
โ
(5) User-defined label
- ๋ง์ฐ์ค ์ฐ์ธก ๋ฉ๋ด Search for User-defined label
โ
(6) Set/Reset BreakPoint (F2)
- BP ์ค์ /ํด์
โ
(7) Run (F9)
- ์คํ (BP๊ฐ ๊ฑธ๋ ค์์ผ๋ฉด ๊ทธ๊ณณ์์ ์คํ์ด ์ ์ง)
โ
(8) Show the current EIP (*)
- ํ์ฌ EIP ์์น๋ฅผ ๋ณด์ฌ์ค๋ค.
โ
(9) Show the previous Cursor (-)
- ์ง์ ์ปค์ ์์น๋ฅผ ๋ค์ ๋ณด์ฌ์ค๋ค.
โ
(10) Preview CALL/JMP address (Enter)
- ์ปค์๊ฐ CALL/JMP ๋ฑ์ ๋ช ๋ น์ด์ ์์นํด ์๋ค๋ฉด, ํด๋น ์ฃผ์๋ฅผ ๋ฐ๋ผ๊ฐ์ ๋ณด์ฌ์ค
- ์คํ๋๋ ๊ฒ์ด ์๋. ๊ฐ๋จํ ํจ์ ๋ด์ฉ์ ํ์ธํ ๋ ์ ์ฉํจโ
๋ฒ ์ด์ค์บ ํ
๋๋ฒ๊ฑฐ๋ฅผ ์ฌ์คํํ๋ฉด ์ฒ์(EP)๋ถํฐ ์๋ก ์์ํ๊ธฐ ๋๋ฌธ์ ์๋นํ ๋ถํธํ๋ค.
๋ฐ๋ผ์, ์ํ๋ ๋ฆฌ๋ฒ์๋ค์ ๋๋ฒ๊น ์ ์งํํ๋ฉด์ ์ค๊ฐ์ค๊ฐ ์ฝ๋์์ ๋ถ์์ ์ํ๋ ์ค์ ํฌ์ธํธ(์ฃผ์)๋ฅผ ์ง์ ํด ๋์ ํ ๊ทธ ํฌ์ธํธ๋ก ๋น ๋ฅด๊ฒ ๊ฐ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ธฐ๋กํด๋๋ค.
โ
๋ฒ ์ด์ค์บ ํ๋ฅผ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ 4๊ฐ์ง๊ฐ ์๋ค.
(1) Goto ๋ช ๋ น
- ๋ฒ ์ด์ค ์บ ํ ์ฃผ์๋ฅผ ์ ๊ธฐ์ตํด๋์๋ค๊ฐ Go to ๋ช ๋ น์ผ๋ก ๊ฐ๋ค
(2) BP(Break Point)
- BP๋ฅผ ์ค์น(F2)ํ๊ณ , ์คํํ๋ ๊ฒ //๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋จ
(3) ์ฃผ์
- ; ๋จ์ถํค๋ก ์ฃผ์์ ๋ฌ๊ณ , ์ด ์ฃผ์์ ์ฐพ์๊ฐ๋ค.
(4) ๋ ์ด๋ธ
- ์ํ๋ ์ฃผ์์ ํน์ ์ด๋ฆ์ ๋ถ์ฌ์ฃผ๋ ์์ฃผ ์ ์ฉํ ๊ธฐ๋ฅ์ด๋ค
5. ํจ์ ๋ฐ๋ผ๊ฐ๊ธฐ
๋ชฉํ: main()ํจ์์์ MessageBox()ํจ์ ํธ์ถ์ ํ์ธํ๋ ๊ฒ
(1) Restart
(2) F8(step over)์ ๊ณ์ ๋๋ฌ๋ณด๋ฉฐ main()์ ์ฐพ๊ธฐ ์ํด ๋ ธ๋ ฅํ๋ค.
- ์ด ๋, Call HelloWor.wmain์ ์คํํ๋ฉด ์คํ ์ฐฝ์ด ๋จ๋ฏ๋ก F7๋ก step into ํ์ฌ ํ์ธํ๊ธฐ
- ์ด ํจ์ ๋ด๋ถ์์ ์ฝ๋๋ก ์์ฑํ ๋ฌธ์์ด ๋ฑ์ ๋ด์ฉ์ ํ์ธํ ์ ์๋ค (์ฆ, main ํจ์ ๋ด๋ถ๋ก ๋ค์ด์ด)
(3) ํ์ธ ๋๋ฅด๊ณ F8 ๋ช ๋ฒ ๋๋ฅด๋ฉด ํ๋ก๊ทธ๋จ ์ข ๋ฃ๋จ
5. ์ํ๋ ์ฝ๋๋ฅผ ๋นจ๋ฆฌ ์ฐพ์๋ด๋ ๋ฐฉ๋ฒ
(1) ์ฝ๋ ์คํ ๋ฐฉ๋ฒ
- ํ๋ก๊ทธ๋จ์ ๊ธฐ๋ฅ์ด ๋ช ํํ ๊ฒฝ์ฐ์ ๋ช ๋ น์ด๋ฅผ ํ๋ํ๋ ์คํํ๋ฉด์ ์ํ๋ ์์น๋ฅผ ์ฐพ์๊ฐ๋ค.
- ํฌ๊ธฐ๊ฐ ์๊ณ , ๊ธฐ๋ฅ์ด ๋ช ํํ ๊ฒฝ์ฐ์ ์ฌ์ฉ๊ฐ๋ฅ
(2) ๋ฌธ์์ด ๊ฒ์ ๋ฐฉ๋ฒ
- ๋ง์ฐ์ค ์ฐ์ธก ๋ฉ๋ด -> Search for -> All referenced text string
(3) API ๊ฒ์- ํธ์ถ ์ฝ๋์ BP
- ์๋์ฐ์ฆ ํ๋ก๊ทธ๋๋ฐ์์ ๋ชจ๋ํฐ ํ๋ฉด์ ๋ญ๊ฐ๋ฅผ ์ถ๋ ฅํ๋ ค๋ฉด Win32 API๋ฅผ ์ฌ์ฉํ์ฌ OS์์ ํ๋ฉด ์ถ๋ ฅ์ ์์ฒญํด์ผ ํ๋ค. ์ฆ, ํ๋ก๊ทธ๋จ์ด ํ๋ฉด์ ๋ญ๊ฐ๋ฅผ ์ถ๋ ฅํ๋ค๋ ์๋ผ๋ ํ๋ก๊ทธ๋จ ๋ด๋ถ์์ Win32 API๋ฅผ ์ฌ์ฉํ์๋ค๋ ๋ป์ ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ํ๋ก๊ทธ๋จ์ ๊ธฐ๋ฅ์ ๋ณด๊ณ ์ฌ์ฉ๋์์๋งํ Win32 API ํธ์ถ์ ์์ํ์ฌ, ๊ทธ ๋ถ๋ถ์ ์ฐพ์ ์ ์๋ค๋ฉด ๋๋ฒ๊น ์ ๋งค์ฐ ๊ฐํธํด์ง ์ ์๋ค.
(4) API๊ฒ์- API์ฝ๋์ ์ง์ BP
- ๋ง์ฐ์ค ์ฐ์ธก ๋ฉ๋ด-> Search for -> Name in all modules
- Ollydbg๊ฐ ๋ชจ๋ ์คํ ํ์ผ์ ๋ํด์ API ํจ์ ํธ์ถ ๋ชฉ๋ก์ ์ถ์ถํ ์ ์๋ ๊ฒ์ ์๋๋ค. Packer/Protector๋ฅผ ์ฌ์ฉํ์ฌ ์คํํ์ผ์ ์์ถ(๋๋ ๋ณดํธ)ํด๋ฒ๋ฆฌ๋ฉด, ํ์ผ ๊ตฌ์กฐ๊ฐ ๋ณ๊ฒฝ๋์ด OllyDbg์์ API ํธ์ถ ๋ชฉ๋ก์ด ๋ณด์ด์ง ์๋๋ค.
- ์ด๋ฐ ๊ฒฝ์ฐ์๋, ํ๋ก์ธ์ค ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ฉ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(DLL ์ฝ๋)์ ์ง์ BP๋ฅผ ๊ฑธ์ด๋ด์ผ ํ๋ค. API๋ผ๋ ๊ฒ์ OS์์ ์ ๊ณตํ๋ ํจ์์ด๊ณ , ์ค์ ๋ก API๋ <C:\Windows\system32> ํด๋์ *.dll ํ์ผ ๋ด๋ถ์ ๊ตฌํ๋์ด์๋ค.
- ๊ฐ๋จํ ๋งํด์, ์ฐ๋ฆฌ๊ฐ ๋ง๋ ํ๋ก๊ทธ๋จ์ด ์ด๋ค ์๋ฏธ ์๋ ์ผ์ ํ๋ ค๋ฉด ๋ฐ๋์ OS์์ ์ ๊ณต๋ API๋ฅผ ์ฌ์ฉํด์ OS์๊ฒ ์์ฒญํด์ผ ํ๊ณ , ๊ทธ API๊ฐ ์ค์ ๊ตฌํ๋ ์์คํ DLLํ์ผ๋ค์ ์ฐ๋ฆฌ ํ๋ก๊ทธ๋จ์ ํ๋ก์ธ์ค ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ฉ ๋์ด์ผ ํ๋ค.
6. "Helloworld" ๋ฌธ์์ด ํจ์น
๋ชฉํ: ๋ฉ์์ง ๋ฐ์ค์ ํ์๋๋ "Hello World!" ๋ฌธ์์ด์ ๋ค๋ฅธ ๋ฌธ์์ด๋ก ๋ณ๊ฒฝํ๊ธฐ
๋ฌธ์์ด์ ํจ์นํ๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ
- ๋ฌธ์์ด ๋ฒํผ๋ฅผ ์ง์ ์์
- ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์๋ก์ด ๋ฌธ์ ์ด์ ์์ฑํ์ฌ ์ ๋ฌ
(1) ๋ฌธ์์ด ๋ฒํผ๋ฅผ ์ง์ ์์
//์ด ๋ฐฉ๋ฒ์ ์ ์ฒด ์์คํ ์ ์์ ์ฑ์ ๋จ์ด๋จ๋ฆด ์ ์๋ ๋ฐฉ๋ฒ์ด๋ฏ๋ก ๊ถ์ฅํ์ง ์์
- ๋คํ ์ฐฝ์์ Goto ๋ช ๋ น์ผ๋ก ๋ฌธ์์ด์ด ์ ์ฅ๋์ด์๋ ์ฃผ์์ธ 00402124 ์ฃผ์๋ก ์ด๋
- <๋คํ> ์ฐฝ์์ ctrl + g ํด์ ํด๋น ์ฃผ์๋ก ์ด๋
ctrl + e ๋จ์ถํค๋ฅผ ํตํด Edit ๋ค์ด์ผ๋ก๊ทธ๋ฅผ ๋์ด๋ค.
- keep size ํด์
- ์ ๋์ฝ๋์ "Hello Reversing" ์ ๋ ฅ -> OK
//์ ๋์ฝ๋์ ๋ฌธ์์ด์ 2๋ฐ์ดํธ ํฌ๊ธฐ์ NULL๋ก ๋๋์ผ ํ๋ค๋ ๊ฒ์ ์ฃผ์ํด์ผ ํจ
ํจ์น ์ฑ๊ณต
- ํ์ผ๋ก ์์ฑํ๊ธฐ
- ๋ณ๊ฒฝํ ๋ด์ฉ ์๊ตฌ ๋ณด๊ด์ ์ํ ๊ฒ (๋๋ฒ๊ฑฐ ์ข ๋ฃํ๋ฉด ํจ์นํ๋ ๋ด์ฉ ์ฌ๋ผ์ง)
- dump์ฐฝ์์ ๋ณ๊ฒฝ๋ ๋ถ๋ถ ์ ํ ํ ๋ง์ฐ์ค ์ฐ์ธก -> Copy to executable file -> Hex ์ฐฝ ๋ํ๋๋ฉด ๋ง์ฐ์ค ์ฐ์ธก -> Save file ์ ํ ํ ์ ์ฅ
(2) ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์๋ก์ด ๋ฌธ์์ด์ ์์ฑํ์ฌ ์ ๋ฌ
๋ ์ชฝ ๋น ์นธ ์ ๋นํ ๊ณณ(Null Padding)์ ๋ฌธ์์ด ์ ๋ ฅํด์ฃผ๊ธฐ
- ๋ฌธ์์ด์ 00403090์ ์ ์ฅ๋์ด ์๋ค.
์๋ก์ด ๋ฌธ์์ด์ ์ ๋ ฅํ ๋ฒํผ ์ฃผ์(403090)๋ฅผ MessageBoxW ํจ์์ ๋๊ฒจ์ค๋ค.
ํจ์น ์ฑ๊ณต