사용자에게 나이를 입력받아 if으로 비교한 뒤에 18 이상이면 Welcome My Club!!을 출력하게 하고
18 아래이면 들어올수 없다는 문자를 출력하는 C언어를 컴파일하자.
메인함수로 들어오자.
PUSH ECX는 그냥 변수공간을 확보하기 위한 코드이다.
int age; 때문에 4바이트를 확보하기 위한 작업으로 보인다.
scanf에 들어가면 입력을 받을때 까지 기다린다. 16을 입력하면 아래 스택메모리에 10이 들어간 것을 볼 수 있다.
0x10은 10진수로 16이다.
ADD ESP,8
ADD에 8을 더해서 스택을 내린다.
여기서 CMP A,B는 CMP A-B을 한다.
빼기를 해서 결과가 0이면 같은것이다. 만약 0이아니라면 두개가 다르다는 뜻이다.
CMP DWORD PTR SS:[EBP-4],12
는 0x12는 18이다.
EBP는 0018FF44이다.
여기서 4를빼면 아까 SCANF에 입력한 곳에 스택 주소가 되므로 내가 입력한 값과 18을 비교하는 구문이다.
여기서 오른쪽에 Z 0 이라는것이 보이는데 이것으로 같은지 아닌지 판별을 한다.
지금은 16을 넣었으므로 18과 같지 않기 때문에 0이다.
그럼 18을 넣어보자.
Z플래그가 1이 된것을 볼 수 있다. 아래에 스택메모리에 12가 저장된 것을 보아 18을 입력했다.
다음으로 알아야할 플래그는 C인데 C는 캐리 플래그이다.
C 캐리플래그가 1이라는 것은 값을 빌려왔다는 뜻이고, 값을 빌려오면 1이 올라간다.
즉 C 캐리플래그가 1이라는것은 왼쪽이 더 작다는 뜻이다. EX)1-2
C 캐리플래그가 0이라는것은 왼쪽이 더 크므로 크다 라는것을 판별한다
다음은 5를 입력한 상황이다. 0018FF40에 5가 들어갔고 C가 1이고 Z가 0이므로
캐리플래그가 올라간 상태라 여기서 정한 18보다 작다는 뜻이된다. 이렇게 if문을 비교할 수 있다.
다음은 점프 구문에 대한 설명이다.
JGE는 ,Conditional Branch, 조건 분기이다.
JMP는 무조건 분기이다. JMP(주소)
JE [주소] =JUMP IF EQUAL 같다면 점프
JZ = JUM IF ZERO =제로플래그가 0이면점프X
JE=JZ
JNE = JUME NON EQUAL
제로플래그 0이면 0이 아니므로 점프함
JG(JUMP IF GREATER THEN)
크다면 점프해라 (왼쪽이 크다는 뜻)
제로플래그는 0 캐리플래그가 0 이면 왼쪽이 큼
그럼 위에있는 JGE는 무엇인가?
JGE(JUMP IF GREATER OR EQUAL)
같거나 클때 점프한다 라는 뜻이다
Z=0 C=0 A>B이므로 점프 O
Z=0 C=1 A<B 이므로 점프 X
Z=1 C=0 A=B 이므로 점프 O
그럼 만약 이 파일을 조작한다고 하였을 때, JGE구문이 0x12보다 큰지 비교를 하여 "Welcome My Club!!"을
출력하기 때문에 이 구문을 조작하면 되겠다.
밑줄친 부분의 JGE를 JL로 바꾸면 JGE와 반대되는 의미이므로
다음과같이 조작을하면
점프해서 넘어간다
'리버싱<기초>' 카테고리의 다른 글
[Reversing]배열과 변수초기화 (0) | 2018.04.20 |
---|---|
[Reversing]기초 리버싱 프로그램 리버싱해보기 (2) | 2018.04.18 |
[Reversing]변수호출 리버싱 구조 (0) | 2018.04.18 |
[Reversing]기본설정과 간단한 Hello World 분석/ 조작 (0) | 2018.04.17 |