※ 공부 기록용이라 설명이 친절하지 않음
OllyDbg로 열어본다.
00401000~0040100E
PUSH 4번 후, USER32를 호출한다. 처음 봤던 메시지 박스의 내용이 적혀있다. [PUSH], [CALL]
00401013~00401018
PUSH 1번 후, KERNEL32를 호출한다. 두 번째로 봤던 메시지 박스 내용이 보인다. [PUSH], [CALL]
0040101D~0040101E
ESI에 1을 더하고 EAX에 1을 뺀다. [INC], [DEC]
0040101F
00401021로 이동한다. [JMP]
00401021~00401023
ESI에 1을 두 번 더하고, EAX에 1을 뺀다. [INC], [DEC]
00401024
EAX와 ESI를 비교한다. [CMP]
00401026
조건문이 같으면 0040103D로 점프한다. 즉, 앞서 나온 CMP EAX,ESI가 조건이 되어, EAX와 ESI가 같으면 점프한다.
1) 조건을 만족할 때
: 0040103D로 점프한다.
0040103D~0040104B
PUSH 4번 후, USER32를 호출한다. 마찬가지로 처음 봤던 메시지 박스의 내용이 적혀있다. [PUSH], [CALL]
00401050
KERNEL32를 호출하고 프로세스를 종료한다. [CALL]
2) 조건을 만족하지 못할 때
: 다음 주소로 이어진다.
00401028~00401036
PUSH 4번 후, USER32를 호출한다. 마찬가지로 처음 봤던 메시지 박스의 내용이 적혀있다. [PUSH], [CALL]
0040103B
00401050으로 점프한다. [JMP]
00401050
KERNEL32를 호출하고 프로세스를 종료한다. [CALL]
문제를 해결하기 위해서는 이 부분(아래 접은글)의 조건이 일치해서 0040103D로 점프해야 한다.
00401024
EAX와 ESI를 비교한다. [CMP]
00401026
조건문이 같으면 0040103D로 점프한다. 즉, 앞서 나온 CMP EAX,ESI가 조건이 되어, EAX와 ESI가 같으면 점프한다.
문제를 해결하기 위한 방법은 세 가지를 생각할 수 있었다.
1. 어셈블리어를 변경: JE > JMP
이렇게 변경하면, 조건을 보지 않고 무조건 이동하게 된다.
2. 어셈블리어를 변경: JE > JNE
JE는 조건이 일치할 때라면, JNE는 조건이 일치하지 않을 때 점프한다. EAX와 ESI의 값이 일치하지 않다는 것을 이용하여, 일치하지 않을 때 이동하도록 변경해준다.
3. 조건을 변경: CMP EAX,ESI > CMP EAX,EAX
두 개를 비교했을 때 값이 다를 수 없으므로 JE가 실행된다.
수정한 후, 확인해보면 원하는 메시지가 출력된다.
어셈블리어 정리
PUSH : 스택에 값을 저장
CALL : 지정된 주소의 함수 호출
INC : 값을 1 증가
DEC : 값을 1 감소
JMP : 지정된 주소로 점프
CMP : 주어진 두 값을 비교 //혼자 쓰이는 경우는 없고, 뒤에 JMP 같은 명령어가 같이 쓰인다.
JE : 조건 분기, ZF=1이면 점프 //분기문, 조건문들이 이루어진다. (ZF: 제로 플래그(Zero Flag) 연산 결과가 0이면 참(1))
JE, JNE 외에도 다양한 점프 명령어가 존재한다. 이건 나중에 공부하기로..
글에 오류가 있다면 지적해주세요.... 어셈블리어 처음이라 모르는 거 多
댓글