Immunity Debugger를 이용한
Debugging & Reversing
간단한 소스코드를 이용하여 디버깅과 리버싱을 하며 어셈블리어 이해
- Source_1
[ C++ 소스코드 ]
char : %s : 문자
int : %d : 정수
- Asm
[ 참고 ]
보안검사 ;
기본적으로 제공되는 보안검사를 안해서
해석할 때 이해도가 높아짐
[ SUB A, B (A=A-B) ]
- ESP : Stack Frame의 최상단(=Stack Pointer), PUSH<->POP
- POP A : Stack의 Top에서 꺼내 A에 저장
- EBP : Stack Frame의 최하단(=Base Pointer), 함수 호출할 때만 변경됨
- EAX : 누산기, 임시결과저장
- EDX : 32bit CPU register (=DX+(DH+DL))->쪼개어 쓸 수 있음
- DX : 16bit CPU register
- RDX : 64bit CPU register
[ LEA Load Effective Address ]
5를 3만큼 2에 그냥 넣음
[ PUSH-PUSH-CALL ]
=scanf(=printf)
[ MOV EAX, DWORD PTR SS ] [EBP-C]
5를 3만큼 찾아 읽어서 2에 옮김
[ 함수프롤로그 ]
(=Stack Frame 초기화)
; 함수가 사용할 스택프레임을 지정하는 작업
[ 함수에필로그 ]
(=Stack Frame 정리)
; 함수가 사용할 스택프레임을 정리하는 작업
[ DWORD PTR SS:[EBP-4] ]
SS:[EBP-4]에서 DWORD만큼 이동
- BYTE : 1byte CS: CODE SEGMENT []->주소
- WORD : 2byte SS: stack segment
- DWORD : 3byte DS: data segment
- SWORD : 4byte
- BYTE MACHINE : 메모리에는 1바이트마다 주소가 배정됨
- LITTLE ENDIAN : 높은 주소에서 낮은 주소를 읽는다.
- (오른쪽에서 왼쪽으로 6261626F=>6F626162)
- 지역변수 : 함수의 내부에 선언, 함수 내부에서만 접근이 가능, STACK에 할당(함수가 끝나면 변수도 사라짐)
- 전역변수 : 함수의 외부에 선언, 모든 함수에서 접근이 가능, DATA에 할당(함수가 끝나도 저장되어있음)
- stack에 필요없어진 정보는 지워지지않고 후에 덮어서 사용-> 정보가 남아있어서 hack가능(Heart bleed)-> 메모리에 hack 흔적이 남아있어서 분석
[ JGE SHORT Prjt_Hel.0040106A ]
- 분기(Branch=jump)
- 무조건 분기 : JMP주소
- 조건분기 : Jxx주소, Jx주소
- JGE A, B : (A>=B) Jump ok (Jump if Greater than or Equal)
- JL : (Jump if less than) ,<
- JG : >
- JLE : <=
- CMP(Compare)==if, while (A-B) : 빼고 앞에 결과값저장 안함. 빼기만
[ EFLAGS Register (32bit) ]
0과 1(올라감) (32개의 깃발)
- CF(Carry Flag) : 음수가되면 1, 나머지는 0
- ZF(Zero Flag) : 값이 0이면 올라감(1이됨)
- SF(Sign Flag)
- CPU에 연산결과를 보고 결과에 따라 Flag가 바뀜
- ex) 2-3=-1 CF=1,ZF=0 // 2-2=0 CF=0,ZF=1 // 3-2=1 CF=0,ZF=0
- Source_2
[ if문을 이용하여 18세 초과의 경우 allow ]
- 디버깅
[ 로직을 바꿈 ]
[ 결과값을 바꿈 ]
2018-11-27
No comments:
Post a Comment