본문 바로가기

드림핵

[드림핵 워게임] rev-basic-3

<문제>

 

<풀이>

먼저 동적 분석을 해본다.

 

Windows PowerShell을 열어 다운로드한 chall3.exe 파일을 드래그앤드롭했다.

 

엔터를 눌러 실행한다.

Input : 이라고 뜨며 입력을 대기한다.

 

임의로 apple을 입력했다.

 

엔터를 누르면 Wrong이라는 메시지가 뜨고 프로그램이 종료된다.

 

 

 

이제 정적분석을 해본다.

IDA를 이용했다.

열 파일에 대한 정보가 나온다.

변경사항없이 OK를 클릭한다.

 

적용할 심볼파일이 없으므로 No를 클릭한다.

 

Shift+F12 단축키를 눌러 문자열 목록을 본다.

Correct 문자열을 찾을 수 있다.

해당 문자열의 상호참조를 찾아가보면

입력값과 올바른 input 값을 비교하는 명령문이 있는 함수를 찾을 수 있을 것이다.

Correct 문자열을 더블클릭한다.

 

Buffer 변수를 선택한 후 상호참조를 찾기 위해 단축키 x를 누른다.

 

main함수를 찾을 수 있다.

해당 줄을 더블클릭하여 어셈블리 상에서의 main 함수를 찾는다.

 

main함수를 찾았다.

F5를 눌러 디컴파일한다.

 

sub_140001000함수의 반환값에 따라 성공/오류 메시지가 결정된다.

해당 함수를 더블클릭한다.

 

입력값을 가공한 값과 byte_140003000에 있는 데이터를 비교한다.

byte_140003000을 클릭하여 데이터를 확인한다.

 

데이터를 찾았다.

 

앞서 살펴본 sub_140001000함수에서 

입력값에 XOR한 값에 2*i를 더한 값을 byte_140003000[i]와 비교했다.

byte_140003000[i]에서 2*i를 뺀 값에 XOR의 역연산인 XOR을 취하면 올바른 입력값을 찾을 수 있을 것이다.

 

flag = [0x49, 0x60, 0x67, 0x74, 0x63, 0x67, 0x42, 0x66, 0x80, 0x78, 0x69, 0x69, 0x7B, 0x99, 0x6D, 0x88, 0x68, 0x94, 0x9F, 0x8D, 0x4D, 0x0A5, 0x9D, 0x45, 0x00]

for i in range(0,len(flag)-1):
    print(chr((flag[i] - 2*i)^i), end="")

byte_140003000의 데이터를 flag배열에 담고

한 문자씩 역연산을 취하여 대응되는 ascii 문자를 chr()함수로 찾아 출력하는 파이썬 코드이다.

 

위와 같이 찾고자 하는 입력값을 구할 수 있다.