https://dreamhack.io/wargame/challenges/18/
์ด์ rev-basic ๋ฌธ์ ๋ค๊ณผ ๋น์ทํ๋ค.
๋์ปดํ์ผ๋ main์ ๋ค์๊ณผ ๊ฐ๋ค.
sub_140001000 ํจ์๊ฐ ์ฐธ์ด๋๋ฉด Correct๊ฐ ์ถ๋ ฅ๋๋ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค.
ํ์ธํด๋ณด๊ฒ ๋ค.
for ๋ฌธ์ 0x1C ๋ฒ, ์ฆ, 28๋ฒ ๋๋ฆฌ๋๋ฐ,
์กฐ๊ฑด๋ฌธ์
((unsigned __int8)(16 * *(_BYTE *)(a1 + i)) | ((int)*(unsigned __int8 *)(a1 + i) >> 4)) != byte_140003000[i]
์ด๋ค.
((unsigned __int8)(16 * *(_BYTE *)(a1 + i)) | ((int)*(unsigned __int8 *)(a1 + i) >> 4)) != byte_140003000[i]
์ ์กฐ๊ฑด๋ฌธ์ ์ด์ง ์ ๋ฆฌํด์ ์จ๋ณด์๋ฉด,
( 16 * a1[i] ) || (a1[i] >> 4 ) != byte_140003000[i] ์ด๋ค.
1. 16 * a1[i]
2. a1[i] >> 4
3. ( 16 * a1[i] ) || (a1[i] >> 4 )
๊ณผ ๊ฐ์ ์์๋ก ํ๋์ฉ ์งํํ๊ฒ ๋ค.
1.16 * a1[i]
๋ค์ ๊ทธ๋ฆผ์ ํตํด [ 16(10) * 16์ง์ ]๊ฐ ์ด๋ค ์๋ฏธ๋ฅผ ๊ฐ๊ณ ์๋์ง ํ์ธํด๋ณด์
์์ฒ๋ผ [16์ง์] * 16(10์ง์) = [16์ง์]0 ์ด๋ค.
0xA * 16 = 0xA0
์ฆ, ํ๋์ 16์ง์์๋ค๊ฐ ์ญ์ง์ 16์ ๊ณฑํ๋ฉด ๊ทธ ๊ฒฐ๊ณผ๋ ์๋์ 16์ง์์ ๋งจ ์ค๋ฅธ์ชฝ์ 0์ ํ๋ ๋ถํ๋ ๊ฒ๊ณผ ๊ฐ๋ค๋ ๊ฒ์ด๋ค.
2. a1[i] >> 4
์ด๋ฒ์๋ a1[i] >> 4 ์ฐ์ฐ์ธ๋ฐ,
>> ๋ ๋นํธ๋จ์์ ์ฌํํธ ์ฐ์ฐ์์ด๋ค.
์๋ฅผ ๋ค์๋ฉด,
0xA >> 4
0000 1010 >> 4
0000 0101 <-- ์ฌํํธ ํ๋ฒ
0000 0010 <-- ์ฌํํธ ๋๋ฒ
0000 0001 <-- ์ฌํํธ ์ธ๋ฒ
0000 0000 <-- ์ฌํํธ ๋ค๋ฒ ์ ์๋ฏธ์ด๋ค.
์ฆ, 0xA >>4 ๋ 0x0 ์ด ๋๋ค.
3. ( 16 * a1[i] ) || (a1[i] >> 4 )
์ด์ ํฉ์ณ์ ํ์ธํ ๊ฒ์ธ๋ฐ,
( 16 * a1[i] ) || (a1[i] >> 4 ) ์ OR ๋ ์ฐ์ฐ์ผ๋ก ๋์จ ๋ ๊ฐ์ OR ์ฐ์ฐ์ํจ๋ค.
์ ๋ ฅ๊ฐ์ด 0xA ๋ผ๊ณ ๊ฐ์ ํ๊ณ ๋ชจ๋ ์ ๋ฆฌํ๋ฉด,
( 16 * a1[i] ) || (a1[i] >> 4 ) != byte_140003000[i]
0xA0 || 0x0 != byte_140003000[i]
1010 0000 || 0000 0000 != byte_140003000[i]
1010 0000 != byte_140003000[i]
์ฆ, 1010 0000 ๊ณผ byte_140003000[i] ๋ฅผ ๋น๊ตํ๋ ๊ฒ์ด๋ค.
๊ทธ๋ฐ๋ฐ, 1010 0000 ์ ์ฒ์ ์ ๋ ฅํ๋ 0xA ๋ฅผ 2์ง์์์ 4๋นํธ๋ผ๋ฆฌ ์๋ค๋ก ๋ค์ง์ ๊ฐ์ด๋ค.
-->
0xA = 0000 1010 (2)
0xA0 = 1010 0000 (2)
๋ผ๋ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ byte_140003000[i] ์ ์ ์ฅ๋์ด ์๋ ๋ฌธ์๋ค์
๊ฑฐ๊พธ๋ก ๋ค์ ์๋ค๋ก 4๋นํธ์ฉ ๋ค์ง์ผ๋ฉด
Correct๋ฅผ ์ถ๋ ฅํ ์ ์๋ ์ ๋ ฅ๊ฐ์ ์ ์ ์๋ค.
์ด๋ฅผ ์ฝ๋๋ก ์ถ๋ ฅํด๋ณด๊ฒ ๋ค.
byte_140003000[i] ์ ์ ์ฅ๋์ด ์๋ ๊ฐ๋ค์
24h, 27h, 13h, C6h, C6h,
13h, 16h, E6h, 47h, F5h,
26h, 96h, 47h, F5h, 46h,
27h, 13h, 26h, 26h, C6h,
56h, F5h, C3h, C3h, F5h,
E3h, E3h
๋ก 27๊ฐ ์ด๋ค.
์ด ๊ฐ๋ค์ for๋ฌธ์ ํตํด ๊ฐ๊ฐ 2์ง์์์ ์๋ค๋ก4๋นํธ์ฉ ๋ฐ๊พธ๋ ์ฐ์ฐ์ ๋๊ฐ์ด ํด์ฃผ๋ฉด
correct๋ฅผ ์ํ ์ ๋ ฅ๊ฐ์ ์ ์ ์์ ๊ฒ์ด๋ค.
#include <stdio.h>
int main(){
int byte_140003000[27] =
{
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(int i = 0; i<27; i++){
printf("%c", (16 * byte_140003000[i]) & 0xF0 | (byte_140003000[i] >> 4));
}
return 0;
}
๋ฐ๋ผ์ flag ๋ Br1ll1ant_bit_dr1bble_<<_>> ์ด๋ค.
':: DreamHack ๐ฉ > wargame - reverse' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ dreamhack ] - [ reversing | rev-basic-7] (0) | 2022.06.01 |
---|---|
[ dreamhack ] - [ reversing | rev-basic-6] (0) | 2022.05.31 |
[ dreamhack ] - [ reversing | rev-basic-5 ] (0) | 2022.05.31 |
reversing | [CodeEngn] Malware L07 (0) | 2022.05.30 |
[dreamhack] - [reversing | rev-basic-2] (0) | 2022.05.30 |
๋๊ธ