๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ”ง ๋ฆฌ๋ฒ„์‹ฑ

Dreamhack ๋ฆฌ๋ฒ„์‹ฑ ๋ฌธ์ œํ’€์ด: rev-basic-9

by ๋ถˆํƒ€๋Š” ์ฐธ์ƒˆ 2023. 11. 1.

sub_140001000 ํ•จ์ˆ˜๋กœ ์ฐธ๊ฑฐ์ง“ ํŒ๋‹จํ•ด ์ถœ๋ ฅ.

๊ทธ๊ฒŒ ์–ด๋–ค ํ•จ์ˆ˜์ธ์ง€ ๋“ค์–ด๊ฐ€์„œ ์‚ดํŽด๋ดค๋‹ค.

v4๊ฐ€ sub_140001000 ํ•จ์ˆ˜์— ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋“ค์–ด๊ฐ”๋‹ค. ์ฆ‰ al์ด v4, ์ž…๋ ฅ๊ฐ’์„ ๋ฐ›์•˜๋‹ค.

์ž…๋ ฅ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๊ฐ€ v3์— ์ €์žฅ๋๊ณ  (6๋ฒˆ์งธ์ค„)

์ปดํ“จํ„ฐ๋Š” 0์ด๋ฉด ๊ฑฐ์ง“ 0์ด ์•„๋‹Œ ๋ชจ๋“  ๊ฒŒ ์ฐธ์ด๋ฏ€๋กœ (๋ฌธ์ž์—ด์˜ ๊ธธ์ด+1)์ด 8๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€๋ฉด return 0๋œ๋‹ค.

๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋Š” 8์˜ ๋ฐฐ์ˆ˜์—ฌ์„œ๋Š” ์•ˆ๋œ๋‹ค.(7๋ฒˆ์งธ์ค„)

 

๊ทธ ๋‹ค์Œ ์ค„์—์„œ๋Š” for๋ฌธ์ด ๋“ฑ์žฅํ•œ๋‹ค.

i๊ฐ€ (0xv3+1)๋ฒˆ ๋™์•ˆ 8์”ฉ ์ฆ๊ฐ€ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด์„œ sub_1400010A0 ํ•จ์ˆ˜์— ์ž…๋ ฅ๋ฌธ์ž์—ด[ i ]์˜ ์ฃผ์†Œ๊ฐ’์„ ์ค€๋‹ค.

๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ์ž…๋ ฅ ๋ฌธ์ž์—ด์˜ 0๋ฒˆ์งธ, 8๋ฒˆ์งธ...v3๋ณด๋‹ค ์ž‘์œผ๋ฉด์„œ ํ•˜์—ฌํŠผ 8์˜ ๋ฐฐ์ˆ˜๋ฒˆ์งธ ๋ฌธ์ž์˜ ์ฃผ์†Œ๋ฅผ sub ํ•จ์ˆ˜์— ๊ณ„์† ์ฃผ๋Š”๊ฑฐ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ memcmp๋ผ๋Š” ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

ํ™•์ธํ•ด๋ณผ ๊ฒƒ์€ ๋”ฐ๋ผ์„œ ๋‘ ๊ฐœ๋‹ค.

sub_1400010A0

memcmp

 

์ผ๋‹จ sub_1400010A0๋ถ€ํ„ฐ ๋ณด์ž.

์Œ...

์ผ๋‹จ ์•„๊นŒ ๋ดค๋˜ ๊ฒƒ์ฒ˜๋Ÿผ ๋งค๊ฐœ๋ณ€์ˆ˜ '์ž…๋ ฅ๋ฌธ์ž์—ด[ i ]์˜ ์ฃผ์†Œ๊ฐ’'์„ al๋กœ ๋ฐ›์•˜๋‹ค.

๊ทธ๋ฆฌ๊ณ  3๋ฒˆ์งธ ์ค„๋ถ€ํ„ฐ 7๋ฒˆ์งธ ์ค„๊นŒ์ง€๋Š” ๋ณ€์ˆ˜ ์„ ์–ธ์ด๋‹ˆ๊นŒ pass

๊ทธ ๋‹ค์Œ ์ค„๋ถ€ํ„ด ํ•˜๋‚˜์”ฉ ๋”ฐ์ ธ๋ณด์ž...

 

9๋ฒˆ์งธ ์ค„: "I_am_KEY"๋ฌธ์ž์—ด v5์— ๋ณต์‚ฌ

10๋ฒˆ์งธ ์ค„: result=์ž…๋ ฅ๊ฐ’ ๋ฌธ์ž์—ด[ i ] (8*n๋ฒˆ์งธ ๋ฌธ์ž)

11๋ฒˆ์งธ ์ค„: v2์— ์ž…๋ ฅ๊ฐ’ ๋ฌธ์ž์—ด[ i ] (8*n๋ฒˆ์งธ ๋ฌธ์ž)

