이 문제는 사용자에게 문자열 입력을 받아 정해진 방법으로 입력값을 검증하여 correct 또는 wrong을 출력하는 프로그램이 주어집니다.
해당 바이너리를 분석하여 correct를 출력하는 입력값을 찾으세요!
x64dbg로 chall0.exe 파일을 연다.
아래와 같이 검색하여 correct 문자열을 찾는다.
첫 번째 칸을 더블클릭하여 찾아가면 correct가 출력되는 어셈블리 코드 부분이 나온다.
Input을 입력받는 것처럼 보인다. test eax, eax는 eax가 0인지 체크하는 코드다. test 연산은 피연산자끼리 and 연산 후 결괏값은 저장하지 않고 플래그 값 세팅하여 je, jne 같은 분기문에 영향을 준다. eax가 0이면 ZF(zero flag)가 1로 세팅되고 바로 아래의 je chall0.7FFC3231166이 실행된다. chall0.7FFC3231166으로 가면 wrong을 출력하기에 test eax, eax 바로 위의 call chall0.7FF7C3231000에서 eax을 0이 아닌 값으로 세팅해야 한다. call chall0.7FF7C3231000을 더블클릭하면 해당 주소로 이동한다.
test eax,eax 결과 eax가 0이 아니면 jne chall0.7FF7C3231028으로 이동하여 실행하는데 그 결과 eax에 0이 세팅된다. 그렇다면 결국 wrong을 출력할 것이다. 따라서 test eax, eax 결과가 0이 되어야 한다. strcmp함수를 호출하는데 strcmp는 두 문자열이 동일하면 결괏값을 0 반환한다. 0은 eax에 저장되어 반환된다. 두 문자열 중 하나는 7FFC3232220 주소에 위치한 Compar3_the_string이다. rsp+40 주소엔 내가 입력한 문자열의 주소가 저장되어 있을 것이다.
결과적으로 flag는 DH{Compar3_the_string}이다.
'dreamhack > Reverse Engineering' 카테고리의 다른 글
rev-basic-3 (0) | 2023.02.14 |
---|---|
rev-basic-2 (0) | 2023.02.13 |
rev-basic-1 (0) | 2023.02.12 |