Skip to content

Instantly share code, notes, and snippets.

@KSHMK
Last active June 25, 2018 14:15
Show Gist options
  • Save KSHMK/dffe52429ee47ab2ad4df613d3c24537 to your computer and use it in GitHub Desktop.
Save KSHMK/dffe52429ee47ab2ad4df613d3c24537 to your computer and use it in GitHub Desktop.
2018 Whitehat Apple Write UP

Apple

Binary Analyze

png

바이너리의 동작구조는 RSA Private key와 그 키의 Public key를 생성한다.

png

그리고 이 RSA Private key는 바이너리에 저장되어 있는 Master RSA Public key로 암호화 되어 00000000.eky라는 파일에 저장되고 RSA Public key는 00000000.pky라는 파일에 저장된다.

png

이후 암호화 할 파일을 선택한 뒤 AES 256 키를 생성하고 이 키로 파일을 AES-CBC 암호화를 한 뒤 AES 키를 생성한 RSA public key로 암호화 한다.

그리고 이 암호화된 AES 키와 암호화된 파일을 일정한 양식에 맞게 저장한다.

Dump Analyze

결과적으로 우리는 생성된 RSA Private key를 찾는 것이 목표이다.

png

먼저 스택 프레임을 조사하면 덤프했을때 EIP의 위치가 Sleep 함수에 있다는 것을 알 수 있다. 그리고 메인 루틴의 EBP 주소는 0x012ff38라는 것을 알 수 있다.

png

따라서 59번째 라인을 수행하였음을 알 수 있다. 그래서 74번째 줄이 실행이 되지 않았으며 RSA Private key가 메모리 상에서 지워지지 않았음을 알 수 있다.

하지만 RSA Private key가 편하게 문자열로 존재하지 않는데 이는 44줄에서 메모리가 해제되었기 때문이다.

png

해당 EBP-0x42C 안의 내용을 분석해야 한다.

png

RSA Private key는 RSA_generate_key라는 함수로 만들어 졌다.

png

해당 함수는 RSA라는 구조체를 사용하고 있었다.

png

그래서 해당 구조체를 보면 n,e,d,p,q 등등 여러 중요한 정보를 담고 있음을 알 수 있고, 우리가 자세히 알아야 할 부분은 BIGNUM 구조체 부분이다.

png

BIGNUM에서 숫자를 의미하는 부분은

BN_ULONG * d

였는데 나는 이 내용을 모두 복사해서 프로그램을 실행했을 때 붙여넣는 방법을 사용하였다.

