-> CPU : 주기억장치, 연산을 수행(사람의 뇌같이)
-> 메모리 : 결과가 실행되는 영역
-> 보조기억장치 : 하드디스크=영원히 저장되는 공간
-> 입력,출력장치 : 입력과 출력을 하는 장치
==> 스레드 영역을 공략하여 > 원하는 코드를 삽입
함수는 종료될때 Main으로 돌아가는 Return 주소를 가지고 있음
-> Return : 사이즈 4바이트의 고정된 길이의 주소를 가짐
==> BoF : 입력 할수 있는 모든 Form을 대상으로 Return 주소에 대한 조작 가능성을 판단한다
입력 form
-> 1) socket 기반의 Open port로 데이터 보내기
-> 2) 데이터 열기
-> 3) 실행파일이 웹 서버를 가지고 있어, 웹브라우저를 통해 처리되는 데이터가 App으로 전송되는 경우
디버거 : 역분석=원시적으로 되돌려서 분석하는 단계
-> 어셈블리어(가장 낮은 레벨의 프로그래밍 언어)를 사용
레지스터 : 디버거를 통해 데이터가 저장되는 변수
-> 범용 레지스터 : EAX,EBX,ECX,EDX,ESP
-> EAX~EDX : 산술경과 저장, 사용자 입력 결과 저장, 반복문 결과 저장
-> ESP : 스택포인터=실행되고 있는 메모리 주소를 저장
-> 명령 레지스터 : EIP
-> EIP : 다음에 실행될 주소(다음에 이동할 메모리 공간)를 저장
def sum():
C=A+B;
return main
main()
sum(); <---- call 어셈블리어로 호출
return ();
흐름 : main > sum호출 > sum실행 > main리턴 > 종료
1) Input Form Find : socket(port), 파일, WebBase
2) 데이터 전송 (입력 되는 부분의 함수 사이즈 확인 용도)
-> Return주소의 변조 가능성(EIP에 우리가 입력 한 문자열 확인)
->임의의 큰 데이터를 입력 >> EIP 조작(DEP, ASLR, SEH등 보호 기법이 걸려 있어도 같은원리)
//취약점이 존재하면 무조건 EIP 조작이 가능함
3) 정확한 버퍼사이즈 구해서 EIP에 우리가 원하는 문자열로 4바이트 채우기
-> msf-pattern_create -l 2000 //패턴을 가지는 문자열 2000바이트 생성
-> msf-pattern_offset -q //EIP에 확인된 주소에 대해 오프셋(버퍼사이즈) 구하는 명령어
4) 다른공간의 스택으로 점프(실행)할 수 있는 주소 4바이트 찾기
-> jmp esp, push esp ..등
-> !mona modules //취약한 모듈(프로그램) 찾기, 보호 기법(SEH, ASLR, DEP)이 없는
-> !mona jmp -r esp -m essfunc.dll ///취약한 모듈로 부터 esp공간으로 이동(점프)하는 주소 찾기
5) Bad Char 찾기
*"\x90" 10 = \x90은 NOP코드를 뜻함, 아무런 기능없이 공간만 차지, 10개를 넣겠다.
-> 10~20개를 보통 넣음 >> 우리가 앞에 넣은 A라는 문자열과, 리턴주소, 그리고 뒤에 나오는 셸코드간에 가상의 공간 분리라고 보면됨(일종의 벽)
-> ESP 를 통해 Follow in Dump해서 , Dump창 기준으로 오른쪽방향으로 짤린 문자열이 배드캐릭터가 됨.
ex) 01 02 03 99 >>> 04가 배드캐릭터