목록CTF·wargame/Reversing.kr (5)
모두의 dream
C#으로 만들어진 프로그램이다. dnspy를 이용해서 디컴파일 했다. 코드를 보면 Button이 존재하는데 사이즈가 0으로 되어 있다. 방법: C# 프로그램을 작성한 후 컴파일하면 C# 컴파일러에 의해 IL로 변환. C# -> IL -> 기계어 -> 실행 그렇기 때문에 IL 명령어을 수정. 우클릭 -> Edit IL Instructions 으로 버튼 사이즈 값 수정. 위 방식대로 Button의 사이즈를 조정해주면 안보이던 버튼이 보인다.
음악을 실행시켜주는 프로그램이다. 60초가 되면 1분 미리듣기만 가능하다는 문구가 출력된다. 그래서 1분 미리듣기만 가능하다는 문구를 디버거에서 찾아보았다. 위 부분이 1분 미리듣기입니다를 출력해주는 코드이고, break point를 걸고 실행하다 보니 위에서 시간을 비교하는 것 같은 어셈블리어 코드를 발견했다. cmp eax, EA60 원래는 0xEA60(60,000/컴퓨터 시간처리 단위 ms) 이었으나 확인을 위해 0xFFFF로 변경했다. 노래는 계속 나오지만 Run-time error 가 출력된다. 오류가 뜨면서 exception이 딱 걸리는 지점. 스택을 확인해보면 00402B58 값이 스택에 PUSH 되어있다. vbaHresultCheckobj 함수에 push 된 값과 위의 값이 동일하므로 아래..
Name과 Serial 값을 입력받고, 값이 틀리면 Wrong 문자열이 출력된다. 대충 흐름을 보니 내가 입력한 Name 에 따라 Serial 값이 바뀌게 되고, 이 문제는 Serial 값이 5B134977135E7D13 일때 Name 값을 구하는게 목적이다. 입력한 값들을 순서대로 저장되어 있는 0x10, 0x20, 0x30과 XOR 연산을 진행한다. 그리고 401150의 argument 로 그 값이 전달된다. (401150 함수에서 serial key가 생성된다.) 그래서 401150 함수 내부를 분석해봤는데 도저히 어셈만으로는 분석이 불가능했다. 그래서 롸업을 찾아보다가 알아챘는데 0x10, 0x20, 0x30 과 xor 연산한 값이 아래처럼 아스키 코드값으로 저장이 되고 있었다. (hello 입력..
패킹이 되어있고, OEP를 찾으면 된다. 쭉 내려가다 보면 특정 구간으로 jmp를 하는 어셈코드가 있다. 패킹되어 있는 코드의 마지막 구간은 대부분 이렇게 비슷하게 생겼다고 본 것 같다. 그래서 jmp를 통해 이동하면 OEP 가 나온다.
실행해보면 어떤 입력을 받고, 그 값이 틀리면 Incorrect Password 라는 문구가 출력된다. GetDlgItemTextA API 를 이용하여 사용자로부터 문자열을 받고, 저장된 문자열 중 두 번째 단어가 "a" 인지 cmp를 이용하여 확인한다. 만약 a가 아니라면 jmp를 하고 Incorrect Password 문구가 출력된다. 두 번째 단어를 "a"로 만들어주면 나오는 다음 단계이다. 401150 함수에 세 번째 단어의 주소값을 전달한다. 입력한 값 중 세 번째 단어의 값과 네번째 단어의 값을 35(5), 79(y) 값과 비교한다. 네 번째 단어부터 열두 번째 단어까지 R3versing 인지 확인하는 부분이다. (한 루프당 두 개의 단어를 비교하는 반복문이 돌아간다.) 그리고 마지막으로 첫..