ONE = "ef5b4d6b34cfedd933c9fdccd76cbe89b688711a31788e1ca82e71b0afe89c93b17d22a4b8278fae0ebc0bba5594ce724bd94d2f1946cd59231dbe570ee9a5ec77d993d626bdafe11569a1955ee4570231f3b11a04dd705d8da10eec2d0f436c5a59a7e3d4dfe2dd45f2f4042a61e4023574bb9e689b4d1a38167d0da884e40a4e88b45bb718ba74c98b04dcde05af17c013710a5fff8dfc8bddd49780f746b6d29f579fdb56d86b8895aedc7f32222466acf20dada28c3b78ea9c23ea378543fe3aa81ce2813cdca391e88ba4bf9694be60cf77e657f7f581d1defa2da707ed1f0b91232e9f51dffef56bc9c165dda40ef4e2b26a423c2e44065835d2b5b5d6"
THR = "cb88444e44f4676ea016f5523b51a3da398f8f3b562b127700c8d9c0383ffebc7a094b97984c8c41947b0547fb71e28b24a596753ae4a9f4eaf2d77e2ce4dc5be334c018ec12ac22b71b66c8057be9817fe08a52770d98b52ef6847834909ff90f6050f1a501efd9fa55249260d4afe193368f13efda5110f4ec1ccbfab387238805233d7a107cf8305d583d3f591f65d5b7a0b194ffb3fd07e98dba55fad9cee1bf8fbfe73990f25a0e1f93aa216c6d991df7b3c8c15dd2fa46136df1cf5882a97cc5bd965628e81761f007c37f64b829eb34a5993afaa356363fa71e1a059e6a07b61774bf8b3fffa3f23081eee86db4a2ec21472c28742d0490238cce238f"
FOR = "773cead8803846331717674229b33b15519ac0793a18970e5397cffa830d5a694cde627b6f492f3153d9a70530545ec954ced6a4e412d524e4c835d0ab3317ebb13c4b1d88ad58637180f1319a0b6823468e154aadc4e692842dff6a1d201d148667fcbf5cf432748372bee2d711d7f0dde745c9907372b6c81db91f8554a2f7"
FIV = "4952fc1c4da80b012c10278ed5bf8dac8e975947f51e5c5b54eb5a94567cc50e2d11cf45646b0d1b5da9dbc92c959cd73f1315dadc5cf9c5de6744c91f5fc3f7704d28943cf354ca11bf16b73ba0119c2b14ccd4230426bac20248ccc196b661bc61b239ff68c922cafeff46c190853f79ba1e38715f604b019518bd2aa2f6dd"
SIX = "4f289c90007bd9cc640f9a811b227d638b112b517c650f5f37badf51adb3e6f03294ecfcf430ca20e2901a59758de930e3de39c3ed61e36ded85ce8a7222ba9c762832be5a1e3b42f6aa4b21bc07f06cd95e0edcc82def61581eaa9c13c0680d0445a82a934d774d02f77eec8fb6e4f5939a2e8660a2a17930697b6a03e316a5"
SEV = "db36a8683370b200c80a1ab4e37f5ec80965e684a314e83c38f2910d8ffdd8091eb634d942f208123ec6e7db1d0e13e57fb7b8e63d93fb83949a2d866a3f82faf588c56228a238dc0b2a0f7ad26ab6121db832e31758197c2c5785dd2b0fcfebd2eb7626aaf03017dca9aa842b0b592aa6d16925f6949587abb865d371c1f993"
EIG = "64a974c66c2ed7667ec60f611eada3b2bddcd54568a3226d2bbedb84f1e0d76ffd6c2b638ec67a071df790798bdd525fec2e02d1cefaa69ec9c1d2a1415e4872a27abd3a2ea67a5450f528093ffeb67535a7ac7bddfde6d95f2d4d3df4663c2158b9ed643756e6acbc6d8864581b02fb40e701825f3f3ce3ce5c61958cc74a72"
def ps(stt):
	st = stt.decode('hex')
	sa = ScreenEA() 
	for i,ch in enumerate(st): 
		patch_byte(sa+i,ord(ch))

IDA python을 사용하였다.

Get Keys

얻어낸 RSA Private key 는 다음과 같았다.

