y0u_bat

[Window] 2. 윈도우 버퍼오버플로우(여러가지 쉘코드로 점프) 본문

System

[Window] 2. 윈도우 버퍼오버플로우(여러가지 쉘코드로 점프)

유뱃 2015. 9. 1. 09:07



[Window] 2. 윈도우 버퍼오버플로우(여러가지 쉘코드로 점프)


1장에서는 jmp esp을 이용한 기본적인 BOF를 했었다.


2장에서는 쉘코드로 점프하는 여러 방법에 대해 설명 되어 있다.


방법은 여러가지 있다.


1. jmp or call  // 1번문서와 같이 JMP ESP를 이용하는것이다 또는 Call esp를 이용하는 것이다.

2. pop/return // pop과 ret을 이용하여 쉘코드로 이동하는것이다.

3. push/return // push와 ret을 이용하여 쉘코드로 이동하는것이다.

4. jmp [reg+offset] // jmp esp 할때 그버퍼가 esp 시작점에 위치하지 않을때 오프셋을 이용하여 쉘코드로 이동하는 것이다.


5. blind return // 

6. 사용가능 버퍼가 제한되어 있을때때 // 여유있는 버퍼로 점프하여 수행 할 수 있다.

7. SEH // 모든어플리케이션에는 예외 처리가 있는데, 만약 예외 처리가 없다 하더라두 공격자는 SEH 핸들러를 자신이 원하는 주 소로 덮어쓰고, 쉘코드로 점프를 수행하도록 할 수 있다.



먼저 1번 jmp esp 가 아닌 call jmp을 이용해서 해보겠습니다(jmp esp은 1번에서 했음)


1. jmp or call


우선 프로그램에서 로딩되는 dll에서 findjmp.exe로 call esp를 구해줍니다.

저는 kernelBase.dll 에서 구했습니다




이제 페이로드는 (buffer+ebp) + eip + shellcode


이렇게 해주면 되고 eip를 call esp로 해주므로 call esp되어 shellcode가 실행되서 계산기가 뜹니다.






크래쉬도 안뜨고 바로 계산기가 뜨는걸 볼 수 있습니다.


 


2. pop/ret 을 이용한 쉘코드로 점프


pop/ret 그리고 jmp esp를 이용하면 된다.


pop 을 하면 스택에서 4바이트를 꺼내기 때문에  +4가 된다.


ret 어셈은  pop eip; jmp eip 다. 


buffer + eip + (esp시작을 쉘코드로 두기위해 쓰레기내용 4바이트) + nop8바이트  + jmp esp + shellcode


eip에 pop pop ret을 넣으면 총 pop 3번으로 12바이트가 + 되고 그다음에 있는 jmp esp가 eip가 되고


ret에 jmp eip가 되어  jmp esp로 점프 하여 shellcode로 이동 되게 된다.



페이로드 : buffer + eip(pop pop ret) + 쓰레기4바이트 + nop 8바이트 + jmp esp + shellcode


여기서 jmp esp는 저번처럼 dll에서 구해주면 된다.


그리고 pop이랑 ret은  dll에서 마찬가지로 구해주면 된다.










이런식으로 정상적으로 계산기 뜨는걸 확인 할 수 있다.



3. push/ret 을 이용한 쉘코드로 점프


단순하다 push esp; ret 하게 되면


pop eip;jmp eip 하게 되어 스택에 있던 esp주소가 eip에 들어가서 jmp eip하여 쉘코드가 실행되게 된다.



4. jmp [reg+offset] 


이것두 단순하다 dll에서 jmp [esp+4] , jmp [esp+8] 이런 가젯을 찾아서,


eip로 해주면 된다.





'System' 카테고리의 다른 글

[SSA] 시스템 스터디 3주차  (0) 2015.10.20
[SSA] 시스템 스터디 1주차 정리(어셈블리)  (1) 2015.10.06
[Window] 1. 스택 버퍼 오버 플로우  (0) 2015.08.29
hand-ray 연습5  (0) 2015.08.19
hand-ray 연습4  (0) 2015.08.19
Comments