1. ํจ์ ํธ์ถ ๊ท์ฝ
(1) Calling Convention(ํจ์ ํธ์ถ ๊ท์ฝ)
- 'ํจ์๋ฅผ ํธ์ถํ ๋ ํ๋ผ๋ฏธํฐ๋ฅผ ์ด๋ค ์์ผ๋ก ์ฒ๋ฆฌํ ๊น?'์ ๋ํ ์ผ์ข ์ ์ฝ์
- ํจ์ ํธ์ถ ์ ์ ํ๋ผ๋ฏธํฐ๋ฅผ ์คํ์ ํตํด์ ์ ๋ฌํ๋ค.
- ์คํ์ด๋ ํ๋ก์ธ์ค์์ ์ ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด๋ฉฐ ์๋ ๋ฐฉํฅ(์ฃผ์๊ฐ ์ค์ด๋๋ ๋ฐฉํฅ)์ผ๋ก ์๋๋ค. ๋ํ PE ํค๋์ ๊ทธ ํฌ๊ธฐ๊ฐ ๋ช ์๋์ด ์๋ค.
- ์ฆ, ํ๋ก์ธ์ค๊ฐ ์คํ๋ ๋ ์คํ ๋ฉ๋ชจ๋ฆฌ์ ํฌ๊ธฐ๊ฐ ๊ฒฐ์ ๋๋ค
- ๊ทธ๋ ๋ค๋ฉด, ํจ์๊ฐ ์คํ ์๋ฃ๋์์ ๋ ์คํ์ ๋ค์ด์๋ ํ๋ผ๋ฏธํฐ๋ ์ด๋ป๊ฒ ๋ ๊น?
- ๊ทธ๋๋ก ๋๋ค.
- ์คํ์ ์ ์ฅ๋ ๊ฐ์ ์์๋ก ์ฌ์ฉํ๋ ๊ฐ์ด๊ธฐ ๋๋ฌธ์ ๋ ์ด์ ์ฌ์ฉํ์ง ์๋๋ค๊ณ ํ๋๋ผ๋ ๊ฐ์ ์ง์ฐ๊ฑฐ๋ ํ๋ฉด ๋ถํ์ํ๊ฒ CPU ์์์ ์๋ชจํ๋ค. ์ด์ฐจํผ ๋ค์์ ์คํ์ ๋ค๋ฅธ ๊ฐ์ ์ ๋ ฅํ ๋ ์ ์ ๋ก ๋ฎ์ด์ฐ์ด๋ ๋ฐ๋ค๊ฐ ์คํ ๋ฉ๋ชจ๋ฆฌ๋ ์ด๋ฏธ ๊ณ ์ ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ํด์ ๋ฅผ ํ ์ ์๊ณ ํ ํ์๋ ์๋ค.
- ํจ์๊ฐ ์คํ ์๋ฃ๋์์ ๋ ESP(์คํ ๋ฉ๋ชจ๋ฆฌ)๋ ์ด๋ป๊ฒ ๋๋์
- ESP ๊ฐ์ ํจ์ ํธ์ถ ์ ์ผ๋ก ๋ณต์๋์ด์ผ ํ๋ค. ๊ทธ๋์ผ ์ฐธ์กฐ ๊ฐ๋ฅํ ์คํ์ ํฌ๊ธฐ๊ฐ ์ค์ด๋ค์ง ์๋๋ค.
- ์คํ ๋ฉ๋ชจ๋ฆฌ๋ ๊ณ ์ ๋์ด ์๊ณ , ESP๋ก ์คํ์ ํ์ฌ ์์น๋ฅผ ๊ฐ๋ฅดํค๋๋ฐ, ๋ง์ฝ ESP๊ฐ ์คํ์ ๋์ ๊ฐ๋ฅดํจ๋ค๋ฉด ๋ ์ด์ ์คํ์ ์ฌ์ฉํ ์ ์๋ค. ํจ์ ํธ์ถ ํ์ ESP๋ฅผ ์ด๋ป๊ฒ ์ ๋ฆฌํ๋์ง์ ๋ํ ์ฝ์์ด ๋ฐ๋ก ํจ์ ํธ์ถ ๊ท์ฝ์ด๋ค.
- ์ฃผ์ ํจ์ ํธ์ถ ๊ท์ฝ
- cdecl
- stdcall
- fastcall
* ์ฐธ๊ณ
- Caller (ํธ์ถ์)
- Callee(ํผํธ์ถ์)
- ์๋ฅผ ๋ค์ด, main() ํจ์์์ printf()ํจ์๋ฅผ ํธ์ถํ๋ค๋ฉด Caller๋ main()์ด๊ณ , Callee๋ printf()์ด๋ค.
(2) cdecl
- ์ฃผ๋ก C์ธ์ด์์ ์ฌ์ฉ๋๋ ๋ฐฉ์์ด๋ฉฐ, Caller์์ ์คํ์ ์ ๋ฆฌํ๋ ํน์ง์ ๊ฐ์ง๊ณ ์๋ค.
#include "stdio.h"
int add(int a, int b)
{
return (a+b);
}
int main(int argc, char* argv[])
{
return add(1,2);
}
- add() ํจ์์ ํ๋ผ๋ฏธํฐ 1, 2๋ฅผ ์ญ์์ผ๋ก ์คํ์ ์ ๋ ฅ(PUSH)ํ๊ณ , add() ํจ์(401000)๋ฅผ ํธ์ถํ ํ ADD ESP, 8 ๋ช ๋ น์ผ๋ก ์คํ์ ์ ๋ฆฌํ๊ณ ์๋ค
- ์ด์ฒ๋ผ Caller์ธ main() ํจ์๊ฐ ์คํ์ ์ ๋ ฅํ ํจ์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ง์ ์ ๋ฆฌํ๋ ๋ฐฉ์์ด cdecl์ด๋ค.
(3) stdcall
- Win32 API์์ ์ฌ์ฉ๋๋ฉฐ, Callee์์ ์คํ์ ์ ๋ฆฌํ๋ ๊ฒ์ด ํน์ง์ด๋ค.
- C์ธ์ด๋ ๊ธฐ๋ณธ์ ์ผ๋ก cdecl ๋ฐฉ์์ด์ง๋ง, stdcall ๋ฐฉ์์ผ๋ก ์ปดํ์ผํ๊ณ ์ถ์ ๋๋ '_stdcall' ํค์๋๋ฅผ ๋ถ์ฌ์ฃผ๋ฉด ๋๋ค.
#include "stdio.h"
int _stdcall add(int a, int b)
{
return (a + b);
}
int main(int argc, char* argc[])
{
return add(1, 2);
}
- ์ด๋ฎค๋ํฐ ๋๋ฒ๊ฑฐ๋ก ๋๋ฒ๊น
ํ ์ฝ๋๋ฅผ ๋ณด๋ฉด main() ํจ์์์ add() ํจ์๋ฅผ ํธ์ถ ํ๊ณ ๋ ๋ค์ ์คํ ์ ๋ฆฌ ์ฝ๋(ADD ESP, 8)๊ฐ ์๋ต๋์ด ์๋ค.
- ์คํ์ ์ ๋ฆฌ๋ add() ํจ์์ ๋ง์ง๋ง RETN 8 ๋ช ๋ น์์ ์ํ๋๋ค
- RETN 8์ ์๋ฏธ๋ RETN + POP 8๋ฐ์ดํธ๋ก, ๋ฆฌํด ํ ์ง์ ๋ ํฌ๊ธฐ๋งํผ ESP๋ฅผ ์ฆ๊ฐ์ํค๋ ๊ฒ์ด๋ค
- ์ด์ฒ๋ผ Callee์ธ add() ํจ์ ๋ด๋ถ์์ ์คํ์ ์ ๋ฆฌํ๋ ๋ฐฉ์์ด stdcall ๋ฐฉ์์ด๋ค.
- โstcall ๋ฐฉ์์ ์ฅ์ ์ ํธ์ถ๋๋ ํจ์(Callee) ๋ด๋ถ์ ์คํ ์ ๋ฆฌ ์ฝ๋๊ฐ ์กด์ฌํ๋ฏ๋ก ํจ์๋ฅผ ํธ์ถํ ๋๋ง๋ค ADD ESP, XXX ๋ช ๋ น์ ์จ์ค์ผ ํ๋ cdecl ๋ฐฉ์์ ๋นํด์ ์ฝ๋ ํฌ๊ธฐ๊ฐ ์์์ง๋ค
- Win32 API๋ C์ธ์ด๋ก ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด์ง๋ง, ๊ธฐ๋ณธ cdecl ๋ฐฉ์์ด ์๋ stdcall ๋ฐฉ์์ ์ฌ์ฉํ๋ค
- ์ด๋ C ์ด์ธ์ ๋ค๋ฅธ ์ธ์ด์์ API๋ฅผ ์ง์ ํธ์ถํ ๋ ํธํ์ฑ์ ์ข๊ฒ ํ๊ธฐ ์ํด์์ด๋ค.
(4) fastcall
- ๊ธฐ๋ณธ์ ์ผ๋ก stdcall ๋ฐฉ์๊ณผ ๊ฐ์ง๋ง, ํจ์์ ์ ๋ฌํ๋ ํ๋ผ๋ฏธํฐ ์ผ๋ถ๋ฅผ ์คํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์๋ ๋ ์ง์คํฐ๋ฅผ ์ด์ฉํ์ฌ ์ ๋ฌํ๋ค๋ ๊ฒ์ด ํน์ง์ด๋ค
- ์ด๋ค ํจ์ ํ๋ผ๋ฏธํฐ๊ฐ 4๊ฐ๋ฉด, ์์ ๋๊ฐ์ ํ๋ผ๋ฏธํฐ๋ ๊ฐ๊ฐ ECX, EDX ํ๋ผ๋ฏธํฐ๋ฅผ ์ด์ฉํ์ฌ ์ ๋ฌํ๋ค.
- ์ด๋ฆ ๊ทธ๋๋ก ์กฐ๊ธ ๋ ๋น ๋ฅธ ํจ์ ํธ์ถ์ด ๊ฐ๋ฅํ๋ค (CPU ์ ์ฅ์์๋ ๋ฉ๋ฆฌ ์๋ ๋ฉ๋ชจ๋ฆฌ๋ณด๋ค CPU์ ๋ถ์ด ์๋ ๋ ์ง์คํฐ์ ์ ๊ทผํ๋ ๊ฒ์ด ํจ์ฌ ๋น ๋ฆ)
- ํ์ง๋ง, ํธ์ถ ์์ฒด๋ง ๋ณด๋ฉด ๋น ๋ฅด์ง๋ง, ECX, EDX ๋ ์ง์คํฐ๋ฅผ ๊ด๋ฆฌํ๋ ์ถ๊ฐ์ ์ธ ์ค๋ฒํค๋๊ฐ ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋ค.
- ๋ํ, ํจ์ ๋ด์ฉ์ด ๋ณต์กํ๋ค๋ฉด ECX,EDX ๋ ์ง์คํฐ๋ฅผ ๋ค๋ฅธ ์ฉ๋๋ก ์ฌ์ฉํ ํ์๊ฐ ์์ ๋ ์ญ์ ์ด๋ค์ด ๊ฐ์ง๊ณ ์๋ ํ๋ผ๋ฏธํฐ ๊ฐ์ ์ด๋๊ฐ์ ๋ฐ๋ก ์ ์ฅํด์ผ ํ๋ค.
2. Lena's Reversing for Newbiesโ
Tuts 4 You
Since its inception in 2003 Tuts 4 You has remained a non-commercial, independent community. Its primary role has been dedicated to the sharing of knowledge and information on reverse code engineering in many of the subject areas it spans, across the many
tuts4you.com
(1) ์คํ
- ๋ฉ์์ง ๋ฐ์ค๊ฐ ๋จ๋ฉฐ ๋๊ฐ์ง๋ฅผ ์ง์ํ๋ค.
- Nags๋ฅผ ์์ ๋ผ //ํด๋น ๋ฉ์์ง ๋ฐ์ค๊ฐ Nag Screen์ธ ๊ฒ์ ๋ณด์, ํด๋น ๋ฉ์์ง ๋ฐ์ค๋ฅผ ์ ๊ฑฐํ๋ผ๋ ์ด์ผ๊ธฐ๋ผ๊ณ ์ถ์ธก ๊ฐ๋ฅ
- ๋ง๋ registration code๋ฅผ ์ฐพ์๋ผ
- ํ์ธ์ ๋๋ฌ๋ณด๋ฉด Regcode๋ฅผ ์ ๋ ฅํ๋ ์นธ์ ํ์ธํ ์ ์๋ค.
- ํ๋๊ธ์จ๋ฅผ ์ฝ์ด๋ณด๋ฉด SmartCheck์ ์ด์ฉํ๋ผ๊ณ ๋์ด์๋ค
- SmartCheck์ด๋, registration์ ์ํด Numega ์ฌ์์ ๋ง๋ ์ ํธ๋ฆฌํฐ์ด๋ฉฐ, ํฌ๋์ปค๋ค์ด ์ ์ฉํ๋ ํด ์ค ํ๋์ด๋ค.
(2) ๋ถ์
- ๋ชฉํ1: ๋ฉ์์ง ๋ฐ์ค ์ ๊ฑฐ
- ์ด์ ์ 'abex crackme2'์์ ๋ณด์๋ visual basic ์ฝ๋์ด๋ค. //401162์ฃผ์์ MSVBM50.ThunRTMain์ด ๋ณด์ธ๋ค.
- ๋ฉ์์ง ๋ฐ์ค ์ ๊ฑฐ๋ฅผ ์ํด์๋ ๋ฉ์์ง ๋ฐ์ค ํธ์ถ ๋ถ๋ถ์ ์กฐ์ํ๋ฉด ๋ ๊ฒ์ด๋ค. visual basic์์ ๋ฉ์์ง ๋ฐ์ค ์ถ๋ ฅ ํจ์๋ MSVBM50.rtcMsgBox ์ด๋ค.
- search for - All intermodular calls (ํ๋ก๊ทธ๋จ์์ ์ฌ์ฉ๋๋ API ํธ์ถ ๋ชฉ๋ก) - Destination ์ ํ (ํจ์ ์ด๋ฆ ์์ผ๋ก ์ ๋ ฌ)
- rtcMsgbox๋ ์ด 4๊ตฐ๋ฐ์์ ํธ์ถ๋๋ ๊ฒ์ ์ ์ ์๋ค.
- ๋ง์ฐ์ค ์ฐ์ธก ํด๋ฆญ - set breakpoint on every call to rtcMsgBox (rtcMsgBox๊ฐ ํธ์ถ๋๋ ๋ชจ๋ ์ฝ๋์ Breakpoint ์ค์น)
- ๊ทธ ์ํ๋ก F9๋ก ์คํ์ ์ํจ๋ค
- 402CFE์์ ์คํ์ด ๋ฉ์ถ๋๋ฐ, ์กฐ๊ธ ์๋ก ์คํฌ๋กค์ ์ฌ๋ ค๋ณด๋ฉด ๋ฉ์์ง ๋ฐ์ค์ ๋ฌธ์์ด์ด ๋ณด์ธ๋ค.
- ์ฆ, ์ด ๋ถ๋ถ์ด ํ๋ก๊ทธ๋จ์ด ์์ํ ๋ ๋ํ๋๋ ๋ฉ์์ง ๋ฐ์ค๋ฅผ ์ถ๋ ฅํ๋ ์ฝ๋๋ผ๋ ๊ฒ์ด๋ค,
- ๊ณ์ F9๋ฅผ ํตํด์ ์คํ์์ผ๋ณด๋ฉด, ๋ฉ์์ง ๋ฐ์ค๊ฐ ๋ํ๋๊ณ , ํ์ธ์ ์ ํํ๋ฉด ๋ฉ์ธ ํ๋ฉด์ด ๋ํ๋๋ค.
- ๋ ์ถ๊ฐ๋ก, ๋ฉ์ธ ํ๋ฉด์์ Nag? ๋ฒํผ์ ๋๋ฅด๋ฉด 402CFE์์ ์คํ์ด ๋ฉ์ถ๋ค.
- ๋ฐ๋ผ์ ๋ฉ์์ง ๋ฐ์ค๋ ๋ชจ๋ ํ ์ฝ๋์์ ์คํ๋์๋ค๋ ๊ฒ์ ์ ์ ์์ผ๋ฏ๋ก, ๋ฉ์์ง ๋ฐ์ค๋ฅผ ์ ๊ฑฐํ๊ธฐ ์ํด์๋ ํ ๊ตฐ๋ฐ๋ง ํจ์นํ๋ฉด ๋ ๊ฒ์ด๋ค
(3) ํจ์นโ : ๋ฉ์์ง ๋ฐ์ค ์ ๊ฑฐ
//ํจ์นํ๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์์ ์ ์๋ค.
- 1์ฐจ ์๋
: 402CFE ์ฃผ์์ CALL ๋ช ๋ น์ด ์์
- ADD ESP,14
- rtcMsgBox()์ ์ ๋ฌ๋๋ ํ๋ผ๋ฏธํฐ์ ํฌ๊ธฐ(14)๋งํผ ์คํ์ ์ ๋ฆฌํ๋ผ๋ ์๋ฏธ
- ๋๋จธ์ง 2 ๋ฐ์ดํธ๋งํผ NOP์ผ๋ก ์ฑ์์ ์ฝ๋๊ฐ ๊นจ์ง์ง ์๋๋ก ํจ //์๋ CALL ๋ช ๋ น์ด์ ํฌ๊ธฐ: 5 ๋ฐ์ดํธ, ADD ๋ช ๋ น์ด 3 ๋ฐ์ดํธ๋ฅผ ์ฐ๊ณ ๋๋ฉด 2๋ฐ์ดํธ๊ฐ ๋จ๋๋ค.
- ๊ฒฐ๊ณผ - ์๋ฌ ๋ฐ์
- ์ด์ : rtcMsgBox() ํจ์์ ๋ฆฌํด๊ฐ์ ์ ๋๋ก ์ฒ๋ฆฌํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ
- 2์ฐจ ์๋
- ์คํฌ๋กค์ ์ฌ๋ผ๊ฐ๋ค๋ณด๋ฉด 402C17 ์ฃผ์์ ์คํ ํ๋ ์์ Prologue๋ฅผ ํ์ธํ ์ ์๋ค
- rtcMsgBox ํจ์ ํธ์ถ ์ฝ๋ ์ญ์ ๋ค๋ฅธ ํจ์ ๋ด๋ถ์ ์ํด ์๋ ์ฝ๋์ด๋ค. ๋ฐ๋ผ์, ์์ ํจ์๋ฅผ ํธ์ถํ์ง ๋ชปํ๊ฒ ํ๊ฑฐ๋ ์๋๋ฉด ๋ฐ๋ก ๋ฆฌํดํด๋ฒ๋ฆฌ๋ฉด ๊ฒฐ๊ตญ rtcMsgBox()ํจ์๋ ํธ์ถ๋์ง ์์ ๊ฒ์ด๋ค.
- 402C17 ๋ช ๋ น์ด๋ฅผ ์์ ํด์ ๋ฐ๋ก ๋ฆฌํดํด๋ฒ๋ฆฌ๋๋ก ํ๋ค.
(4) Registration Code ์ฐพ๊ธฐ
- ์๋ฌด ๊ฐ์ด๋ ์ ๋ ฅํ๋ฉด ๊ฒฝ๊ณ ์ฐฝ์ด ๋ฌ๋ค. ํด๋น ๋ฌธ์์ด์ ๊ฒ์ํด๋ณธ๋ค (search for - All referenced text strings)
- -๋ง์ฐ์ค๋ฅผ ๋๋ธํด๋ฆญํ์ฌ ํด๋น ์ฃผ์๋ก ์ด๋ํ๋ค.
- ์คํฌ๋กค์ ์กฐ๊ธ ์ฌ๋ ค๋ณด๋ฉด "I'mlena151" ์ด๋ผ๋ ๋ฌธ์์ด๊ณผ ๊ทธ ๋ฐ์ __vbaStrCmp() ํจ์ ํธ์ถ ์ฝ๋๊ฐ ์๋ค.
- __vbaStrCmp() API๋ ๋ฌธ์์ด์ ๋น๊ตํ๋ ํจ์์ด๋ค. ์ฆ, "I'mlena151" ๋ฌธ์์ด๊ณผ ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๋ฌธ์์ด์ ๋น๊ตํ๋ ๊ฒ์ด๋ค.
- ์ ํํ ํ์ธ์ ์ํด ์คํฌ๋กค์ ๋ ์ฌ๋ ค๋ณด๋ฉด ์ฑ๊ณต ๋ฉ์์ง ๋ฐ์ค๋ฅผ ํ์ธํ ์ ์๋ค
- 4028BD ์ฃผ์์ "I'mlena151" ๋ฌธ์์ด์ด ์๊ณ , ๊ทธ ๋ฐ์ __vbaStrCmp() ํจ์๊ฐ ์กด์ฌํ๋ค.
- ๋ฐ๋ผ์, RegCode๋ "I'mlena151" ์ด ํ์คํ ๊ฒ์ ์ ์ ์๋ค.