반응형
https://app.hackthebox.com/challenges/59 에서 zip파일 다운로드 후에 ipa파일로 확장자 변경해도 설치가 안됩니다.

 

패키지 내용은 다음과 같습니다.

 

hackthebox 바이너리 파일 디컴파일 해서 보니 "-[ViewController SecretManager:key:iv:data:]" 메서드에서 CCcrypt 함수를 사용하고 있습니다.

 

 

objc_selrefs 섹션을 살펴보면, "-[ViewController SecretManager:key:iv:data:]" 메서드는 "-[ViewController viewDidLoad]+416" 에서 호출하고 있음을 확인 가능합니다.

 

 

"-[ViewController viewDidLoad]" 메서드를 살펴보면 "challenge.plist" 파일의 "flag" 키값을 읽어서 "-[ViewController SecretManager:key:iv:data:]" 메서드의 data 파라미터에 전달하고 있습니다.

SecretManager 파라미터에는 0x1, key 파라미터에는 @"!A%D*G-KaPdSgVkY", iv 파라미터에는 @"QfTjWnZq4t7w!z%C" 이 각 전달되고 있습니다.

 

 

challenge.plist 파일의 flag 키값: Tq+CWzQS0wYzs2rJ+GNrPLP6qekDbwze6fIeRRwBK2WXHOhba7WR2OGNUFKoAvyW7njTCMlQzlwIRdJvaP2iYQ==

 

 

앱이 설치가 되면 cccrypt 함수를 후킹하여 쉽게 플래그 값을 알아낼 수 있겠으나, 앱 설치가 안되는 관계로 인해 문제의 메서드들을 모방하는 트윅(tool)을 작성하려고 합니다.
https://blog.actorsfit.com/a?ID=00350-b5b90238-e3e0-46bd-b1c6-17f9fdd04bc5 에 의하면 CCCrypt 함수를 사용하는 기본적인 코딩은 다음과 같은데, hackthebox 바이너리 파일 디컴파일 결과와 상당히 유사합니다.
- (NSData *)DESDecrypt:(NSData *)data WithKey:(NSString *)key encryptOrDecrypt:(CCOperation)encryptOperation
{
char keyPtr[kCCKeySizeAES256+1];
    bzero(keyPtr, sizeof(keyPtr));
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
    NSUInteger dataLength = [data length];
    size_t bufferSize = dataLength + kCCBlockSizeDES;
    size_t bufferSize = (dataLength + kCCBlockSizeDES) & ~(kCCBlockSizeDES - 1);
    unsigned char buffer[(bufferSize * sizeof(char))];
    memset(buffer, 0, sizeof(char));
    void *buffer = malloc(bufferSize * sizeof(char));
    size_t numBytesDecrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(encryptOperation, kCCAlgorithmDES,
                                          kCCOptionPKCS7Padding,
                                          keyPtr, kCCBlockSizeDES,
                                          NULL,
                                          [data bytes], dataLength,
                                          buffer, bufferSize, 
                                          &numBytesDecrypted); 
    | kCCOptionECBMode
    if (cryptStatus == kCCSuccess) {
        return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted]; 
    } 
    free(buffer); 
return nil; 
}
 
이를 참고하여 "-[ViewController viewDidLoad]" 에서 "-[ViewController SecretManager:key:iv:data:]" 메서드를 호출하는 것을 모방하는 트윅 코드를 짜면 다음과 같습니다.
#import <Foundation/Foundation.h>
#import <Foundation/NSObject.h>
#include <CommonCrypto/CommonCryptor.h>
#include <stdlib.h>
#include <Foundation/NSObjCRuntime.h>

@interface hackcatml: NSObject
- (id)SecretManager:(unsigned int)opmode key:(NSString *)key iv:(NSString *)iv data:(NSData *)data;
@end

@implementation hackcatml
- (id)SecretManager:(unsigned int)opmode key:(NSString *)key iv:(NSString *)iv data:(NSData *)data {
    size_t buffersize = [data length] + 16;
    void *buffer = malloc(buffersize);
    size_t numBytesEncrypted = 0;
    
    char keyPtr[17];
    bzero(keyPtr, sizeof(keyPtr));
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
    
    char ivPtr[17];
    bzero(ivPtr, sizeof(ivPtr));
    [iv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
    
    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, 0, 3, keyPtr, 16, ivPtr, [data bytes], [data length], buffer, buffersize, &numBytesEncrypted);
    if(cryptStatus == kCCSuccess){
        return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
    }
    free(buffer);
    return nil;
}
@end

int main(int argc, char *argv[], char *envp[]) {
    @autoreleasepool {
        NSLog(@"hackcatml");
        NSString *flag = @"Tq+CWzQS0wYzs2rJ+GNrPLP6qekDbwze6fIeRRwBK2WXHOhba7WR2OGNUFKoAvyW7njTCMlQzlwIRdJvaP2iYQ==";
        NSData *data = [[NSData alloc] initWithBase64EncodedString:flag options:0];
        NSString *key = @"!A%D*G-KaPdSgVkY";
        NSString *iv = @"QfTjWnZq4t7w!z%C";
        NSData *secret = [[hackcatml alloc] SecretManager:1 key:key iv:iv data:data];
        NSLog(@"secret: %@", [[NSString alloc] initWithData:secret encoding:NSUTF8StringEncoding]);  
    }
return 0;
}

 

 

트윅 빌드 및 설치합니다.

 

 

설치된 툴을 실행하여 플래그를 획득하였습니다.

반응형

'Information Security > iOS' 카테고리의 다른 글

Add UIButton on ViewController Tweak  (0) 2022.02.13
Unreal Engine 4.27 Dump(iOS)  (3) 2022.02.05
iOS 무결성 테스트  (1) 2021.09.10
iOS FaceID Bypass  (0) 2021.08.25
iOS UnityGame Tweak 제작  (0) 2021.08.20

+ Recent posts