https://www.corelan.be/index.php/2009/07/23/writing-buffer-overflow-exploits-a-quick-and-basic-tutorial-part-2/

 

Exploit writing tutorial part 2 : Stack Based Overflows – jumping to shellcode | Corelan Cybersecurity Research

Where do you want to jmp today ? In one of my previous posts (part 1 of writing stack based buffer overflow exploits), I have explained the basisc about discovering a vulnerability and using that information to build a working exploit. In the example I hav

www.corelan.be

 

Exploit writing tutorial part 1에서는 JMP esp를 활용하여 shellcode를 실행했습니다.

이번 글에서는 JMP esp 이외에 다양한 방법을 알아 보겠습니다.

 

1. JMP or CALL [register]

만약 register에 shellcode를 가리키는 주소가 로드된 경우 해당 register를 단순히 JMP or CALL 하면 된다.

Kernal32.dll에는 많은 CALL [register]를 가지고 있으므로 꽤나 공격가능한 경우의 수가 많이 존재한다.

위는 findjmp 도구를 활용한 방법이다.

CALL esp, JMP esp 를 찾을 수 있다.

 

2. pop/ret

만약, shellcode를 가리키는 register가 없다면 pop / ret 가젯을 적절히 섞어야 한다.

shellcode 자체는 stack에 위치하고 있을 것이다. esp를 덤프해서 shellcode가 위치하는 address를 확인 한다면 pop / ret 가젯을 통해 shellcode로 점프할 수 있다.

하지만, 위 방식의 전제는 esp + offset에 shellcode가 위치 해야한다!

공격자가 eip를 제어하려고 하는 경우 register 중에 shellcode를 가리키는 것은 존재하지 않으나 shellcode가 esp + 8에 존재한다면 eip에 pop pop ret 가젯을 통해 공격이 가능하다. esp + 8로 흐름이 가기 때문에 해당위치에 JMP esp를 삽입한다면 shellcode로 점프가 가능해집니다.

payload는 아래와 같을 것이다.

dummy(26047byte) + pop pop ret + dummy(4byte) + nop(8byte) + JMP esp + shellcode

 

 

3. PUSH ret

만약, JMP [register], CALL [register] 기계어를 찾을 수 없다면, 스택에 주소를 입력하고(PUSH [register]) ret을 처리해 주면 된다. 기본적으로 ret이 뒤따라 오는 PUSH [register] 명령을 찾으려 노력해야 한다. 이러한 순서를 가지는 기계어를 찾고, 이 순서에 따라 수행하는 주소를 찾은 뒤, 그 다음 EIP를 해당 주소로 덮어쓴느 기법이다.

4. JMP [reg +  offset]

만약 shellcode를 포함하는 버퍼를 지시하는 register가 있지만 그것이 shellcode의 시작 위치를 가리키지 않는다고 가정해 보자. 공격자는 shellcode로 가기 위해 필요한 바이트의 덧셈 연산을 하고, 해당 레지스터로 점프를 시켜 주는 OS 또는 애플리케이션에 포함된 dll 파일 중 하나에서 기계어를 찾을 수 있다.

5. blind ret

공격자가 eip를 ret 가젯 주소로 덮어쓰면, esp에 저장된 내용을 eip에 주입하는 효과를 누릴 수 있다.

payload는 아래와 같을 것이다.

ret 가젯(ret) + shellcode 주소 + ...

6. 버퍼 용량

만약 공격자가 이용할 수 있는 버퍼 용량이 (1) 제한되어 있다는 사실과 발견한다면(EIP를 덮어 쓴 후에), 하지만 EIP를 덮어쓰기 전에는 (2) 어느 정도의 용량을 확보할 수 있다면, 공격자는 제한된 용량을 가지는 버퍼에서 (1) 여유 있는 용량을 가지는 버퍼 (1) 에 대해 '점프 code'를 수행할 수 있을 것이다.

7. SEH

모든 애플리케이션은 OS에 의해 제공되는 예외 처리기를 기본적으로 가지고 있다. 그래서, 만약 애플리케이션 자신이 예외 처리를 사용하지 않는다 하더라도, 공격자는 SEH 핸들러를 자신이 원하는 주소로 덮어쓰고, 쉘코드로 점프를 수행하도록 할 수 있다. 자세한 내용을 뒤에서 다루겠습니다.

 

 

정보정보

1) Kernal32.dll에는 많은 CALL [register]를 가지고 있어, 이용 가능한 register들의 범위가 넓고, 꽤 유명한 방식이다.

2)

 

참고

https://byungjin-study.blogspot.com/2015/11/exploit-writing-2-1.html

https://jjuns-studyroom.tistory.com/entry/Exploit-writing-tutorial-part2-how-to-jmp-shellcode

'윈도우 버그 헌팅' 카테고리의 다른 글

Exploit writing tutorial part 8  (0) 2024.03.06
Exploit writing tutorial part 7  (0) 2024.03.05
Exploit writing tutorial part 6  (0) 2024.03.01
Exploit writing tutorial part 3  (0) 2024.02.21
Exploit writing tutorial part 1  (0) 2024.02.20