Dreamhack Blitz CTF Reversing

챠챠비둘기·2023년 4월 4일
0

리버싱😎☠️

목록 보기
4/7

Reversing

rol연산에 대한 이해가 필요한 문제. 그 외에는 찾기 쉬웠다.
디컴파일된 코드에서 if문의 조건문을 확인하여 Correct를 출력하게 하는 입력값을 찾아내는 문제이다. 일단 메모리에 저장된 입력값을 디버거로 분석하여 찾아내어 암호문을 입력하면 풀리는 문제인 것 같다.

rol - rotate left : 어셈블리어에서 왼쪽으로 시프트
ror - rotate right : 어셈블리어에서 오른쪽으로 시프트

예시

만약 1101001이라는 2진수의 숫자가 있다고 했을 때, ROL 연산을 하게 되면 1010011, 즉, 왼쪽으로 2진수 숫자가 쉬프트 하게 되고 밀려난 숫자는 맨 뒤로 가는 방식으로 연산을 하게 된다. 이와 반대로 ROR 연산을 하게 됐을 때에는 1110100, 즉, 오른쪽으로 2진수 숫자가 쉬프트 하게 되고 밀려난 숫자는 맨 앞으로 가는 방식으로 연산을 하게 된다.


일단 파일을 다운받아보자. 그리고 입력값을 받는 함수를 찾기 위해, 문자열 찾기 correct를 찾아보자.


이 함수 이후에 test 명령어가 있는걸 보아하니, 이 함수가 입력값을 받는 함수인 듯 하다.
이 함수의 주소로 가 보자.

어셈블리어를 분석할 시간이다. 개인적으로 굉장히 번거로운데 어쩔 수 없다.
cmp 명령어를 위주로 집중적으로 분석해 보면 된다.
다 적기에는 기니까 핵심 명령어 위주로 적어보도록 하겠다.

cmp rax, 1F
-> rax 값을 1F, 즉 31과 비교한다는 의미이다. 여기서 사용자 입력 값과 비교하는 문자열(아마 플래그)은 31자리라고 추정해 볼 수 있다.
rol al, cl
-> al 레지스터의 비트 값들을 왼쪽으로 밀어준다. 맨 왼쪽의 밀린 비트값은 cf자리에 온다. cl은 비트값들이 움직일 때마다 수가 2배씩 증가한다는 의미
lea rdx,qword ptr ds:[7FF7541C3000]
-> rdx의 값이 [7FF7541C3000] 주소에 있다는 의미
cmp eax, ecx
-> eax와 ecx의 값을 비교, eax값은 사용자 입력값을 담고 있고, ecx는 메모리에 올라와 있는 값을 담고 있다.


어셈블리어를 정확히 번역한 건 아니지만, 대강 해석해보면 이렇다. 어셈블리어 문맥에 따라, rdx의 값이 위치한 주소로 가 보자(덤프 따라가기로 가면 된다)
참고로, 덤프 따라가기를 할 때, 상수에서 따라가기를 선택해야 한다. (rdx의 값이 [7FF7541C3000]에 있으므로) 이 주소로 가 보면

위에서 문자열은 31자리라고 하였으므로, 31자리 헥스값을 해독하면 답이 나오는 줄 알고 처음에는 base64에서 복호화를 시도해 봤다.

??
뭐지...?
헥스값에 숨겨져 있을까 싶어서 헥스값을 변환해도 플래그 값이나 그 어떤 단서값도 나오지 않았다.
IDA의 디컴파일 기능을 이용하여, 입력값을 받고 비교하는 함수 부분을 디컴파일 해보니

;;
rol 계산을 한 후, 비교해서 값을 도출해야 한다. rol 계산을 구하는 식은 인터넷에서 찾았다.
링크텍스트
파이썬으로 코드를 짜 보자.

encrypted 배열에서 처음에는 문자열로 헥스값들을 넣었는데 안굴러가서 서칭을 해서 코드를 다시 짰다...😅
range 값이 (33, 128)인 이유는 아스키 코드에서 32번부터 127번까지 문자열을 나타내기 때문이다. 아스키 코드표는 0번부터 시작하기 때문에 코드를 짤 때는 1씩 더해서 범위를 (33, 128)로 표현해 줬다.

실행해 보면

플래그 발견

사실 플래그를 찾는 방법을 알아내기는 쉬웠으나, 코드를 짜는 부분에서 크게 헤맸고, 결국 인터넷에서 솔루션을 찾았다...ㅋㅋ
IDA를 조금 더 잘 활용할 방법을 찾아보고, c언어 공부랑 파이썬 공부를 좀 더 해서 코드를 잘 짤 수 있도록 노력해야겠다...😂

profile
개발 + 보안

0개의 댓글