Dreamhack/Reversing
[Reversing] rev-basic-8 문제 풀이
문제rev-basic-8(dreamhack) 정적 분석해당 문제 또한 다른 rev-basic 문제와 동일한 형태이고 분기문인 compare_fun() 만 살펴보면 다음과 같다.compare_fun()compare_fun()을 분석하면 입력값인 a1에 -5(0xFB)를 곱한 후 byte_140003000과 비교하는 과정으로 동작한다. 처음 해당 문제를 보았을 때 음수 값인 -5 를 곱하는 것을 보고 막막하기만 하였으나, 자료형을 유심히 보았을 때 해결 방법을 생각할 수 있었다. a1에 -5를 곱하게 되면 숫자는 4바이트, 문자는 1바이트 이므로 문자의 상위 바이트를 0으로 채운 워 동일한 크기(4 바이트)로 만든 후 곱셈이 이루어진다. 이후 곱셈이 이루어진 결과를 unsigned __int8로 강제 형변환..
[Reversing] rev-basic-6 문제 풀이
문제 정적 분석이번 문제의 main() 또한 전과 동일한 형태인 것을 확인하였다.main() 다음으로 조건문인 compare_fun() 내부는 다음과 같았다. 자세히 보면 입력값의 값을 다시 인덱스로 사용하여 값을 비교하는 것을 알 수 있다.compare_fun()다시 인덱싱을 하는 것을 확인한 후 생각한 풀이 방법은 다음과 같다.생각한 풀이 방법 byte_140003000 에 존재하는 값을 byte_140003020 에서 인덱싱한다.list.index()의 결과는 인덱스 번호이기 때문에 인덱스 번호가 실제 Flag 일 것이다 코드실제 코드를 작성하기 전 byte_140003020과 byte_140003000 값을 추출한다. 추출하는 코드는 다음과 같다.byte_140003000print(list(ida..
[Reversing] rev-basic-5 문제 풀이
문제Reversing Basic Challenge #5(dreamhack) 정적 분석해당 문제도 특정 문자열을 입력받아 compare_fun() 함수의 리턴 값이 1이 되면 해결되는 문제이다.main 함수(dreamhack) compare_fun() 함수는 i 번째 입력 값(a1)과 i+1 번째 입력 값(a1+1) 을 더한 값이 byte_140003000[i] 값과 일치해야 한다.compare_fun() byte_140003000의 byte 값을 추출하기 위해 다음과 같은 코드를 입력한다.print(list(ida_bytes.get_bytes(here(), 24)))위의 코드로 추출된 byte_140003000의 값은 다음과 같다.[173, 216, 203, 203, 157, 151, 203, 196, ..