핵심 키워드: 어셈블리어 분석, 16진수 변환 계산 코드(파이썬, c언어)
ㄱㅂㅈㄱ
correct를 출력하는 입력값을 찾는 문제다. 일단 파일을 다운로드하고 x64dbg에서 열어보자.
문자열 찾기로 correct 문자열을 찾았다. 여기서 입력값 함수를 찾아보자.
아래에 test eax, eax 어셈블리어가 있는 것을 보아하니, call chall3.7FF623251000 함수가 입력값을 받는 함수인 듯 하다. 이 함수로 가 보자.
워메......
이제부터 어셈블리어를 보는 연습을 꾸준히 할 필요가 있다. (파이썬이랑 c는 언제 하게...?)
cmp 부분부터 봐 보자. cmp는 두 값을 비교한다는 의미이다.
cmp rax, 18 rax의 값을 헥스값 18과 비교한다는 의미로, 문자열의 길이가 24라고 추측해 볼 수 있겠다.
0x18 = 24
어셈블리어 문맥을 보면 알겠지만, ecx는 사용자가 입력한 값을 받는다. 그리고 lea ecx, qword ptr ds:[rcx+rdx*2]에서 사용자 입력 값과 메모리에 올라와 있는 값을 비교를 수행한다. rcx는 메모리에 올라와 있는 값을 저장하고 있다. rcx의 위치로 가 보자.
덤프 따라가기로 해당 주소로 가 보니, 헥스값과 아스키코드가 무언가 이상하다. 헥스값에서 맨 앞 24개를 살펴보자.
왠지, 16진수로 암호화 되어있는 어떤 구문인 것 같다.
base64나 헥스값 변환 사이트에서 아무리 굴려봐도 힌트나 플래그처럼 보이는 값이 안 나오길래, 파이썬으로 코드를 짜서 역연산으로 돌려봤다.
결과값
플래그 값을 발견
문제를 풀면서 필요하다고 느꼈던 것
-어셈블리어 분석(조금 더 숙련이 필요할 듯 하다)
-IDA 툴 다루는 법(x64 디버그 스노우맨은 디컴파일 하기엔 너무 불편하다.)
-python으로 더 능숙하게 코드 짜는 법