📌 어셈블리어 실습 방법 - 코드 패치
1부터 100까지의 합 코드를 작성하기 전에 Immunity Debugger에서 코드 패치를 이용하여 새로운 코드를 작성하는 방법을 다루려고 한다.
디버거에서 아무 실행 파일(*.exe)을 열고, 코드 부분을 더블 클릭해서 수정하면 된다.
코드를 더블 클릭하면
왼쪽 처럼 뜰 텐데, 여기서 코드를 수정하고 Assemble을 누르면 해당 줄의 코드가 변경되고 밑에는 NOP으로 모두 변경된다.
아래로 순서대로 코드 패치를 진행하면 된다.
📌 1부터 100까지의 합 ver.1 (레지스터 3개 사용)
- EAX, EBX값을 1로 초기화 시키고 EBX를 1씩 증가시키면서 EAX에 EBX를 더해준다.
- LOOP는 EBX가 100이 될 때까지 돈다. (ECX가 0일 때까지 돈다. 여기서 LOOP 명령어는 ECX를 먼저 1감소하고 0인지 아닌지 비교함에 주의)
💻 코드
- EAX를 1로 초기화 시킨다.
- EBX를 1로 초기화 시킨다.
- LOOP는 EBX가 100일 때까지 더하려면 2~100까지 즉 99번 돌아야 하므로 ECX값을 99로 정해 줘야함. 99를 16진수로 하면 63이기 때문에 63으로 초기화 시킨다.
- 보기 편하게 한 줄 띄우기 위해 NOP 사용. (해당 줄은 없어도 된다.)
- EBX를 1씩 증가시킨다.
(1~100을 더하는데 EAX가 1이고 EBX도 1이기 때문에 EBX를 먼저 1증가시키고 EAX에 더하는 것을 반복한다.) - EAX에 EBX를 더해서 EAX에 저장한다.
- 5번 줄과 6번줄을 EBX가 100이 될 때까지 (CX가 0이 될 때까지)반복한다.
💡 레지스터 변화 확인
1. EAX, EBX, ECX 초기화
2. 더하는 과정
EBX값을 1 증가시킨 후 EAX에 EBX를 더한다.
3. 결과
ECX가 0이 되면 LOOP를 멈춘다. 99번 돌았기 때문에 이 시점에서 EBX값을 보면 1에서 99를 더한 64(10진수로 100)이다.
또한 EAX 값은 1에서 100까지를 더한 13BA(10진수로 5050)가 되어있는 것을 확인할 수 있다.
📌 1부터 100까지의 합 ver.2 (레지스터 2개 사용)
- EAX값을 0으로 초기화 시키고 ECX가 100부터 0까지 -1씩 하면서 ECX를 EAX를 더한다.
- LOOP는 ECX가 0일 때까지 돈다. (여기서 LOOP 명령어는 ECX를 먼저 1감소하고 0인지 아닌지 비교함에 주의)
💻 코드
- EAX를 0으로 초기화 시킨다.
- LOOP는 1~100을 더해야 하므로 ECX값을 100으로 정해 줘야함.
100를 16진수로 하면 64이기 때문에 64으로 초기화 시킨다. - EAX에 ECX를 더한다. (처음엔 100, LOOP 한 번 돌 때 ECX가 -1되므로 다음엔 99를 더하는 식)
- ADD EAX, ECX를 100번 돈다.
💡 레지스터 변화 확인
1. EAX, ECX 초기화
2. 더하는 과정
ECX 값을 EAX에 더해주고 ECX값은 루프를 돌면서 1씩 감소한다.
3. 결과
ECX가 0이 되면 LOOP를 멈춘다.
EAX 값은 100에서 1까지를 더한 13BA(10진수로 5050)가 되어있는 것을 확인할 수 있다.
📌 느낀점
레지스터 3개를 사용할 땐 2 ~ 100까지 99번 돌아야 해서 ECX 레지스터에 99를 16진수로 바꾼 63을 넣어줬는데,레지스터 2개를 사용할 땐 ECX가 직접 합에 관여하는 변수였기 때문에 1 ~ 100을 더해야해서 100을 16진수로 바꾼 64를 넣어주는 과정이 헷갈렸었다.
지금 생각해보면 레지스터 3개 사용할 때 EAX, EBX 초기값을 0으로 넣고 총 100번(1부터 100까지) 도는 걸로 생각해서 ECX에 64를 넣는 것이 좀 더 수월했을 수도 있을 것 같다.
'Security > Windows' 카테고리의 다른 글
[Immunity Debugger] sum.exe 파일 분석 (0) | 2022.03.06 |
---|