Taking Off 세번째 리버싱 문제이다.
이 문제부터는 조금씩 머리를 써야한다.
물론 그렇게 어렵진 않다.
taking_off 라는 바이너리 파일이 하나 주어진다. 역시나 확장자는 없고
Make sure you have the correct amount of command line arguments
지난번 revving_up 문제에서는 argument가 "banana" 하나였다.
(참고 : https://hackingstudypad.tistory.com/33 )
열어보면 알수없는 복잡한 코드들이 마구 보이는데
if(argc == 5)
argv[0] = revving_up
argv[1] = banana
0번째에는 항상 실행경로가 들어가고 띄어쓰기로 구분해서 1번째에 banana가 들어가게 된다.
그리고 argc는 위의 갯수니 2가 출력될 것이다.
좀더 심화해서 ./hello.exe I am security man 이라고 입력했다고 치자
argv[0] = hello.exe
argv[1] = I
argv[2] = am
argv[3] = security
argv[4] = man
그럼 이렇게 각각 구분이 되고 argc 는 총 갯수인 5가 될것이다.
이문제의 argc도 5이니 인자를 실행경로 제외하고 4개를 줘야한다.
이제 어떤 값을 줘야하지 알아보자.
7,8,9번째 줄을 보면 된다.
string_to_int(argv[1], &v4);
string_to_int(argv[2], &v5);
string_to_int(argv[3], &v6);
100 * v5 + 10 * v4 + v6 != 932
strcmp(argv[4], "chicken")
argc가 5이므로 아직 argument가 하나 남았다
마지막 argument는 13번째 줄에서 찾을 수 있다.
strcmp는 string compare로 문자열을 비교하는 함수이다.
argv[4]가 chicken 인지 비교하고 있다.
따라서 마지막 인자는 chicken으로 주면 된다.
지금까지 정보를 종합해서 입력해본다.
Well, you found the argumentm but what's the password?
if( ((unsigne __int8)s[i] ^ 0x2A ) != desired[i])
이 부분이다.
s 라는 배열은 사용자가 입력한 password 정보를 담고 있다.
예를들어 hello 라고 입력했다면 ['h', 'e', 'l', 'l', 'o'] 이런식으로 한글자씩 쪼개서 s 라는 배열에 들어가게 된다.
그리고 그 배열은 앞에서부터 차례로 0x2A 라는 값과 XOR 하게된다.
^ 기호는 논리연산에서 XOR 이라는 의미이다. (두 비교대상이 같으면 0, 다르면 1을 리턴한다.)
각각 XOR 된 값을 desired 라는 배열에 들어있는 값과 비교하고있다.
IDA에서 desired 라는 부분을 더블클릭하면 해당 배열의 내용을 볼 수 있다.
'CTF > 리버싱' 카테고리의 다른 글
[RiftCTF] Reversing 0x0002 - 리버싱 / IDA (38) | 2022.03.30 |
---|---|
[angstromCTF] Inputter - 리버싱 / argument (50) | 2022.03.21 |
[angstromCTF] Revving Up - 리버싱 / argument (43) | 2022.03.14 |
[angstromCTF] Windows of Opportunity - 리버싱 / IDA (38) | 2022.03.13 |
[Aero CTF] Eldery File - 리버싱 / 파이썬 (7) | 2022.03.02 |