목록Rev (6)
Parkchanjin
rev_this 파일은 flag.txt가 암호화되서 만들어진 파일이다. 암호화방식은 8글자부터 -2 하거나 +5하는 아주 간단한 방식이다. 복호화 하기 위해서는 아래와 같이 -, + 연산자들을 반대로 해서 계산해주면 암호화가 풀린다.
get_key함수는 calculate_key에서 0xEDBE3FD3을 가져와서 key에 저장한다. 위 사진에서 저장한 Key값과 암호화된 flag값을 55번 반복적으로 xor연산 하여 복호화 시킨다.
이 문제는 32비트의 윈도우 프로그램이다. 여기서는 다른곳은 볼 필요 없이 if ( v4 )로 정답 여부를 체크하니 v4 = sub_402DB5((int)&v5) 부분만 보면 될 것 같았다. 함수 내부를 보면 v3 변수에 키를 생성해주는데 "The key is: 4253360" 이라는 키를 고정적으로 생성해줬다. 그리고 그 키와 내가 입력한 access code와 비교해주고 똑같으면 1을 리턴하고 틀리면 0을 리턴해준다. 그러므로 access code에 "The key is: 4253360"를 입력해주면 된다.
이 문제는 소스코드 파일 하나와 덤프 파일을 하나를 줬다. 소스코드를 보면 flag를 특정 길이만큼 flag[i] ^ 0x1을 하는걸 볼 수 있다. 그럼 TUCTF{를 한 글자씩 1과 xor한 후 그 문자열을 덤프파일에서 찾아보면 될 거 같다. TUCTF{과 XOR한 결과 UTBUGz가 나왔다. 검색 결과 "UTBUGzb1s2^etlq>^O2w2s^i25se^1g^x1t|\v"가 나왔다. 이제 이 문자열을 1이랑 xor하면 플래그가 나올것이다.
파일을 실행하면 A, B, C 선택을 하라고 나오는데 이 중 선택하면 가짜 플래그들을 출력한다. 위 사진에 보이는 printFlag 함수를 사용하는 곳을 찾아보면 A, B, C 이외에 thisone이라는 함수가 보인다. thisone 이 함수가 진짜 플래그 출력해주는 함수인걸 추측해볼 수가 있다. A선택시 출력하는 A 함수를 thisone 함수로 패치를 해주고 실행하면 A선택시 진짜 플래그를 출력하는걸 볼 수가 있다.