Reverse engineering11 리버싱#1 - lea 명령어! mov 명령어와 차이는? • LEA: 복사 (Load Effective Address - 유효 주소 로드) > 출발지는 r/m32 > 목적지는 레지스터 > 레지스터 연산 결과를 레지스터에 저장(not 포인터) • MOV와 무엇이 다른가?! > MOV는 값을 로드하고 - mov eax, [ebp+esp+4] -> 값을 넣는다면 > LEA는 유효 주소를 로드한다 - lea eax, [ebp+esp+4] -> 주소를 넣는다! 배우고자 하는 lea에 breakpoint를 걸어서! [1 + 7*1] 괄호의 식 근데 원래 코드를 보면 *1 해당 값은 없었다! 자동으로 *1을 붙여 주었다! *0도 자동으로 붙었다! -> 의미없는 값이니 무시! 그럼 eax 에는 8이 들어가야 한다! 식과 같이 하나씩 변경되는 것을 알 수 있다!! 16의 16.. 2021. 3. 2. 리버싱#1 - add, sub 명령어 배우기! • r/m32 - 피연산자 크기 속성이 32비트인 명령어에 사용하는 더블워드 범용 레지스터 • ADD: 더하기 / SUB: 빼기 > 목적지는 r/m32 또는 레지스터 > 출발지는 r/m32 또는 레지스터 또는 상수값 > 출발지와 목적지가 모두 r/m32일 수는 없음 [메모리 메모리 불가능] > OF, SF, ZF, AF, PF, CF에 영향 > c언어에서 int a // 선언!! -> 그럼 sub esp, 8 // 이런식으로 4byte의 공간을 만들어준다! -- 해당 코드의 순서도 -- - 1- 0 1 2 0 2021. 3. 2. 리버싱#1 - mov 명령어 배우기 > MOV: 복사 • 레지스터 → 레지스터 • 메모리 ↔ 레지스터 • Immediate 값 → 레지스터 또는 메모리 but 메모리 ↔ 메모리 는 불가능이다!! 1. ebx의 값을 -> eax에 넣고! 2. 주소의 값을 ebx에 넣고! 3. [ ] -> 포인터의 역할, ebx가 가르키는 주소의 값 0xff,, 에 10이라는 값을 넣는것! 4. 그리고 eax -> ebx에 값을 넣는 것 - 코드 작성 object 파일을 만들고! r 명령어로 실행하고~!! 현재 스택에는 10과 1234가 들어가 있는 형태이다!! ebx, eax 에는 현재 0이 들어가 있는 것을 확인 할 수 있다! 이제 두번 실행을 시키면!! 그럼 지금 현재 ebx의 값에는 0xbffff098의 값이 들어가 있는거! 그리고 거기에는 1234의.. 2021. 3. 1. 리버싱#1 - segmentation fault 에러 해결하기! - 코드 실행시 segmentation fault 에러가 발생 했을 때! - ex) 해당 코드를 실행 했을 때!! segmentation fault 에러가 발생 아래 명령어 3줄을 추가해준다! int 80h -> system call 이라고 해서! 수 많은 함수들이 있는데 사용자가 응용프로그램에서 호출 할 수 있도록 해준다. linux system call number, exit number 검색해보면 번호에대한 자세한 설명을 알 수 있다. 인자의 값을 0으로 보낸다는 것은 정상 종료를 의미한다! 위에 3줄을 c언어 에서는 exit(0)을 의미한다! 다시 또 링크를 해주고!! 에러?? 이건 내가 stack, 레지스터를 마음대로 사용해서..ㄷㄷ?? 그래서 일단 의미없는 코드를 작성 에러 없이 프로그램이 잘.. 2021. 3. 1. 이전 1 2 3 다음 728x90 반응형