์ฝ๋์์ง ์ฌ์ดํธ
๋ชฉํ๊ฐ : 'Cracked by: CodeEngn!'์ด ์ถ๋ ฅ๋๊ฒ ํ๋ ํ์ผ ๋ด๋ถ ๋ฐ์ดํฐ
์คํ์ ์์ผ๋ ํฌ๊ฒ ๋์ ๋๋ ๊ฒ์ ์์ต๋๋ค.
์ด์ ์ฌ๊ธฐ์ Cracked by: CodeEngn! ๋ฌธ์์ด์ ๋์์ผ ํฉ๋๋ค.
๋จผ์ ์ ํ๋ก๊ทธ๋จ์ ๋๋ฒ๊ฑฐ๋ก ์ด์ด์ฃผ๊ฒ ์ต๋๋ค.
๋๊ทผ๋๊ทผ
ํจํน์ ๋์ด์์ง ์์ต๋๋ค.
๋ณธ๊ฒฉ์ ์ผ๋ก ๊ตฌ์กฐ๋ฅผ ์ดํด๋ณผ๊น์?
๋จผ์ , CreatFileA ํจ์๋ฅผ ํธ์ถํฉ๋๋ค. CRACKME3.KEY ๋ผ๋ ํ์ผ์ ์ด์ด์ค๋๋ค.
์๋๋ CreateFileA ํจ์์ ๊ตฌ์กฐ์์.
HANDLE CreateFileA( LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile );
์ฒซ ๋ฒ์งธ ์ธ์์ธ lpFileName์ ํ์ผ์ ์์ฑํ๊ฑฐ๋ ์ด ๊ฒฝ๋ก, ์ฆ ํ์ผ ์ด๋ฆ์
๋๋ค.
์ค๋ฅธ์ชฝ ์ฃผ์์ผ๋ก lpFileName์ ๊ฐ์ด CRACKME3.KEY์์ ํ์ธํ ์ ์์ต๋๋ค.
ํ์ผ์ ๋ํด ์ด๋ค ํ๋์ ์ทจํ ์ง๋ 5๋ฒ์งธ ์ธ์์ธ dwCreationDisposition์ ๋ณด๋ฉด ์ ์ ์์ต๋๋ค.
ํ์ฌ ์ด ๊ฐ์ OPEN_EXISTING (3)์ผ๋ก, ์กด์ฌํ ๊ฒฝ์ฐ์๋ง ํ์ผ์ ์ด๊ณ , ๋ง์ฝ ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ ERROR_FILE_NOT_FOUND ์๋ฌ๋ฅผ ๋ฐ์์ํต๋๋ค.
๊ทธ๋ ๋ค๋ฉด, CRACKME3.KEY ๋ผ๋ ํ์ผ์ด ์์ ๋ -1(FFFFFFFF)์ ๋ฐํํ๊ณ ์คํจํ๊ฒ ์ฃ ?
์ผ๋จ CRACKME3.KEY ํ์ผ์ ํ๋ ๋ง๋ค์ด์ผ๊ฒ ๋ค์.
๋ฐ๋ก ๋ฐ์์๋ ReadFile ํจ์๋ก CRACKME3.KEY ํ์ผ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ต๋๋ค.
์ด๊ฒ์ด ReadFile ํจ์์ ๊ตฌ์กฐ์
๋๋ค.
BOOL ReadFile( HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped );
ํจ์ ํธ์ถ ๋ฐ๋ก ๋ค์์ ์กฐ๊ฑด๋ถ๊ธฐ๋ฌธ์ผ๋ก ๋น๊ต๋๋ ๊ฐ์ ReadFile ํจ์์ ๋ค ๋ฒ์งธ ์ธ์๋ค์.
์ด๋ก ๋ฏธ๋ฃจ์ด๋ณด์, ํ์ผ์ ํฌ๊ธฐ๋ 0x12byte, ์ฆ 18byte๊ฐ ๋์ด์ผ ํฉ๋๋ค.
CRACKME3.KEY ํ์ผ์ ์์ฑํด์ค ๋ค, ํ์ผ ํฌ๊ธฐ๋ฅผ 18byte๋ก ๋ง์ถฐ์ฃผ๋ฉด ์ด ๋ถ๋ถ์ ๋ฌด์ฌํ ๊ฑด๋ ๋ธ ์ ์์ต๋๋ค.
ํ ๋จ๊ณ๋ ํต๊ณผํ์ผ๋ ๋ค์ ๋จ๊ณ๋ก ๋์ด๊ฐ ๋ด
์๋ค.
ํ์ผ ๋ด์ฉ์ ๋ด์ ๋ฒํผ๋ฅผ ์ธ์๋ก ๋๊ธด ๋ค ํ ํจ์๋ฅผ ํธ์ถํฉ๋๋ค.
์ด๋ค ๊ธฐ๋ฅ์ ํ๋์ง ํจ์ ๋ด๋ถ๋ก ์ง์
ํด ๋ถ์ํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
<20.sub_401311>
ํ์ผ ๋ด์ฉ์ ํ๊ธ์์ฉ A~N๊น์ง์ ์์์ xor ์ฐ์ฐ์ ์งํํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด ํ ๊ธ์๋ค์ 4020F9๋ผ๋ ๊ณณ์ ๋ํฉ๋๋ค.
์ฝ๋๋ก ์ถ๋ ค๋ณด์๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
for(int i=0, j=0x41; j<0x4E; i++, j++){ buf[i] ^= j; //buf์๋ ํ์ผ ๋ด์ฉ์ด ๋ค์ด์์ _4020F9 += buf[i]; }
๊ฐ๊ณต๋ 4020F9 ๋ด๋ถ์ ๊ฐ์ 0x12345678๊ณผ xor ํฉ๋๋ค.
๊ตณ์ด ๊ณ์ฐํ์ง ์๊ณ follow in dump ๊ธฐ๋ฅ์ผ๋ก ์ด ๊ฐ์ ์ฐพ์ ์ ์๊ธฐ ๋๋ฌธ์ ์๋ตํ๊ฒ ์ต๋๋ค.
๊ทธ ํ์, ์ ํจ์ ๋ด์์ A~N์ผ๋ก xor ๊ฐ๊ณต๋ buf๋ฅผ ์ธ์๋ก ๋ ๋ค๋ฅธ ํจ์๋ฅผ ํธ์ถํฉ๋๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก ์ง์
ํด ํ๋์ฉ ๋ถ์ํด๋ณด๊ฒ ์ต๋๋ค.
<20.sub_40133C>
๊ตฌ์กฐ๋ ๊ฐ๋จํฉ๋๋ค.
[esp+4]์ ์ฃผ์์๋ CRACKME3.KEY์ ๋ด์ฉ์ด ๋ค์ด์๋๋ฐ, ์ด๋ฅผ esi์ ์ฎ๊ธด ๋ค, E๋ฅผ ๋ํด ๋ง์ง๋ง 4byte๋ง ๋จ๊น๋๋ค.
(0x12-0x0E = 4)
์๋ ์ดํด๋ฅผ ๋๊ธฐ ์ํด ๋ง๋ ๊ทธ๋ฆผ์
๋๋ค.
๊ทธ๋ฌ๋ฏ๋ก eax๋ ํ์ผ์ ๋ง์ง๋ง 4byte๋ฅผ ๋ฆฌํ์๋์ธ์ ๋ฐ๋ผ ๋ค์์๋ถํฐ ๊ฑฐ๊พธ๋ก ๋ฐฐ์ดํ ๊ฐ์ด ๋๊ฒ ์ต๋๋ค.
eax๋ฅผ ๊ฐ๊ณตํ๊ณ ๋ฆฌํดํ ํ, ์ด ๊ฐ์ ์์ ๊ฐ๊ณตํ๋ 4020F9 ๊ฐ๊ณผ ๋น๊ตํฉ๋๋ค.
์ผ๋จ eax์ ๊ฐ๊ณผ 4020F9์ ๊ฐ์ด ๋ค๋ฅธ ์ํ์์ ๊ณ์ ์งํ์ ํ๋ค ๋ณด๋ฉด ๋ฐ๋ก ๋ฆฌํดํด๋ฒ๋ฆฝ๋๋ค.
Cracked by: ๋ก ์์ํ๋ ๋ฌธ์์ด์ด ret ๋ช
๋ น์ด ๋ฐ์ ์๋ ๊ฒ์ผ๋ก ๋ณด์์ ๋, ์ด ret ๋ช
๋ น์ด๋ฅผ ๋ฐ๋ก ์คํํ์ง ์๊ฒ ์์ ์กฐ๊ฑด๋ถ๊ธฐ๋ฌธ์ ์ ์ ํ ํ์ฉํด์ผ ํฉ๋๋ค.
๊ทธ๋ ๊ฒ ๋๋ฉด, 004010BC ์ฃผ์์ je ๋ช
๋ น์ด๋ฅผ ์คํํด์ผ ํ๊ฒ ๊ณ , ๊ทธ๋ฌ๊ธฐ ์ํด์๋ eax์ ๊ฐ์ด 0์ด ๋์ด์ผ ํฉ๋๋ค.
sete al ๋ช
๋ น์ด๊ฐ ๋์ ๋๋ค์.
eax์ 4020F9์ ๊ฐ์ ๋น๊ตํด ZF๊ฐ 1๋ก ์ธํ
๋๋ฉด al = 1๋ก ๋ง๋ ํ ์ด ๊ฐ์ ์คํ์ ๋ฐฑ์
ํฉ๋๋ค.
์ ์ฝ๋๋ ์ฑ๊ณต์ ๋ฌธ์์ด์ ์ถ๋ ฅํ๋ ๋ถ๋ถ์
๋๋ค.
์์ push๋ eax ๊ฐ์ pop์ผ๋ก ๋ณต๊ตฌํด์ค ํ, ์ด ๊ฐ์ด 1์ด๋ผ๋ฉด ์ฑ๊ณต ๋ฌธ์์ด์ ์ถ๋ ฅํฉ๋๋ค.
๋ฐ๋ผ์ eax์ 4020F9 ๋ด๋ถ์ ๊ฐ์ ๊ฐ์์ผ ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ฑ๊ณต ๋ฌธ์์ด์ ์ถ๋ ฅํ๋ฉฐ, 402008์ ๋ฌธ์์ด์ ํจ๊ป ํจ์์ ์ธ์๋ก ์ ๋ฌํฉ๋๋ค.
402008์ ๋ด์ฉ์ ์๋ง Cracked by: _________! ์ ๋น์นธ์ ๋ค์ด๊ฐ ๋ด์ฉ์ธ ๋ฏ ํฉ๋๋ค.
๋ํ ์ฌ๊ธฐ์๋ ํ์ผ์ 14๊ธ์๋ฅผ A~N์ผ๋ก xor ํ ๋ด์ฉ์ด ์ ์ฅ๋์ด์๊ธฐ๋ ํฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด, A xor B = C, A = B xor C๋ผ๋ xor ์ฐ์ฐ์ ํน์ง์ ์ด์ฉํด ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
char str[] = "CodeEngn"; int i, j; for(i=0, j=0x41; j<0x4E; i++, j++){ printf("%x ",str[i]^j); }
์ฐ๋ฆฌ๋ CodeEngn์ด๋ผ๋ ๋ฌธ์์ด์ ์ถ๋ ฅํด์ผ ํ๊ธฐ ๋๋ฌธ์ str ๋ฐฐ์ด์ "CodeEngn'์ด๋ผ๋ ๋ฌธ์์ด์ ์ ์ฅํ์ต๋๋ค.
๊ทธ ๋ค, A๋ถํฐ N๊น์ง์ ๊ฐ๊ณผ xor ํด ์ค ๊ฐ์ ์ถ๋ ฅํฉ๋๋ค.
์ถํ์ ์ด ๊ฐ์ ๋ค์ A~N๊น์ง xor์ ๊ฑฐ์น๊ธฐ ๋๋ฌธ์ ๋ค์ CodeEngn์ด๋ผ๋ ๋ฌธ์์ด๋ก ๋์์ฌ ๊ฒ ์
๋๋ค.
HxD๋ก CRACKME3.KEY ํ์ผ์ ์ฐ ๋ค, ์ ์ฝ๋๋ก ์ถ๋ ฅ๋ ๊ฐ์ผ๋ก 13byte๋ฅผ ์ฑ์์ค๋๋ค.
๊ทธ๋ ์ง๋ง ๊ทธ๋๋ก ์คํํ๋ฉด CodeEngn ๋ฟ ๋ง ์๋๋ผ, ๋ค์ ๋ถ๊ฐ์ ์ธ ๋ฌธ์์ด์ด ๋ถ์ ๊ฒ ์
๋๋ค. (๋ฌธ์์ด์ ๋์ NULL์ด๋ผ๋ ์ ์ ๊ธฐ์ตํด ๋์๊ธฐ ๋ฐ๋๋๋ค.)
๊ทธ๋์ ์ด ๊ฐ์ j์ xor ํ ๋, 0x00์ผ๋ก ๋ง๋ค์ด ์ค ๊ฒ ์
๋๋ค.
CodeEngn์ 8๊ธ์์ด๋, ๋๋จธ์ง 6๊ธ์๋ ๊ฐ๊ฐ 0x49, 0x4A~0x4E๊น์ง xor ๋ ๊ฒ๋๋ค.
๊ทธ๋ ๋ค๋ฉด CodeEngn ๋ฌธ์์ด์ด ๋๋๋ ์ง์ ์ ๊ฐ๊ฐ 49, 4A, 4B, 4C, 4D, 4E์ ๊ฐ์ ์ฑ์์ค ๋ค, ๋๋ฒ๊ฑฐ๋ฅผ ์คํํ๋ฉฐ 4020F9์ ๊ฐ์ ์ฐพ์ ํ์ผ์ ๋ง์ง๋ง 4byte๋ฅผ ์ฑ์์ค๋๋ค.
์ด๋ ๊ฒ ๋ง์ด์ฃ .
์ด์ ํ๋ก๊ทธ๋จ์ ์คํํ๋ฉด Cracked by: CodeEngn! ๋ฌธ์์ด์ด ์ ์์ ์ผ๋ก ์ถ๋ ฅ๋๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
'reverse engineering > CodeEngn' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[CodeEngn] Basic RCE L19 ๋ฌธ์ ํ์ด (0) | 2021.01.30 |
---|---|
[CodeEngn] Basic RCE L18 ๋ฌธ์ ํ์ด (0) | 2020.12.26 |
[CodeEngn] Basic RCE L17 ๋ฌธ์ ํ์ด (0) | 2020.12.18 |
[CodeEngn] Basic RCE L16 ๋ฌธ์ ํ์ด (0) | 2020.12.17 |
[CodeEngn] Basic RCE L15 ๋ฌธ์ ํ์ด (2) | 2020.12.15 |