반응형
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 |