오른쪽 옆에 점프구문 이동 보여주는 것 설정하기
debugging option [alt+o] -> CPU에서 show jump path와 하위 2개 체크
점프구문
JMP에는 30여가지의 종류가 있다.
JMP - 무조건 해당 주소로 점프한다.
JNZ - 연산 결과가 0이 아니라면 점프한다. (CMP로 비교시는 오른쪽에서 왼쪽 값을 뺀 값이 0 이면 점프 sub도)
JNE - 연산 결과가 0이 아니라면 점프한다.
JZ - 연산 결과가 0일 때 점프한다.
JE - 연산 결과가 0일 때 점프한다.
JGE - 연산 결과가 0이거나 더 클 때 점프한다.
JNG - 연산 결과가 0보다 크지 않을 때 점프한다.
....
## 3-1. CMP ( compare ) 비교 연산
CMP(compare)에서는 오른쪽에서 왼쪽 값을 빼서 0이되면 일치한다고 판단한다. 그리고 이 값을 점프 구문에 전달한다.
위의 그림에서 0A부분을 수정해주면 원하는 지점으로 이동할 수 있다.
## switch case 문
스위치 케이스문은 C에서도 잘 쓰이지 않는다. 왜냐하면 공간할당시 필요하지 않은 부분까지도 공간을 할당하기에
공간 낭비가 심하다. 메뉴를 만들때나 가끔 쓰인다.
(int n=5의 n과 switch(n)의 n이 각각 다른 공간을 할당받는다.)
[1]번 문제
TEST는 0인지 아닌지 확인하기 위한 것으로 바로 뒤에 오는 점프 구문을 위한 조건 문이다.
CMP, SUB, TEST 모두 동일한 비교문이다.
[연산]
OR연산은 비교 중에 1이 있으면 무조건 1로 넣는다.
XOR연산은 비교 값이 서로 다르면 무조건 1을 넣는다.
[2]번 문제
코드 변경없이 내용을 넣으려면 argument를 활용해야 한다.
argument란 인자값을 전달 받는 것이다.(post, get)
argv는 argument value로 인자값이고, argc는 argument count로 인자값의 갯수이다.
## argument(인자값)을 임의로 넣기
인자값을 넣을 위치에서 인자값을 넣고 재시작(clt + f2)를 한다. F2으로 breakpoint된 지점까지 F9으로 진행 후 F8으로 한줄 씩 진행하면 success가 뜨는 것을 볼 수 있다.
보이다 싶이 JNZ short 03_02_Qu.00401029의 위치로 가야지 종료되지 않는다. 그러므로 ECX는 0이 아니여야 하며,
ECX는 5와 XOR 연산후 4가 되어야지 되기에 공학용 계산기로 계산하면 그 값은 1인 것을 알 수 있다.
///////////////원본 코드///////////////////
////////////////////////////////////////////
[1]번 문제0
int ECX=0
for(int EAX=0, EAX > 10, EAX++){
ECX=ECX+1;
}
// 여기서 EAX > 10에 해당하는 CMP의 0A를 스페이스바를 눌러 0x5로 고쳐주면 결과값이 15가 된다.
[2] i = 26으로 결과값을 나타내시오
반복 문을 6까지 하면 26이 되며, dump_window에서 sum = %d를 넘기는 printf함수를 찾아 sum을 i로 스페이스바를 눌러서 수정해준다.
[1] 문제
JGE가 while문의 조건이 충족될 때 빠져나갈 위치이므로 이것을 메시지박스 다음 주소로 바꿔주면된다.
[2]문제, 반복문 안에 메시지 박스를 넣어라.
1.소스 수정 없이 Success 창을 띄우시오 (Quiz 03 - 05)
2.프로그램의 실행 과정을 분석하시오 (Quiz 03 – 06)
3. 소스 수정 없이 아이티뱅크를 출력하시오. (Quiz 03 - 07)
4. 다음 조건에 맞게 출력 결과를 변형 하시오 실행 결과 n = 33670, m = 178503으로 나타나게 수정하시오(Quiz 03 – 08)
'리버싱' 카테고리의 다른 글
7일차 리버싱의 오묘한맛 (0) | 2013.04.16 |
---|---|
6일차, (0) | 2013.04.15 |
4일차 역공학, 어셈 & register & stack & dumpwindow에서 내용수정 (0) | 2013.04.11 |
3일차 뺏셈` ~ 배열 (0) | 2013.04.10 |
2일차. 올리디버거 설정 (0) | 2013.04.09 |