간단한 리버싱 문제이다.
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 이라는 값을 얻을 수 있다.
지금까지 알아낸 값들을 차례대로 입력해주면 플래그를 획득할 수 있다.
'CTF > 리버싱' 카테고리의 다른 글
[DCTF] Seek - 리버싱 / C / fseek (40) | 2022.04.19 |
---|---|
[Space Heroes CTF] Cape Kennedy - 리버싱 / Python (41) | 2022.04.10 |
[RiftCTF] Reversing 0x0002 - 리버싱 / IDA (38) | 2022.03.30 |
[angstromCTF] Inputter - 리버싱 / argument (50) | 2022.03.21 |
[angstromCTF] Taking Off - 리버싱 / IDA (46) | 2022.03.15 |