Hack The Planet

๋ฐ˜๊ฐ‘์Šต๋‹ˆ๋‹ค, cyalume์˜ ๋ธ”๋กœ๊ทธ์ž…๋‹ˆ๋‹ค.

reverse engineering/CodeEngn

[CodeEngn] Basic RCE L20 ๋ฌธ์ œํ’€์ด

cyalume 2021. 3. 27. 01:06

์ฝ”๋“œ์—”์ง„ ์‚ฌ์ดํŠธ

๋ชฉํ‘œ๊ฐ’ : '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! ๋ฌธ์ž์—ด์ด ์ •์ƒ์ ์œผ๋กœ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.