CTF/리버싱

[AUCTF] Cracker Barrel - 리버싱 / IDA

SecurityMan 2022. 4. 2. 15:30

 

간단한 리버싱 문제이다.

 

crack_barrel 이라는 바이너리 파일이 하나 주어진다.

 

미국에 있는 음식점 체인 이름이라고 하던데 문제와 무슨 연관이 있는지 잘 모르겠다.

 

해당 바이너리 파일은 리눅스에서 실행가능한 elf 파일이다.

 

리눅스의 exe 라고 생각하면 된다.

 

 

프로그램을 실행시켜 보면 Give me a key! 하면서 키값을 요구한다.

 

abcd를 입력해봤는데 아니라고 하면서 프로그램이 종료된다.

 

 

디스어셈블러인 IDA 프로그램을 이용해서 해당 바이너리 파일을 열어봤다.

 

함수목록을 보면 main, check, check_1, check_2, check_3, print_flag 가 있는것을 볼 수 있다.

 

추측컨데 check 함수들을 모두 통과해야 print_flag 가 실행될 듯 하다.

 

 

가장먼저 main 함수이다. 

 

중간에 조건문에서 check 함수를 실행시키고, 결과에 따라서 print_flag() 함수가 실행된다.

 

check를 더블클릭해서 들어가본다.

 

 

check 함수 내부이다.

 

중간에 조건문에 3개가 있고 각각 check_1, check_2, check_3 함수의 결과를 인자로 받는다.

 

check_1 부터 하나씩 더블클릭하여 들어가본다.

 

 

check_1에서는 strcmp 함수로 사용자 입력값이 starwars, startrek 과 일치하는지 검사한다.

 

strcmp 함수는 두 문자열이 같으면 0을 리턴한다.

 

만약 starwars를 입력할 경우, 첫번째 strcmp 에서 0을 리턴하고, 두번째 strcmp 에서 1을 리턴할 것이다.

 

첫번째 strcmp 앞에는 ! 가 있으니 0이 1로 바뀌고 1 && 1 은 1이 되기 때문에 != 0 이 이 된다.

 

startrek을 입력할 경우, 첫번째 strcmp 에서 1을 리턴하고, 두번째 strcmp 에서 0을 리턴할 것이다.

 

첫번째 strcmp 앞에는 ! 가 있으니 1이 0로 바뀌고 0 && 0 은 0이 되기 때문에 != 0 이 거짓이 된다.

 

그러므로 check_1 에서 입력해야하는 값은 starwars 이다.

 

 

실제로 입력해보면 이렇게 starwars를 입력했을때만 다음 단계로 넘어가는것을 확인할 수 있다.

 

 

다음으로 check_2를 살펴본다.

 

사용자 입력값이 a1에 저장되고, 맨 마지막에 strcmp 를 이용해서 s1과 a1이 같은지 확인한다.

 

s1 배열에는 aSiSihtEgassemT 라는 배열에 들어있는 값이 맨 뒤에있는거 부터 차례로 옮겨담아지고 있다.

 

쉽게말하면 aSiSihtEgassemT을 뒤집은 값이 s1 배열이라는 것이다.

 

aSiSihtEgassemT 을 더블클릭해서 안에 내용을 살펴본다.

 

aSiSihtEgassemT 에는 si siht egassem terces 라는 값이 들어있다.

 

이걸 거꾸로 써보면 'secret message this is' 가 된다.

 

두번째 입력할 값은 secret message this is 이다.

 

 

이제 마지막이다.

 

 

check_3 함수 내부이다.

 

먼저 사용자의 입력값이 a1 배열에 저장된다.

 

그리고 a1[i] + 2 ^ 0x14 를 계산한 값을 v6 배열에 저장하고,

 

v6 배열과 v7 배열이 같은지 검사한다.

 

위에 보면 v7 배열이 나와있기 때문에 역으로 계산해주면 v6를 쉽게 구할 수 있다.

 

v7 = [122, 33, 33, 98, 54, 126, 119, 110, 38, 96]
key = 0x14
answer = ''

for i in range(len(v7)):
    answer += chr((v7[i]^key) - 2)

print(answer)

 

python을 이용해 간단하게 코드를 짤 수 있다.

 

v7를 배열을 수도코드와 똑같이 채워주고, 

 

a1[i] + 2 ^ 0x14 을 역으로 계산해야 하니 v7[i] ^ 0x14 - 2 를 계산해 준다.

 

그리고나서 print 해주면

 

 

133t hax0r 이라는 값을 얻을 수 있다.

 

 

지금까지 알아낸 값들을 차례대로 입력해주면 플래그를 획득할 수 있다.

반응형