Layer7 과제/리버싱
[리버싱] prob-4
kms0204
2022. 8. 16. 23:53
문제를 보면,
위와 같다.
사용자로부터 최대 길이 32인 문자열을 입력받는다.
그리고 if문에서 이를 특정한 방법으로 검증하고, 모든 조건을 만족시키는 값이라면 Correct! 가 출력되고 아니라면 Wrong...이 출력된다.
(그동안의 문제를 보면, 아마도 flag의 길이가 32일 것이라고 추측할 수 있다. 물론 32라고 확답할 수 없기 때문에 문제를 풀 때 별로 도움이 되지는 않는다. 하지만, if문을 보면 data[0], data[1], data[2], data[3] 4개를 검증한다는 것을 알 수 있다.
이는 flag를 네 부분으로 나눠서 검증한다고 볼 수 있다)
모든 조건을 만족시키는 값을 일일이 구할 수는 없으니 파이썬의 z3 모듈을 사용해서 코드르 짜야한다.
if문을 보면 data[0], data[1], data[2], data[3] 4개를 검증하고 있으므로, 이를 참고해서 코드를 짜면,
from z3 import *
FLAG = [BitVec("FLAG_%d" %i, 64) for i in range(4)]
solver = Solver()
solver.add((FLAG[0] ^ 0x0DD8E7527EE669B1) == 0x5487A31B3A9D5EFD )
solver.add((FLAG[0] ^ FLAG[1]) == 0x1C0B170809246203 )
solver.add((FLAG[0] ^ FLAG[2]) == 0x151017167721681E )
solver.add((FLAG[0] ^ FLAG[3]) == 0x24080B1E7B29721A )
solver.add((FLAG[1] ^ FLAG[2]) == 0x091B001E7E050A1D )
solver.add((FLAG[1] ^ FLAG[3]) == 0x38031C16720D1019 )
solver.add((FLAG[2] ^ FLAG[3]) == 0x31181C080C081A04)
if solver.check() == CheckSatResult(True):
m = solver.model()
#print(m)
for i in FLAG:
print(m[i].as_long().to_bytes(64, "little").decode(), end="")
else:
print("unsat")
위와 같다.
실행시키면,
모든 조건을 만족시키는 값, 즉 flag가 출력되는 것을 확인할 수 있다.