-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEA1rW10jVYBkQuPEJqsuL0DqTdZcHJa/X+31GfLiORCx/tB6ct
+t7RgfX3V+Z3z2C+lJa/pIvokaPcPIHiHKg6/kOFN+ojnOp4O4yirQ3yrGYkIjJ/
3K6ViGvYVtufV5/Stkb3gJfU3Yv8jf9fCnETwBevBd7cBIvJdLoYt1u0iE4K5ISo
DX0WOBpNm2ieu3Q1AuRhKgT08kXd4t/U46dZWmxDDy3sDqGNXXDdBBqx8zECV+Re
laFpFeGvvSbWk9l37KXpDle+HSNZzUYZL03ZS3LOlFW6C7wOro8nuKQifbGTnOiv
sHEuqByOeDEacYi2ib5s18z9yTPZ7c80a01b7wIBAwKCAQEAjyPOjCOQBC10KCxH
IeyitG3o7oEw8qP/P4u/dBe2B2qeBRoepz82VqP6OpmlNOspuGR/wwfwYRfoKFaW
vcV8qYJYz/FtE0b60l3ByLP3HZltbCGqkx8OWvKQOee/j7/hztn6VbqN6Qf9s/+U
saC31WUfWT89WF0w+HwQej0jBYgjh7P6yxzs9BBR2u8TjzaT4a/UYJIkVfrZ7wGl
8VBgD/mfkDR4hPYutZgNd1KK4H+B6XsFyGYbtyKsEuwYwDTjW9zkLH7X8ur0qeQ6
dZalJIvicftHBXuUQYxMmJdLCXq8/j84wNnIAHcSK1Y7j4852qNRO1L1FqBuZ/RE
TkSIywKBgQD3olSFH7kdyLZyc5DJRefd8NcR1+K+coN0MvRcv/xnhhQdIB1q/y2E
kubErUoVjkYjaAuaMfGAcWNYrYgdSzyx6xczq9A1yOQk1RLkpNbOVMleVDAFp9lT
MS9Jb3ti3kxpWg2D+s+XUw6XGDp5wJpRFTuzKUJnFxczRjiA2Oo8dwKBgQDd9qIq
vRiVAUtgX3E4Hrp5P4WQwUb//soiyWj/ObJhvGG2lsHMSALCuiYEI9TMFCucEaA7
txa/EcpU8zyUKE1w98NfH8lEZ97F+Vzc2hUTP9eclSzJ26ldGw1rZEXPES0OxXxW
lFrrVFtcHvVHWZeOrI2/1Y4nECwBC6hNHPxSSQKBgQClFuMDantpMHmhomCGLpqT
9eS2j+x+9wJNd02TKqhFBA1owBOcqh5YYe8tyNwOXtls8Ae8IUuq9kI7Hlq+Mih2
nLoicorOhe1t42Htwzne4zDpjXVZGpDiIMow9PzslDLw5rOtUd+6N18PZXxRKxGL
Y30iG4GaD2TM2XsAkJwoTwKBgQCT+cFx02W4q4eVlPYladGmKlkLK4SqqdwXMPCq
Jnbr0uvPDyvdhVcsfBlYF+MyuB0StmrSeg8qC9w4oihixYj1+oI/aoYtmpSD+5M9
5ri3f+UTDh3b58Y+EgjyQtk0th4J2P2PDZHyODzoFKOE5mUJyF5/47QaCsgAsnAz
aKg22wKBgHJKx4yVYVzO4zw/X4IB50D7AhtYZIhtvKzmVjdk7blYITxm9D1NLV/Z
5v3de6ynNXW2/j8JKPVQVHqmLjq9eqJySF5BodLByZ6m+s7RAi7sX1Ldi3mQ9x0H
esaOYyts/W/X4PGE274rbSKjaEXV3L2yo60eYQ/GfmbXLmzGdKlk
-----END RSA PRIVATE KEY-----

그리고 이를 사용해 얻어낸 AES-CBC-256 Key는

06 BE BD 63 14 6A F4 D4 E9 D6 A4 78 E4 76 2A C7 F3 4B E2 97 F0 82 49 ED 2E A3 A2 B1 9A 4C D9 6F

이었다. openssl로 AES 디크립트가 정상적으로 되지 않아서 python으로 코딩하였다.

from Crypto import Random
from Crypto.Cipher import AES
iv = "\x00"*16
key = "\x06\xBE\xBD\x63\x14\x6A\xF4\xD4\xE9\xD6\xA4\x78\xE4\x76\x2A\xC7\xF3\x4B\xE2\x97\xF0\x82\x49\xED\x2E\xA3\xA2\xB1\x9A\x4C\xD9\x6F"
cipher = AES.new(key, AES.MODE_CBC, iv )
enc = "\xB3\xEE\x9B\x5B\xC0\xF8\x1F\xFD\x0D\x82\x80\x32\x33\xC8\x9B\xC0\x82\xB5\x5B\xB4\xE2\x30\x8C\xCF\xC1\x2B\x1B\x76\x8F\xDC\xF8\x8C"
print cipher.decrypt(enc)

FLAG

Garbag3 1n garbag3 0u7!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment