-
NCSC CTF 2019 [Reversing]2factorauth write upCTF write_up/NCSC CTF 2019. 2. 9. 01:19
↑문제 파일
파일을 실행해 보니 다음과 같이 PASSWORD1을 물어보고는 답이 아닌지 :( 를 출력하네요
어떤 파일로 이루어 졌는지 보겠습니다.
ELF 파일로 되어 있네요.
IDA를 이용해서 분석해 보겠습니다.
↑main 함수
일단 fgets로 11글자를 입력으로 받고 그 길이 만큼 rot13함수를 반복 시키네요
rot13함수를 한번 보겠습니다.
아스키 코드를 이용해서 13을 더하고 빼는 함수 같네요
그리고 memfrob함수를 거쳐서 test와 test1을 비교해서 같으면 넘어가고 다르면 아까 처럼 :( 가 출력되는 것 같습니다.
memfrob함수는 42랑 XOR하는 함수 입니다.
따라서 역연산 시에 42랑 XOR해야합니다.
25번줄 부터 보면 이번엔 PASSWORD2로 숫자를 입력합니다.
v4 = (14 * (((v8 | 0x40) - 0x5318414) | 0x10000) >> 1) - 0x3B93AE7C;
BYTE1(v4) &= 0x7Fu;
를 거쳐서 v4와 0xFFFFFFFFBB7C4CDC 를 비교 합니다.
이 문제를 해결할 python코드를 작성해 보겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from z3 import *
import string
rot13Table = string.maketrans(
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
"NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm")
rot13 = lambda s : string.translate(s, rot13Table)
PASSWORD1 = [0x49, 0x4F, 0x19, 0x6D, 0x6D, 0x46, 0x75, 0x19, 0x1E, 0x4C, 0x66]
PASSWORD1_s = ""
for i in xrange(len(PASSWORD1)):
PASSWORD1_s += chr(PASSWORD1[i] ^ 42)
var = BitVec("var", 64)
s = Solver()
s.add(((14 * (((var | 0x40) - 87131156) | 0x10000) >> 1) - 999534204) == 0xFFFFFFFFBB7C4CDC)
s.check()
m = s.model()
print 'PASSWORD1 : ' + rot13(PASSWORD1_s) + '\nPASSWORD2 : ' + str(m[var].as_long())
위의 소스코드를 실행시켜 보면 다음과 같습니다.
해당 flag값을 넣어보겠습니다.
틀렸다고 나옵니다..
생각해보니 저 수식에 해당하는 값이 1개가 아닐수도 있다는 생각이 들었습니다.
그래서 코드에 해당값인 65710012가 나오지 않도록 추가하고 다시 돌려보겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from z3 import *
import string
rot13Table = string.maketrans(
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
"NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm")
rot13 = lambda s : string.translate(s, rot13Table)
pw1 = [0x49, 0x4F, 0x19, 0x6D, 0x6D, 0x46, 0x75, 0x19, 0x1E, 0x4C, 0x66]
pw1_s = ""
for i in xrange(len(pw1)):
pw1_s += chr(pw1[i] ^ 42)
var = BitVec("var", 64)
s = Solver()
s.add(var != 65710012)
s.add(((14 * (((var | 0x40) - 87131156) | 0x10000) >> 1) - 999534204) == 0xFFFFFFFFBB7C4CDC)
s.check()
m = s.model()
print 'PASSWORD1 : ' + rot13(pw1_s) + '\nPASSWORD2 : ' + str(m[var].as_long())
아까와는 다른 값이 나왔습니다. Flag를 넣어 보겠습니다.
이번에도 아니네요 똑같은 방법으로 65710076을 제외시키고 코드를 실행해 보겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from z3 import *
import string
rot13Table = string.maketrans(
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
"NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm")
rot13 = lambda s : string.translate(s, rot13Table)
pw1 = [0x49, 0x4F, 0x19, 0x6D, 0x6D, 0x46, 0x75, 0x19, 0x1E, 0x4C, 0x66]
pw1_s = ""
for i in xrange(len(pw1)):
pw1_s += chr(pw1[i] ^ 42)
var = BitVec("var", 64)
s = Solver()
s.add(var != 65710012)
s.add(var != 65710076)
s.add(((14 * (((var | 0x40) - 87131156) | 0x10000) >> 1) - 999534204) == 0xFFFFFFFFBB7C4CDC)
s.check()
m = s.model()
print 'PASSWORD1 : ' + rot13(pw1_s) + '\nPASSWORD2 : ' + str(m[var].as_long())
Flag값이 나왔으니 다시 넣어보겠습니다.
성공!
Flag : securinets{pr3TTy_34sY_3e9a7bc}
'CTF write_up > NCSC CTF' 카테고리의 다른 글
NCSC CTF 2019 [Reversing]Warmup write up (0) 2019.02.08 NCSC CTF 2019 [Crypto]crypto1 write up (0) 2019.02.08 NCSC CTF 2019 [Crypto]Hmm.. write up (0) 2019.02.08 NCSC CTF 2019 [Misc]Baby Hacker write up (0) 2019.02.08 NCSC CTF 2019 [Misc]LOST FLAG write up (0) 2019.02.08