티스토리 뷰

최종 수정: 2015-11-08

hackability@TenDollar


안녕하세요. Hackability 입니다.


이번에 포스팅 할 내용은 2015 School CTF 의 Admin 200 문제 입니다.


문제 웹 페이지에 접속하면 다음과 같은 이미지 하나가 뜹니다.



해당 jpg 파일을 다운받아 내용을 살펴 보면 RAR 압축으로 그림 파일 하나가 포함되어 있음을 알 수 있습니다.


파일을 해제 하면 다음과 같은 QR 이미지 파일이 나옵니다.



온라인 QR Code Reader ( https://zxing.org/w/decode ) 같은 곳에서 해당 QR 코드를 읽으면 다음과 같은 코드가 나옵니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
#include <cstdio>
using namespace std;
 
unsigned int key=2343454423;
 
unsigned char gen_key(){
    key=key*4356776434567+65765;
    return (unsigned char) ((unsigned int)(key/65536)%32768);
}
 
int main(){
    
    unsigned int mas[]={1884310231185187483419510797228188131728923222025641761822061149412082164110576139154481571745023513820020610810620323116915810258685780192161881392103625268173915363103027211216100841507617915414412434189221218415940301191161481151781201722845221861131081312219886148381259412723023419204904015316915213174139261171721609312713315192461412193986249156170174322499813542187701923216883952536302441368511551561838525319513552164204162362552714111184133272091611914423796048331365123242211607215312325434228127225237340132197711102346910623799512021141943353249204197121852836204245631031269916126792211061172241702221321921116146902386214417601002118513215519813851791361534323215210432492224876136402212222189413442103514011320914821011051183195808824721612122301615385180381137811531220101};
 
    unsigned char gen_mas[313]; 
 
    int j;
 
    for(j=0;j<313;j++){
        gen_mas[j]=mas[j]^gen_key();
    }
 
    for(j=0;j<313;j++){
        printf("0x%x, ", gen_mas[j]);
    }
 
    cout << endl;
}
cs

이 코드를 python 코드로 변경하면 다음과 같습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
key=2343454423;
 
msg = [1884310231185187483419510797228188131728923222025641761822061149412082164110576139154481571745023513820020610810620323116915810258685780192161881392103625268173915363103027211216100841507617915414412434189221218415940301191161481151781201722845221861131081312219886148381259412723023419204904015316915213174139261171721609312713315192461412193986249156170174322499813542187701923216883952536302441368511551561838525319513552164204162362552714111184133272091611914423796048331365123242211607215312325434228127225237340132197711102346910623799512021141943353249204197121852836204245631031269916126792211061172241702221321921116146902386214417601002118513215519813851791361534323215210432492224876136402212222189413442103514011320914821011051183195808824721612122301615385180381137811531220101]
 
 
res = []
 
for i in range(0len(msg)):
    key = (key*4356776434567+65765) & 0xFFFFFFFF
    res.append( msg[i] ^ (((key / 65536) & 0xFFFFFFFF) % 32768 ) & 0xFF )
test = ''
for i in range(0len(res)):
    test += hex(res[i])[2:].replace('L''').decode('hex')
print test
cs

그러면 결과로 다음과 같이 인코딩 된 값을 얻을 수 있습니다.


B64'YSA9ICc3MCA3NiA2NSA3MSA5NSA3MSA0OCA2OCA5NSA2OCA2NSA3NyA3OCA5NSA2NiA4MiA0OCA5NSA4NSA5NSA4MiA5NSA4MyA0OCA5NSA2NyA0OCA0OCA3NiA5NSA2OCA2OSA2NyA4MiA4OSA4MCA4NCA3OSA4MicKCm1hcz1bXQoKbWFzPWEuc3BsaXQoJyAnKQoKZm9yIGkgaW4gcmFuZ2UobGVuKG1hcykpOgoJYj1pbnQobWFzW2ldKQoJYz1oZXgoYikKCXByaW50KGMsIGVuZD0nICcpCgpwcmludCgnJyk='


위 스트링을 다시 디코드 하면 


1
2
3
4
5
6
7
8
9
10
11
12
= '70 76 65 71 95 71 48 68 95 68 65 77 78 95 66 82 48 95 85 95 82 95 83 48 95 67 48 48 76 95 68 69 67 82 89 80 84 79 82'
 
mas=[]
 
mas=a.split(' ')
 
for i in range(len(mas)):
    b=int(mas[i])
    c=hex(b)
    print(c, end=' ')
 
print('')
cs
 
이런 코드가 나오게 되고 이를 python 3.0 에서 구동 시키거나 적절히 수정하여 b 값을 chr 로 찍으면 다음과 같이 플래그가 떨어지게 됩니다.

F L A G _ G 0 D _ D A M N _ B R 0 _ U _ R _ S 0 _ C 0 0 L _ D E C R Y P T O R 


댓글