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

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

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

์ผ๋‹จ ๋“ค์–ด๊ฐ€์„œ ์•„๋ฌด๊ฑฐ๋‚˜ ์ž…๋ ฅํ•ด๋ดค๋‹ค.

IDA๋กœ ์—ด์–ด๋ดค๋‹ค. sub_120001000ํ•จ์ˆ˜์— ์˜ํ•ด ์ž…๋ ฅ ๊ฐ’์˜ ์ฐธ ๊ฑฐ์ง“์ด ํŒ๋‹จ๋œ๋‹ค.

๋“ค์–ด๊ฐ€๋ณด์ž.

๋“ค์–ด๊ฐ€๋ณด๋‹ˆ๊นŒ ๋ณต์žกํ•˜๋‹ค.

0x1C๋ฒˆ ๋ฌธ์ž๋ฅผ ๋น„๊ตํ•˜๋ผ๋‹ˆ๊นŒ ์•„๋งˆ๋„ ์ž…๋ ฅ๊ฐ’์€ 0x1C๊ฐœ์˜ ๋ฌธ์ž๋กœ ๊ตฌ์„ฑ๋œ ๋ฌธ์ž์—ด์ธ ๊ฒƒ ๊ฐ™๋‹ค. 

์–ด์ฉŒ๊ตฌ์ €์ฉŒ๊ตฌ ๊ณ„์‚ฐํ•ด์„œ ๊ฐ™์ง€ ์•Š์œผ๋ฉด return 0 ์ฆ‰ ๊ฑฐ์ง“์ด๋ผ๊ณ  ํŒ๋‹จํ•˜๋‹ˆ๊นŒ !=๊ฐ€ ์•„๋‹ˆ๋ผ =๊ฐ€ ๋˜๊ฒŒ ํ•ด์ค˜์•ผ ๋ ๋“ฏ!

๋””๋ฒ„๊ฑฐ๋กœ ์—ด์–ด์คฌ๋‹ค.

Input ๋ฌธ์ž์—ด ์ฐธ์กฐํ•ด ๋ฉ”์ธํ•จ์ˆ˜๋กœ ๋“ค์–ด๊ฐ€์คฌ๋‹ค.

์ด์ „ ๋ฌธ์ œ๋“œ๋กœ๊ฐ€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ test, je ์ง์ „ ํ•จ์ˆ˜๊ฐ€ ์ค‘์š”ํ•˜๊ฒ ๋‹ค.

ํ•จ์ˆ˜๋กœ ๋“ค์–ด๊ฐ€ ๋ดค๋‹ค.

rac๋ฅผ ์ด์šฉํ•ด compare ๋ช…๋ น์–ด๋กœ ๋น„๊ตํ•ด๊ฐ€๋ฉด์„œ ๋ช‡ ๋ฒˆ์งธ ๋ฌธ์ž์ธ์ง€ ์ฒดํฌํ•˜๊ณ  ์žˆ๋‹ค.

๊ทธ ๋ฐ‘์œผ๋กœ ์—ฌ๋Ÿฌ ๋ช…๋ น์–ด๊ฐ€ ๋ณด์ธ๋‹ค.

๋ชฐ๋ž๋˜ ๋ช…๋ น์–ด๋ฅผ ๊ธฐ๋กํ•ด๋ณด๋ฉด sar๋Š” ๋ถ€ํ˜ธ๋ฅผ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™ํ•˜๋Š” ๋ช…๋ น์–ด์ด๊ณ ,

shl์€ shift ์—ฐ์‚ฐ ๋ช…๋ น์–ด์ด๋‹ค.

ํ•˜์—ฌํŠผ ์ด๋Ÿฐ ๋ณต์žกํ•œ ๊ณ„์‚ฐ์„ ํ•ด์„œ 7FF6A20E3000 ์ฃผ์†Œ์— ๋“ค์–ด๊ฐ€ ์žˆ๋Š” ๊ฐ’์ด ๋กœ๋“œ ๋œ rdx๊ฐ€ ๋ฌธ์ž์—ด์˜ ์‹œ์ž‘์ ์ธ ์ •๋‹ต ๋ฌธ์ž์—ด๊ณผ ๋น„๊ตํ•˜๊ณ  ์žˆ๋‹ค.

7FF6A20E3000์— ๋ญ๊ฐ€ ๋“ค์–ด์žˆ๋‚˜ ๋คํ”„๋กœ ๋”ฐ๋ผ๊ฐ€๋ณด์ž.

 