12๋ฒˆ์งธ ์ค„: ๋ญ”๊ฐ€๋ฅผ 16๋ฒˆ ๋ฐ˜๋ณตํ•œ๋‹ค. ๋ญ”์ง€๋Š” ๋’ค์— ๋‚˜์˜ค๊ฒ ์ง€ ๋ญ..

 

14๋ฒˆ์งธ~18๋ฒˆ์งธ ์ค„:

์•„๋ž˜ ์ค„์„ 8๋ฒˆ ๋ฐ˜๋ณตํ•œ๋‹ค.

 

1) v2 = __ROR1__(a1[((_BYTE)j + 1) & 7] + byte_140004020[(unsigned __int8)v5[j] ^ v2]5);
2) a1[((_BYTE)j + 1) & 7] = v2;

 

1)์„ค๋ช…: ์ฃผํ™ฉ์ƒ‰ ๋ถ€๋ถ„๊ณผ ํŒŒ๋ž€์ƒ‰ ๋ถ€๋ถ„์„ ROR ํ•ด์ค€๋‹ค. ROR ํ•จ์ˆ˜๋Š” rev_basic_7์—์„œ ํ’€์–ด๋ดค๋“ฏ ๋น„ํŠธ๋ฅผ count ๋งŒํผ shift ํ•œ๋‹ค.

์ฃผํ™ฉ์ƒ‰ ๋ถ€๋ถ„์„ ์ •๋ฆฌํ•ด๋ณด๋ฉด a1[ ( j + 1) & 7 ] + byte_140004020[ v5[ j ] ^ v2]์ด๋‹ค. (a1, v2๋Š” ์ž…๋ ฅ์ฃผ์†Œ๊ฐ’, v5๋Š” "I_am_KEY")

2)์„ค๋ช…: a1์ฆ‰ ์ž…๋ ฅ ๋ฌธ์ž์˜ [( j + 1 ) & 7]๋ฒˆ์งธ์— v2 ๊ฐ’์„ ๋„ฃ์–ด์ค€๋‹ค. ์ฆ‰ ์œ„์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ์ž…๋ ฅ๊ฐ’์— ๋„ฃ๋Š” ๊ฑฐ๋‹ค.

byte_140004020๊ฐ€ ๋ญ”๊ฐ€ ํ•ด์„œ ๊ทธ ์ฃผ์†Œ ์•ˆ์œผ๋กœ ๋“ค์–ด๊ฐ€ ๋ณด๋‹ˆ๊นŒ ์ด๋Ÿฐ ๊ฐ’๋“ค์ด ์ €์žฅ๋˜์–ด์žˆ๋‹ค.

๋””๋ฒ„๊ฑฐ์—์„  ์–ด๋”” ์žˆ๋Š”์ง€ ๋ชป ์ฐพ๊ฒ ์–ด์„œ ๊ทธ๋ƒฅ IDA์—์„œ ์ฐพ์•„์คฌ๋‹ค..ใ…Žใ…Ž

 

19๋ฒˆ์งธ ์ค„: ๋งจ ๋งˆ์ง€๋ง‰์— i๊ฐ€ 16์ด ๋˜์–ด ๋ฐ˜ํ™˜ ๋˜๋Š” result๋„ 16์ด๋‹ค.

 

์ด์ œ memcmp ํ•จ์ˆ˜๋ฅผ ์‚ดํŽด๋ด์•ผ๊ฒ ๋‹ค.

์ด ํ•จ์ˆ˜๋Š” 3๊ฐœ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง€๋Š”๋ฐ ์ฒซ ๋ฒˆ์งธ๋Š” ์•ž์„  ํ•จ์ˆ˜์—์„œ ๋ณ€ํ™”๋œ a1(์ž…๋ ฅ๊ฐ’), ๋‘˜์งธ๋Š” unk_140004000์˜ ์ฃผ์†Œ, ์…‹์งธ๋Š” 0x19ui64์ด๋‹ค. ์ด๋•Œ memcmp() ํ•จ์ˆ˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ s1๊ณผ s2์˜ ์ฒ˜์Œ n ๋ฐ”์ดํŠธ๋ฅผ ๋น„๊ตํ•œ๋‹ค.

๊ฐ™์œผ๋ฉด 1, ๋‹ค๋ฅด๋ฉด 0์„ ๋ฐ˜ํ™˜ํ•˜๋Š”๋ฐ ์ด ๊ฐ’์ด 1์ด ๋˜์–ด์•ผ ํ•˜๋‹ˆ๊นŒ,

์ „์˜ ํ•จ์ˆ˜์—์„œ ๋ณ€ํ™” ์‹œํ‚จ ์ž…๋ ฅ ๊ฐ’์ด unk_140004000 ์ฃผ์†Œ์— ๋“  ๊ฐ’๊ณผ ๊ฐ™์•„์•ผ ํ•œ๋‹ค๋Š” ์ด์•ผ๊ธฐ๋‹ค.

์ด์ œ ๋””๋ฒ„๊ฑฐ๋ฅผ ์—ด์–ด์„œ ์ฐพ์•„์ค„ ๊บผ๋‹ค.

