일시: 2023.02.05
팀원: 이수미, 이유빈, 지정현
* 문제 설명
이 문제는 사용자에게 문자열 입력을 받아 Correct 또는 Wrong을 도출하는 프로그램이다.
프로그램을 한 번 실행 시켜보자
일단 “Input :” 이 뜨면서 입력창이 떴고, 1234를 입력했더니 Wrong이 출력된다.
1) x64dbg 사용
먼저 x64 dbg를 이용하여 분석을 해보았다. 문자열 참조 검색을 통해 Correct의 위치를 알아냈고, test eax,eax 부분을 통해 입력값이 검증된다는 것을 알게 되었다. 따라서 그 위 chall3.7FF720A71000 함수는 사용자의 입력 값과 암호를 비교해준다는 것을 짐작할 수 있다.
chall3.7FF720A71000 함수를 들여다 보면, 일단 cmp rax,18을 보아 입력값을 16진수 기준으로 18번, 즉 10진수 기준으로 24번 비교하므로 암호 문자열 길이는 24 인 것을 알 수 있다. ecx는 사용자 입력 값을 저장하고, rcx는 메모리에 올라온 값을 가져온다. [lea rcx, qword ptr ds:[7FF6C4AD3000]] 구문을 보면 7FF6C4AD3000 주소에 rcx의 값이 저장되어 있으니 해당 주소를 따라가보자.
문자열 길이가 24이므로 확인해보면
16진수 값은 ‘49 60 67 74 63 67 42 66 80 78 69 69 7B 99 6D 88 68 94 9F 8D 4D A5 9D 45’, 10진수 값은 I`gtcgBf.xii{.m.h...M¥.E임을 알 수 있다.
이것만 봐서는 어떻게 해야할지 잘 모르겠다.
사용자 입력 값 비교는 [lea ecx, qword ptr ds:[rcx+rdx*2]] 에서 수행하는데, 어셈블리어 코드를 보면 rcx에 올라간 문자열과 사용자의 입력 값을 그대로 비교하는 것이 아니라 사용자의 입력 값을 연산하여 rcx의 값과 비교한다. 따라서 역연산을 수행해야 하는데…
2) IDA Freeware 사용
IDA Freeware로 열고 f5를 눌러 프로그램 main 함수 코드를 보았다. if 문을 통해 Correct/Wrong이 결정되니 sub_140001000 함수를 봐야할 것 같다.
for 문 안에 있는 if 문을 보아하니 내가 입력한 a1 배열에 i를 xor하고 2*i를 더한 값이 byte_140003000[i]여야 한다.
이는 xor 연산을 두 번하면 원 상태로 돌아오는 것을 이용하여 역연산을 하면 된다.
byte_140003000[i] = 암호
a1=입력값
i=인덱스
라고 한다면 역 연산식은 ‘입력값 = (암호-인덱스*2)^인덱스’가 된다.
해당 연산을 비교 문자열 길이인 i=24로 놓고 파이썬으로 코드를 작성해보자.
문제의 플래그는 I_am_X0_xo_Xor_eXcit1ng 라는 것을 확인할 수있다.
'5. 방학 활동 > Write UP' 카테고리의 다른 글
[2023.01.28] 정처기 자격증 스터디 1주차 (0) | 2023.02.28 |
---|---|
[2023.02.20] 워게임&CTF 스터디 1팀 문제풀이(암호, 포렌식) (0) | 2023.02.27 |
[2023.02.11] 워게임&CTF 스터디 1팀 문제풀이(포너블(2))] (0) | 2023.02.26 |
[2023.02.11] 워게임&CTF 스터디 1팀 문제풀이(포너블(1))] (0) | 2023.02.25 |
[2023.02.02] 워게임&CTF 스터디 1팀 문제풀이(리버싱)] (0) | 2023.02.19 |