strcmp 함수를 이용해서 "zer0pts{****CENSORED****}" 값과 입력값을 비교한 뒤
모든 글자가 맞으면 Correct! 틀리면 Wrong! 을 출력한다.
이 문제는 ltrace라는 도구를 이용하면 쉽게 풀 수 있다.
위키백과에는 ltrace가 이렇게 나와있다.
ltrace는 사용자 공간 애플리케이션의 공유 라이브러리에 대한 호출을 보여주는데 사용되는 리눅스의 디버깅 유틸리티이다. 이것은 동적 로딩 시스템을 후킹함으로써 가능해지며, 애플리케이션이 호출 시에 사용하는 파라미터들과 라이브러리 호출이 리포트하는 반환 값을 보여주는 심(shim)들을 삽입한다. ltrace는 또한 리눅스 시스템 호출을 트레이스할 수 있다. 이것이 동적 라이브러리 후킹 메커니즘을 사용하기 때문에, ltrace는 대상 바이너리에 직접적으로 정적 링크된 호출들을 트레이스할 수 없다.
읽어봤는데 무슨말인지 모르겠다면 정상이다.
이런건 직접 부딪혀보면서 배우면 된다.
ltrace의 사용법은 바이너리를 실행시킬때 위처럼 앞에 ltrace만 붙여주면 된다.
입력값을 a만 줬을때 strcmp에서 리턴하는 값이 -25이다.
이게 무슨 의미인지 생각해보자.
strcmp 함수가 사용자의 입력값과 비교하는 값은
"zer0pts{****CENSORED****}" 였다. ---> 맨 첫번째 글자가 소문자 z 이다.
위의 아스키코드표를 한번 보자.
참고로 아스키코드는 영문 키보드로 입력할 수 있는 모든 기호들이 할당되어 있는 기본 부호체계이다.
자세한 설명은 생략한다.
소문자 z의 10진수 값은 122이다.
그리고 소문자 a의 10진수 값은 97이다.
97-122는? -25가 된다.
ltrace가 리턴한 -25란 값은 strcmp 에서 비교한 첫번째 글자가 입력값보다 25칸 앞에 있다는 의미이다.
실제로 b, c, d, e 차례대로 넣어보면 리턴값이 -24, -23, -22, -21 이렇게 줄어드는걸 볼 수 있다.