[HackCTF] strncmp
Reversing/Reversing (Wargame)

[HackCTF] strncmp

728x90

◾ 실행환경: IDA pro x64

check

64bit ELF 파일이다.

analyze

실행화면

#main

assembly code - graph view

  • call strcmp_함수를 호출한다.
  • mov [rbp+var_54], eax: rbp+var_54 위치에 eax 값을 저장한다. 이 때 eax에 저장되는 값은 strcmp_에서 리턴한 값으로, 만약 비교한 두 문자열의 값이 동일하다면 0을 리턴하고 같지 않은 경우 0이 아닌 값을 출력한다.
  • cmp [rbp+var_54], 0: rbp+var_54에 저장된 값(strcmp_의 리턴값)과 0을 비교한다. rbp+var_54에 저장된 값이 0인 경우 ZF = 1로 설정된다.
  • jnz short loc_400849: ZF가 1이 아닌 경우(not zero), 0x400849로 점프한다.

#strcmp_

strncmp_ 함수 pseudo code

gdb에서 strcmp_에 breakpoint를 걸고 실행해보면

이렇게 사용자가 입력한 값과 비교하는 값을 확인할 수 있다.

=> OfdlDSA|3tXb32~X3tX@sX`4tXtz

#check

check 함수의 pseudo code

이 함수는 프로그램 내부적으로 실행되는 함수인듯 하다. 따라서, 현재 v3 값은 무엇인지 알 수 없지만, if문의 조건을 보았을 때 v3가 7일 때 key 값에 7이 저장된다는 것은 알 수 있다.

key = 7이라고 가정하면, 다시 strcmp_ 함수로 돌아갔을 때 사용자 입력값에 해당하는 a1과 XOR 연산을 해서 다시 a1에 저장하는 것을 알 수 있다. 앞 문제(handray)에서 했던 것처럼 xor 연산을 두 번 하면 원본 값이 나오는 성질을 이용해보자.

 

#include <stdio.h>

int main(void) {
char *s = "OfdlDSA|3tXb32~X3tX@sX4tXtz";
int key = 7;
	for(int i=0; i<strlen(s); i++){
		printf("%c", s[i] ^ key);
	}
return 0;
}

SMALL

'Reversing > Reversing (Wargame)' 카테고리의 다른 글

[CodeEngn] BASIC RCE L12  (0) 2021.05.28
[CodeEngn] BASIC RCE L11  (0) 2021.05.28
[CodeEngn] BASIC RCE L08  (0) 2021.05.11
[CodeEngn] BASIC RCE L06  (0) 2021.05.11
[CodeEngn] BASIC RCE L05  (0) 2021.05.11