ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Reversing] strncmp
    Wargame/HackCTF 2019. 11. 21. 23:57

     

    문제설명

    이 binary는 입력받은 문자열과, 저장되어있는 문자열과 값을 비교했을 때, 같으면 "Good Game" 다르면 "Always dig deeper"를 출력한다.

    무수한 mov의 요청..

    프로그램 초반에 값을 28글자만큼 스택에 저장하고, ("OfdlDSA|3tXb32~X3tX@sX`4tXtz")

    <strcmp_> 함수를 통해서 같은지 비교를 하는 듯하다. <strcmp_>는 사용자 지정 함수이므로, 까보자.

    접근방법

    <strcmp_> 함수에서 하는 일을 중요한 부분만 추려보면 다음과 같았다.

    입력받은 문자의 길이 만큼 다음을 실행
    	- 입력받은 문자 하나를 가져와서 0x601014의 값과 XOR연산 수행

    gdb에서 보면, 다음과 같다.

    첫 번째 인자(입력받은 문자열)를 rbp-0x28에, 두번째 인자(저장된 문자열)를 rbp-0x30에 넣는다.

    for(i = 0; i < strlen(rbp-0x28); i++) 부분이며, 여기서 i는 rbp-0x14이다.

    대망의 XOR부분이다. 입력 받은 문자열중 한 문자([rdx])를 ecx register에 넣은 후, 0x601064의 값과 XOR 연산을 한다.


    여기까지 코드 분석이며, 문제에서 요구하는 것은 아무래도 key인 0x601064 값일 것이라 예상된다.

    풀이

    key 값을 구하는 과정은 다음과 같다.

    1. main초기에 stack에 저장된 문자열 ("OfdlDSA|3tXb32~X3tX@sX`4tXtz")은 key에 의해 XOR된 값이다.
    2. flag 형식이 "HackCTF{"로 시작하므로, "OfdlDSA|"이 XOR된 결과 값일 것이다.
    3. XOR 연산에서 교환법칙이 성립하므로, key를 찾을 수 있다.

    그러므로 소스코드로 위의 내용을 구현해보자.

    string1 = "HackCTF{"
    string2 = "OfdlDSA|"
    
    for i in range(8):
        print(hex(ord(string1[i]) ^ ord(string2[i])))

    결과값은 다음과 같다.

    0x7
    0x7
    0x7
    0x7
    0x7
    0x7
    0x7
    0x7

    Key는 0x7이므로, 결과 값을 도출해보자.

    string = "OfdlDSA|3tXb32~X3tX@sX`4tXtz"
    
    for s in string:
        print(chr(0x7 ^ ord(s)), end='')

    Get Flag!

    'Wargame > HackCTF' 카테고리의 다른 글

    [Reversing] Static  (0) 2019.12.04
    [Reversing] Keygen  (0) 2019.11.24
    [Reversing] Handray  (0) 2019.11.21
    [Reversing] Reversing Me  (0) 2019.11.21
    [Reversing] Welcome_REV  (0) 2019.11.21

    댓글

Designed by Tistory.