๋ฌธ์ž์—ด ์ฐธ์กฐ๋กœ ๋ฉ”์ธ ํ•จ์ˆ˜๋ฅผ ์ฐพ์€ ๋’ค sub_140001000 ํ•จ์ˆ˜๋ฅผ ์ฐพ์•„์ค€๋‹ค. ๋””๋ฒ„๊ฑฐ ์ƒ์—์„  ์ € ํšŒ์ƒ‰ ํ‘œ์‹œ๋œ ํ•จ์ˆ˜๊ฐ€ ๋˜๊ฒ ๋‹ค.

๊ทธ ํ•จ์ˆ˜๋กœ ๋“ค์–ด๊ฐ€์„œ ์œ ์ผํ•˜๊ฒŒ ๋ณด์ด๋Š” ์ฃผ์†Œ ๊ฐ’์ธ 00007FF62D631071์„ ์ฐพ์•„์ค€๋‹ค.

์ด๊ฒŒ unk_140004000์ผ ๊ฒƒ์ด๋‹ค.

๋คํ”„์—์„œ ๋”ฐ๋ผ๊ฐ€๊ธฐ ํ•˜๋ฉด ์œ„์˜ ์‚ฌ์ง„ ์•„๋ž˜์ชฝ ๋คํ”„์— ๋ณด์ด๋Š” 7E... ๋“ฑ์˜ ์ €์žฅ๋œ ๊ฐ’์ด ๋ณด์ธ๋‹ค.

์ด์ œ ๊ฑฐ๊พธ๋กœ ์ •๋‹ต ๋ฌธ์ž์—ด์„ ๊ตฌํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด์ž.

int main(void)
{
	int i, j;
	int byte_140004020[]={99, 124, 119, 123, 242, 107, 111, 197, 48, 1, 103, 43,
  	254, 215, 171, 118, 202, 130, 201, 125, 250, 89, 71,
  	240, 173, 212, 162, 175, 156, 164, 114, 192, 183, 253,
  	147, 38, 54, 63, 247, 204, 52, 165, 229, 241, 113, 216,
  	49, 21, 4, 199, 35, 195, 24, 150, 5, 154, 7, 18, 128,
  	226, 235, 39, 178, 117, 9, 131, 44, 26, 27, 110, 90,
  	160, 82, 59, 214, 179, 41, 227, 47, 132, 83, 209, 0,
  	237, 32, 252, 177, 91, 106, 203, 190, 57, 74, 76, 88,
  	207, 208, 239, 170, 251, 67, 77, 51, 133, 69, 249, 2,
  	127, 80, 60, 159, 168, 81, 163, 64, 143, 146, 157, 56,
  	245, 188, 182, 218, 33, 16, 255, 243, 210, 205, 12,
  	19, 236, 95, 151, 68, 23, 196, 167, 126, 61, 100, 93,
  	25, 115, 96, 129, 79, 220, 34, 42, 144, 136, 70, 238,
  	184, 20, 222, 94, 11, 219, 224, 50, 58, 10, 73, 6, 36,
  	92, 194, 211, 172, 98, 145, 149, 228, 121, 231, 200,
  	55, 109, 141, 213, 78, 169, 108, 86, 244, 234, 101,
  	122, 174, 8, 186, 120, 37, 46, 28, 166, 180, 198, 232,
  	221, 116, 31, 75, 189, 139, 138, 112, 62, 181, 102,
  	72, 3, 246, 14, 97, 53, 87, 185, 134, 193, 29, 158,
  	225, 248, 152, 17, 105, 217, 142, 148, 155, 30, 135,
  	233, 206, 85, 40, 223, 140, 161, 137, 13, 191, 230,
  	66, 104, 65, 153, 45, 15, 176, 84, 187, 22};
  
  	int unk_140004000[]={ 0x7E, 0x7D, 0x9A, 0x8B, 0x25, 0x2D, 0xD5, 0x3D,
    0x03, 0x2B, 0x38, 0x98, 0x27, 0x9F, 0x4F, 0xBC,
    0x2A, 0x79, 0x00, 0x7D, 0xC4, 0x2A, 0x4F, 0x58};
    
    char ch_arr[10]={"I_am_KEY"};
	
	for(i=33;j<127;j++)
	
	for(i=0;i<0x16;i++)
	{
		for(j=0;j<0x8;j++)
		{
			arr[(j+1)&7]=arr[(j+1)&7]+byte_140004020[ch_arr[j]^answer[k]
		}
	}
}

์ž‘์„ฑ์„..... ํ•ด๋ด์•ผ ํ•˜๋Š”๋ฐ.................เฒฅ_เฒฅ 

์•„์Šคํ‚ค์ฝ”๋“œ 33๋ถ€ํ„ฐ 127๊นŒ์ง€ ๋Œ๋ ค์•ผ ํ•˜๋‚˜........ ์—ญ์œผ๋กœ ์•Œ์•„๋‚ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์€๋ฐ ๋จธ๋ฆฌ๊ฐ€ ์•ˆ ๋Œ์•„๊ฐ„๋‹ค.....