관리 메뉴

HeeJ's

Strncmp :: HackCTF/Reversing 본문

<CTF>/<HackCTF>

Strncmp :: HackCTF/Reversing

meow00 2020. 5. 14. 23:25

Strncmp라는 파일을 다운받아 기드라로 열어

main함수를 찾아 주었다.

 

main 함수를 보면 변수들을 선언하고, 값을 hex로 넣어주고, 

scanf로 값을 받아 strcmp_함수로 값을 비교해

일치하면 Good game

일치하지 않으면 Always dig deeper가 뜨는 것 같다.

 

 

그래서 strcmp_ 함수를 더블 클릭 해보면

입력되는 parameter 값이 char 형인걸 보아

hex값으로 입력되었던 값을 ASCII코드로 변환해주어야 하는 것 같다.

 

그리고 그 입력된 값들을 일일이 key 값과 XOR연산 하면서 일치하는지 확인하는 것 같다.

 

key 값은 무엇일까?

key 변수를 더블 클릭 해보면

strcmp_함수와 check함수에서도 나오는 걸 확인하고,

check 함수를 찾아 들어가봤다.

 

이 함수에서, key 값을 나타내는 방정식을 찾을 수 있었다.

이 hex 값들을 모두 10진수로 바꿔주면

(key - 14) * key = -49

이 방정식에서 key=7임을 알 수 있었다.

 

 

이제 이 main에 있는 변수들과 key 값을 XOR 연산 해주어 flag를 찾아주면 된다.

 

  local_38 = 0x4f; //O
  local_37 = 0x66; //f
  local_36 = 100; //d
  local_35 = 0x6c; //l
  local_34 = 0x44; //D
  local_33 = 0x53; //S
  local_32 = 0x41; //A
  local_31 = 0x7c; //|
  local_30 = 0x33; //3
  local_2f = 0x74; //t
  local_2e = 0x58; //X
  local_2d = 0x62; //b
  local_2c = 0x33; //3
  local_2b = 0x32; //2
  local_2a = 0x7e; //~
  local_29 = 0x58; //X
  local_28 = 0x33; //3
  local_27 = 0x74; //t
  local_26 = 0x58; //X
  local_25 = 0x40; //@
  local_24 = 0x73; //s
  local_23 = 0x58; //X
  local_22 = 0x60; //'
  local_21 = 0x34; //4
  local_20 = 0x74; //t
  local_1f = 0x58; //X
  local_1e = 0x74; //t
  local_1d = 0x7a; //z

 

"OfdlDSA|3tXb32~X3tX@sX'4tXtz"

 

C언어를 이용해 str과 key를 XOR 해주었다.

 

코드

#include <stdio.h>

int main(){
    char* mystr = "OfdlDSA|3tXb32~X3tX@sX'4tXtz";
    
    for(int i=0;i<28;i++){
        printf("%c",*(mystr+i)^0x07);
    }
    return 0;
}

이렇게 해서 flag를 찾을 수 있었다.

 

짠!

'<CTF> > <HackCTF>' 카테고리의 다른 글

So easy? :: HackCTF/Forensics  (0) 2020.08.06
Question? :: HackCTF/Forensics  (0) 2020.08.06
Reversing Me :: HackCTF/Reversing  (0) 2020.05.29
babyMIPS :: HackCTF/Reversing  (0) 2020.05.29
Welcome_REV :: HackCTF/Reversing  (0) 2020.05.15