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โ
(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" ์ด ํ์คํ ๊ฒ์ ์ ์ ์๋ค.