_start 함수
_start
함수를 보면 main
함수를 호출한다.
main 함수
main
함수를 보면 eax 값이 1이 아니면 Wrong 이라는 문자열로 보아 sub_804851
의 return 값이 1이 되어야 한다.
sub_8048451 함수
함수의 return 값이 1이 되어야 하는데, 위에서 return 을 할 수 있는 루틴은 맨 왼쪽으로 진행되는 루틴 이외에는 존재하지 않는다. 따라서 해당 루틴으로 갈 수 있는 조건들을 확인해 본다.
data_804a021 == 0x31
data_804a024 == 0x7c
data_804a025 == 0x00
data_804a022 == 0x7c
data_804a020 == 0x78
data_804a023 == 0xdd
위에서 부터 위의 조건들을 모두 성립해야 return 1을 한다.
data_804a020 == 0x78
data_804a021 == 0x31
data_804a022 == 0x7c
data_804a023 == 0xdd
data_804a024 == 0x7c
data_804a025 == 0x00
이를 순서대로 정리해 보면 아래와 같이 된다.
하지만 중간에 위치한 xor 도 있기 때문에 이를 적용해 본다.
data_804a020 ^= 0x34
data_804a020 == 0x78
data_804a021 == 0x31
data_804a022 ^= 0x32
data_804a022 == 0x7c
data_804a023 ^= -0x78
data_804a023 == 0xdd
data_804a024 == 0x7c
data_804a025 == 0x00
이를 최종적으로 정리해 보면 아래와 같은 조건들을 만족해야 한다.
data_804a020 == 0x78 ^ 0x34 // L
data_804a021 == 0x31 // 1
data_804a022 == 0x7c ^ 0x32 // N
data_804a023 == 0xdd ^ -0x78 // U
data_804a024 == 0x7c // X
data_804a025 == 0x00 // End of String
그러면 data_804a020 부터 있는 문자열은 어디서 오는지 확인을 해본다.
data_804a020 데이터
아까 main
함수에서 sub_8048451
함수를 호출하기 전에 sub_8048434
함수를 호출한다.
이를 확인해 보면, scanf
함수를 호출하는데 입력받은 값을 data_804a020
에 넣는다.
따라서 data_804a020
는 사용자가 입력한 값이며, 이 값이 위의 조건문을 성립할 경우에만 Correct!
라는 문자열을 확인할 수 있다.
정답
'0x00 Reversing > 0x01 Reversing.kr' 카테고리의 다른 글
Reversing.kr :: Ransomware (0) | 2019.12.09 |
---|---|
Reversing.kr :: Easy_Unpack (0) | 2019.03.01 |
Reversing.kr :: Easy_Keygen (0) | 2019.02.26 |
Reversing.kr :: Easy_Crack (0) | 2019.02.24 |