본문 바로가기

전체 글

(192)
Assembly Reversing 공부법 1. IDA ( Interactive DisAssembler ) 설치. 2. c 300 문제. 컴파일옵션 : release모드, win32로 컴파일 후 exe파일 생성. 3. Visual Studio에서 Optimization 꼭 끄기. 4. exe파일 IDA로 열어보기. 5. C300제 소스로 IDA분석 후 C코드로 재구성. *debug 와 release의 가장 큰 차이 : 디버깅을 하기위한 코드가 있는가 없는가 debug모드는 printf가 안되면 왜 안되는지 확인가능하지만 release는 아무것도 나오지 않는다. *win32 64bit의 차이 : 레지스트의 개수, 사이즈가 다르다.
Assembly Reversing(1~10) ▶001. C프로그램 시작하기 문제 : C 언어를 사용하여 "안녕하세요"를 출력해 보시오. int main(){ printf($sg2684) } ※ 설명할 부분이 없다.. ! ▶002. 변수형 개념 배우기 문제 : 변수 x에 1을 저장하고, 변수 y에 2를 저장하여, x와 y의 합을 z에 저장하는 프로그램을 작성하시오. int main(){ int a = 2; int b = 1; int sum = 0; sum = a+b; printf("%d \n", sum); return 0; } 쉽다. ! ▶003. 상수형 개념 배우 문제 : 정수형 상수 1과 실수형 상수 3.141592를 더하는 프로그램을 작성하시오. 소스 피연산자를 fpu 레지스터 스택에 푸쉬하는 것이다. (데이터 로드) 그렇다면 fpu 레지스터란..
9일차] 스택 메모리, 함수 1. 실행중인 프로세스의 전체 메모리 구조 알아보기. 스택 메모리 : 함수, 지역변수 1). sleep을 통해서 hello.c파일을 실행중인 파일로 만들어준다. 2). hello.c파일을 gcc 후에 실행하고 Ctrl+z를 통해 백그라운드를 시켜준다. 3). ps -ef | grep a.out을 통해서 PID를 알아낸다. 4) cd /proc/PID(836) 이때 PID는 다를 수 있다. 5) 해당 PID에서 cat maps파일을 보면 다음과 같이 스택메모리를 볼 수 있다. 6) 메모리 구조는 다음과 같이 할당되어 있다. 0x08048000-0x08049000 text section 0x08049000-0x0804a000 data section(.data .bss .heap) ~ deserved(heap..
8일차] 반복문(for, if) [ 반복문: for, while, do-while ] int i; for( i = 0; i < 10; i++){ printf("%d", i ); } int i = 0; while( i
7일차] 분기문(if, switch) [ cmp: compare ] - 레지스터나 메모리의 값을 변경하지 않는다. - 플래그 레지스터에만 영향을 준다. - SF(Sign Flag), CF(Carry Flag), ZF(Zero Flag) - cmp left, right ( left - right ) 1). 결과가 0인 경우 : 같다. ( ZF: 1, SF: 0 ) # 8번째 비트(SF)가 0, 7번째 비트(ZF)가 1인 것을 확인할 수 있다. # 지금 쓰고있는 체제에서는 flag를 확인할 수 있는 방법은 pushfd를 통해서 7번째비트(ZF)와 8번째비트(SF)를 확인해서 알아야 한다. 2) 결과가 음수인 경우: right가 더 큰 경우 ( ZF: 0, SF: 1 ) #8번째 비트(SF)가 1, 7번째 비트(ZF)가 0인것을 확인할 수 있다...
6일차] 비트연산자, 논리연산, 형변환 1. 비트연산: shift 연산 1). 부호가 없는 연산 - 왼쪽으로 이동: shl - 오른쪽으로 이동: shr ex). eax = 4 0000 0100 eax = eax 작은 -eax -> ax -> al
5일차] 연산자 (사칙연산) [ 사칙연산 ] 1. 덧셈: ADD # 먼저 sum에 10을 넣고, sum의 값고 20을 더하는 모습이다. # 레이블 a와 b에 10과 20을 넣고 둘이 더한 값을 sum에 넣는 모습이다. 2. 뺄셈: SUB # 뺄셈은 ADD와 별 다를 것이 없다. 같은 형식으로 사용하면 된다. 3. 곱셈 - MUL ( unsigned ) - 피연산자 1개 - IMUL ( signed ) - 1개~3개 # 상위 16비트만 사용하기 때문에 초기화 과정을 거쳐주어야 한다. # 이렇게하면 상위 16비트는 edx 하위 16비트는 eax에 저장된다. 따라서 추후에 비트연산을 통해서 확인해보면 된다. 4. 나눗셈 - DIV( unsigned ) - IDIV( signed ) [실습] - 두 정수를 입력받아서 덧셈, 뺌셈, 곱셈, ..
4일차] 명령어(mov, lea) [ mov ] - C언어의 assignment(=)할당 연산자와 비슷한 개념 - 기본적인 형태 : mov dst, src - ! dst, src 가 둘 모두 메모리가 올 수는 없다. -ex) # entry point의 eax레지스터에 10을 할당하고 있다. 메모리 할당부분인 num은 시작 주소값을 나타내고 있고 때문에 mov인자 값에 그대로 사용할 수 없다. 메모리할당을 위해 []를 해줘야 하며 어디까지인지 알 수 있게 dword 를 앞부분에 붙여주어야 한다. # 어셈블리에서 buffer 숫자배열과 문자열에 접근하는 방법을 알 수 있는 예제이다. double word 즉 dword이며 4바이트씩 차지하기때문에 +8을해야 30이라는 숫자를 출력할 수 있고, string인 'korea'는 1바이트씩움직이므로..