0x24, 0x27, 0x13, 0xC6, 0xC6, 0x13, 0x16, 0xE6, 0x47, 0xF5, 0x26, 0x96, 0x47, 0xF5, 0x46, 0x27, 0x13, 0x26, 0x26, 0xC6, 0x56, 0xF5, 0xC3, 0xC3, 0xF5, 0xE3,0xE3๊ฐ€ ๋“ค์–ด์žˆ๋‹ค.

 

์ด์ œ IDA๋ฅผ ๋ณด๋ฉฐ ์–ด๋–ค ๊ณ„์‚ฐ์‹์ด์—ˆ๋Š”์ง€ ๊ตฌ์ฒด์ ์œผ๋กœ ์ƒ๊ฐํ•ด๋ณด์ž.

IDA์— ์ ํ˜€์žˆ๋˜ ๊ฒƒ์„ ๊ทธ๋Œ€๋กœ ๋ณต๋ถ™ํ•ด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

((unsigned __int8)(16 * *(_BYTE *)(a1 + i)) | ((int)*(unsigned __int8 *)(a1 + i) >> 4)) != byte_140003000[i]

 

์ด๊ฑธ ์ข€ ๋” ๋‹ค๋“ฌ์œผ๋ฉด, ์•„๋ž˜์™€ ๊ฐ™์ด ๋œ๋‹ค.

((16 * * ( ์ •๋‹ต ๋ฌธ์ž์—ด [ i ] ) | (( ์ •๋‹ต ๋ฌธ์ž์—ด [ i ]  ) >> 4) != ์ž…๋ ฅ๋ฌธ์ž

 

C++๋กœ ์ž‘์„ฑํ•ด๋ดค๋‹ค.

#include<stdio.h>
int main(void)
{
	int a, i;
	int arr[28]={0x24, 0x27, 0x13, 0xC6, 0xC6, 0x13, 0x16, 0xE6, 0x47, 0xF5, 0x26, 0x96, 0x47, 0xF5, 0x46, 0x27, 0x13, 0x26, 0x26, 0xC6, 0x56, 0xF5, 0xC3, 0xC3, 0xF5, 0xE3,0xE3}; 
	
	for(i=0;i<28;i++)
	{
		a=(16 * arr[i]) | arr[i] >> 4 ;
		printf("%c", a);
	}
	
	
	return 0;

}

C++๊ฒฐ๊ณผ๊ฐ’์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค. 28๊ธ€์ž์ธ๋ฐ๋„ ์ƒ๊ฐ๋ณด๋‹ค ์งง์•„ ๋ณด์ธ๋‹ค.

cmd ์ฐฝ์œผ๋กœ ์—ด์–ด์„œ ์ž…๋ ฅ๊ฐ’์— ์ž…๋ ฅํ•ด์ฃผ๋ฉด

Correct~๏ผˆ๏ฟฃ๏ธถ๏ฟฃ๏ผ‰โ†—ใ€€

์งˆ๋ฌธ (โŠ™_โŠ™)๏ผŸ
IDA์— ์ ํžŒ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด 16 ๊ณฑํ•˜๋ผ๋Š” ๋ช…๋ น์–ด๊ฐ€ ์žˆ๊ณ  F0 AND ์—ฐ์‚ฐ์€ ๋ˆˆ ์”ป๊ณ  ๋ด๋„ ์—†๋Š”๋ฐ
x64 gbg๋กœ ๋ณด๋ฉด 16์€ ์–ด๋””์—๋„ ์—†๊ณ  ๋Œ€์‹  F0 ์—ฐ์‚ฐ์ด ์žˆ๋‹ค. ์™œ ๋‘˜์ด ๋‹ค๋ฅผ๊นŒ? ๊ทผ๋ฐ ๊ฒฐ๊ณผ๋Š” ์–ด๋–ป๊ฒŒ ๊ฐ™์€๊ฑธ๊นŒ?
+IDA์˜ 16์€ ๊ทธ๋ƒฅ 16์œผ๋กœ ์จ์•ผ ๋‹ต์ด ๋‚˜์˜ค๊ณ  16์ง„์ˆ˜ ์ฒ˜๋ฆฌํ•˜๋ฉด ์•ˆ ๋˜๋Š”๋ฐ IDA๋Š” 10์ง„์ˆ˜ ๊ธฐ๋ฐ˜์ธ๊ฐ€?