emu8086은 80~90년대 사용되던 8086 프로세서 에뮬레이터다. 이게 왜 필요할까?
요즘은 어셈블리어에 대한 사람들의 관심이 거의 없다 보니 자료를 찾아도 예전 도스(DOS) 시절 만들어진 자료가 대부분이다. 물론 그런 자료도 참고 할 수는 있지만 컴퓨팅 환경이 그때와는 너무 많이 달라져서 그런 책이나 자료로 실습은 불가능한 상황이다. 그래서 예전 환경을 에뮬레이팅 해 주는 EMU8086이 필요한 것이다.
Cheat Engine에서 Tutorial 프로세스를 열어 준다. Value를 변경해 가며 정확한 Address를 찾는다.
찾은 Address에서 오른쪽 클릭 하고 'Find out what accesses this address'를 클릭한다.
Cheat Engine에 debugger를 붙여 준다.
아래와 같은 창이 뜬다.
Tutorial로 돌아가 Change value 버튼을 클릭해 값을 변경 하면 018F3D30 주소에 접근한 opcode들이 표시 된다. 그 중 두 번째 opcode가 018F3D30 위치의 값을 바꾼다는 것을 알 수 있다. (아래 창에서 << 표시된 opcode) More information을 클릭하면 약간의 추가 정보가 표시 된다.
Cheat Engine에서 value가 저장된 Address인 018F3D30을 다시 Hex scan 한다.
018F3D30이 저장된 Address가 Pointer의 Address 이다. Add Address Manually 버튼을 클릭한다.
Pointer를 체크한다.
Pointer의 Address를 입력한다. offset 값은 없으므로 0으로 둔다.
Value가 저장된 위치를 가리키는 Pointer가 추가 된다.
Value를 5000으로 수정하고 Active를 체크한다. (Value가 5000으로 고정 된다)
Tutorial에서 Change value 버튼을 클릭하면 Value가 바뀌지만 메모리 상에서는 다시 5000으로 돌아간다. Change pointer 버튼을 클릭하면 Pointer가 가리키는 주소(Value 값이 저장된 주소)가 바뀌고 Cheat Engine 에서 찾아 놓은 Pointer 가 가리키는 주소값도 똑같이 바뀐다. Next 버튼이 활성화 되고 Pointer를 찾았음을 확인 할 수 있다.
다시 ollydbg로 돌아와 F12를 눌러 정지 시킨다. 하지만 여기서는 Paused 상태가 되지 않고 Pausing 상태가 된다.
콘솔창에서 숫자를 입력 한다.
숫자를 입력하면 아래와 같은 주소로 이동하고 정지 상태가 된다.
F8, Alt + F9, Ctrl + F9 를 적당히 눌러가며 진행 하면 scanf가 종료되는 것으로 보이는 위치가 나타난다.
같은 파일을 x32dbg로 열어 보자.
F9를 눌러 진행 한다.
한번 더 F9를 눌러 진행하면 아래와 같이 Running 상태가 된다.
숫자를 입력하라는 콘솔창이 뜬다.
x32dbg로 돌아가 Threads 창을 열어 준다.
Title Bar에는 Main Thread가 선택되어 있는 것 처럼 표시 되지만 Main Thread가 아닌 2번 thread가 활성화 되어 있다. 이 상태에서는 break point가 제대로 작동하지 않는다. Main Thread를 활성화 해 준다.
아래와 같은 주소로 이동 된다. F12를 눌러 Pause 한 후(F12를 한 번 누르면 화면에는 아무것 도 표시되지 않는다. 두 번 누르면 Error setting breakpoint at XXXXXXXX! (SetBPX) 가 표시 되지만 무시하자) 콘솔창에서 숫자를 입력한다.
숫자를 입력하고 나면 아래와 같이 Paused 상태가 된다.
F8, Alt + F9, Ctrl + F9 를 적당히 눌러가며 진행 하면 scanf가 종료되는 것으로 보이는 위치가 나타난다.
스크롤을 조금 올려 보면 프로그램의 전체적인 내용을 파악 할 수 있다. pdb파일이 같이 있기 때문에 소스 라인까지 표시 된다.