level 1과 같은 파일로 분석하지만 "Keyfile.dat"을 생성해서 근본적으로 해결하는 방법으로 진행할 것이다.
먼저 존재하는 "Keyfile.dat"를 삭제하고 임의로 "Keyfile.dat"를 생성하고 "abcd"를 입력했다.
leve1에서는 "Keyfile.dat" 파일이 없어서 CreateFileA 함수가 FFFFFFFF를 리턴하지만 여기서는 "Keyfile.dat" 파일을 생성했기 때문에 CreateFileA 함수가 44를 리턴한다.JNZ조건문을 수행해서 에러메시지 부분을 건너뛰어서 ReadFile 함수로 분기된다.level 1에서는 hFile이 FFFFFFFF이었으나 여기는 44인 것을 알 수 있다. CreateFileA에서 나온 데이터를 읽어들인다는 것을 hFile을 보고 알 수 있다. 1. ReadFile함수는 1을 리턴하기 때문에 JNZ의 조건이 충족되어 4010B4번지 주소 값으로 분기된다. 2. 분기 후 "XOR EBX,EBX", "XOR ESI,ESI" 명령어로 인해 EBX와 ESI가 0으로 초기화 3. 402173번지가 가지는 값과 16진수인 10을 비교한다. 402173번지는 ReadFile 함수의 "pBytesRead" 파라미터의 주소와 같은데, 이는 파일로부터 읽어 온 바이트의 크기이다. 402173번지의 값은 4
처음 "Keyfile.dat"에 "abcd" 4개의 문자를 입력했기 때문에 값이 4가 나온다.
비교를 하게되면 S[Sign Flag]가 켜지는데 그렇게 되면 JL조건문으로 인해 4010F7 주소값으로 분기되어 오류메시지가 뜬다. 그래서 글자수는 16이상이어야 한다.
"Keyfile.dat"에 내용을 추가해서 글자수를 17으로 만들었다. 그리고 402173번지로 가면 16진수로 11이 있음을 알 수 있다.1. 앞에서 EBX를 0으로 초기화 시켜서 가장 위에 있는 명령어는 "MOV AL,[40211A]"로 해석할 수 있다. 2. 입력된 값 중 가장 먼저 입력된 'a'를 가져온다.
40211A번지는 ReadFile함수에서 파일로부터 읽어들인 데이터를 저장하는 버퍼주소임을 알 수 있다.
위 사진을 보면 40211A번지부터 시작해서 "Keyfile.dat"에 입력된 값이 저장되어 있는 것을 볼 수 있고, 40211A에는 'a'가 저장되어 있다는 것을 알 수 있다. 아스키 값으로는 61