스택 프레임이란 ESP(스택 포인터)가 아닌 EBP(베이스 포인터) 레지스터를 사용해 스택 내의 로컬 변수, 파라미터, 복귀 주소에 접근하는 기법이다. ESP레지스터의 값은 수시로 변경되기 때문에 스택에 저장된 변수나 파라미터 등을 ESP를 기준으로 하면 프로그램을 만들기 힘들 수 있다. 따라서 어떤 기준 시점의 ESP 값을 EBP에 저장하고 이를 함수 내에서 유지시켜주면, ESP가 변한다 한들 EBP를 기준으로 안전하게 접근 할 수 있다. PUSH EBP ; EBP 사용 전에 기존 값을 스택에 저장 MOV EBP, ESP; 현재 ESP를 EBP에 저장 .... MOV ESP, EBP; ESP를 정리(함수 시작때의 값으로 복원) POP EBP; 리턴되기 전 원래 EBP 값으로 복원 RETN
Reversing
ESP는 스택을 나타내는 스택 포인터이다. PUSH를 이용하여 스택에 값을 넣으면 스택 포인터는 위로 움직이고 (스택 포인터의 값이 감소하고) POP을 이용하여 스택에서 값을 빼면 스택 포인터는 아래로 움직인다. (스택 포인터의 값이 증가한다)
명령어 단축키 설명 Restart Ctrl+F2 처음부터 디버깅 시작 Step Into F7 하나의 Op Code 실행(CALL 명령어 만날 시 함수 내부로 진입) Step Over F8 하나의 Op Code 실행(CALL 명령어 만날 시 함수 내부로 진입X) Execute till Return Ctrl+F9 함수 코드 내에서 RETN 명령어까지 실행 Go to Ctrl+G 원하는 주소로 이동 Execuite till Cursor F4 Cursor 위치까지 실행 Show the previous Cursor - 직전커서 위치를 다시 보여줌 (뒤로가기) Show the current EIP * 현재 EIP 위치를 보여줌 Set/Reset BreakPoint F2 BP 설정/해제 View-Breakpoints..
Input 값에 알맞은 값을 넣어 Correct 값이 나오게 하면 되는 문제이다. 먼저 IDA에 프로그램을 넣고 main함수를 찾아보겠다. Strings 항목에서 Correct 부분을 더블클릭해준후 F5를 통해 디컴파일 해주면 main함수를 찾을 수 있다. 딱봐도 sub_7FF677621000에 true가 반환되게 하면은 Correct를 얻을 수 있다. 보면은 byte_7FF677623000[i]의 값이 i xor (a1+i) + 2*i랑 같아야 통과할 수 있다. byte_7FF677623000값을 hex view에서 보면은 아래와 같다. 우리가 필요한 값은 0x18까지 즉, 24자리이므로 49부터 45까지의 값을 긁어와 파이썬을 이용해 플래그를 확인해보겠다. by = [0x49, 0x60, 0x67, ..
한줄씩 차근차근 해보겠다. [Register] rcx = 0 rdx = 0 rsi = 0x400000 ======================= [Memory] 0x400000 | 0x67 0x55 0x5c 0x53 0x5f 0x5d 0x55 0x10 0x400008 | 0x44 0x5f 0x10 0x51 0x43 0x43 0x55 0x5d 0x400010 | 0x52 0x5c 0x49 0x10 0x47 0x5f 0x42 0x5c 0x400018 | 0x54 0x11 0x00 0x00 0x00 0x00 0x00 0x00 ======================= [code] 1: mov dl, BYTE PTR[rsi+rcx] // dl = 0x67 2: xor dl, 0x30// 0x57 3: mov B..