https://dreamhack.io/wargame/challenges/21/
์ด๋ฒ ๋ฆฌ๋ฒ์ฑ ๋ฌธ์ ๋ ์ด์ ๊ณผ ์ ํ์ ๋น์ทํ๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก ๋์ปดํ์ผ๋ ์ฝ๋์์
if๋ฌธ์ ์กฐ๊ฑด๋ฌธ์ ํ์ธํ์ฌ Correct๋ฅผ ์ถ๋ ฅํ๊ฒ ํ๋
์ ๋ ฅ๊ฐ์ ์ฐพ์๋ด๋ ๊ฒ์ด๋ค.
if ๋ฌธ์ ์กฐ๊ฑด๋ฌธ์ ๋ค์๊ณผ ๊ฐ๋ค.
(i ^ (unsigned __int8)__ROL1__(*(_BYTE *)(a1 + i), i & 7)) != byte_140003000[i]
์ด ์์ ๋น๊ต์ ๊ฐ๋จํ๊ฒ ์ ๋ฆฌํ๋ฉด,
( i xor ROL( a1[ i ] , i & 7 ) ) != byte_140003000[i]
๊ฐ ๋๋ค.
์ด๋, ROL ์
ROL : ex) 0011 1010 -> ROL -> 0111 0100
๊ณผ ๊ฐ์ ์ฐ์ฐ์ ์๋ฏธํ๋ค.
์ฆ, ์์ ROL( a1[i] , i & 7 ) ์ด ์๋ฏธํ๋ ๊ฒ์ a1[i] ๋ฅผ i & 7 ๋งํผ ROL ์ฐ์ฐํ๋ผ๋ ์๋ฏธ์ด๋ค.
์ฆ ์์ ์กฐ๊ฑด๋ฌธ์ ๋ค์ ์ ๋ฆฌํด๋ณด์๋ฉด,
a1 ๊ฐ์ i & 7 ๋งํผ ROL ์ฐ์ฐ์ ์ํจ ํ,
i ์ ํด๋น ์ฐ์ฐ๊ฐ์ xor ์ฐ์ฐํ ๊ฒฐ๊ณผ๊ฐ์ byte_140003000 ๊ฐ๊ณผ ๋น๊ตํ๋ ๊ฒ์ด๋ค.
์ด์ ์ญ์ฐ์ฐ์ ์๋ํ ๊ฒ์ธ๋ฐ,
xor ์ฐ์ฐ์ ์ฑ์ง์ ์ฌ์ฉํ์ฌ ์์ ๋ฐ๊ฟ๋ณด๊ฒ ๋ค.
1. ์๋ณ์ xor i ์ฐ์ฐ
ROL( a1[i] , i & 7 ) != i xor byte_140003000[i]
2. ์๋ณ์ ROR( , i & 7) ์ฐ์ฐ --> ROR์ฐ์ฐ์ ROL ์ฐ์ฐ์ ๋ฐ๋์ด๋ค.
a1[i] = ROR(i xor byte_140003000[ i ] , i & 7)
#include<stdio.h>
int ror(int x, int n) {
int shift = x >> n;
int src = x << (8-n);
src &= 255;
return shift | src;
}
int main(){
unsigned char byte00[32] = {0x52, 0xDF, 0xB3, 0x60, 0xF1, 0x8B, 0x1C, 0xB5, 0x57, 0xD1, 0x9F, 0x38, 0x4B, 0x29, 0xD9,
0x26, 0x7F, 0xC9, 0xA3, 0xE9, 0x53, 0x18, 0x4F, 0xB8, 0x6A, 0xCB, 0x87, 0x58, 0x5B, 0x39, 0x1E, 0x00};
unsigned char input[32]={0,};
int i;
int num[32];
for (i=0 ; i<32 ; i++){
num[i] = i ^ byte00[i];
input[i] = ror(num[i], i&7);
}
int j;
for (j=0 ; j<32 ; j++){
printf("%c", input[j]);
}
printf("\n");
return 0;
}
๋ฐ๋ผ์ FLAG ๋
Roll_the_left!_Roll_the_right!>
์์ ์ ์ ์๋ค.
':: DreamHack ๐ฉ > wargame - reverse' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ dreamhack ] - [ reversing | rev-basic-6] (0) | 2022.05.31 |
---|---|
[ dreamhack ] - [ reversing | rev-basic-5 ] (0) | 2022.05.31 |
[ dreamhack ] - [ reversing | rev-basic-4 ] (0) | 2022.05.30 |
reversing | [CodeEngn] Malware L07 (0) | 2022.05.30 |
[dreamhack] - [reversing | rev-basic-2] (0) | 2022.05.30 |
๋๊ธ