본문 바로가기
Security/Pwnable

Buffer Overflow 원리 - 공격-1 고전적인 방법

by J0DEV 2021. 8. 8.
반응형

Buffer Overflow 공격

아래 코드의 프로그램을 사용할 것이다.

소스코드를 보면 실행 시 주어지는 첫 번째 인자를 buffer라는 char형 배열에 복사한다.

또한, bound check를 하지 않는 strcpy()함수를 이용하고 있다.

 

그렇다면 아마도

이 프로그램은 1024바이트의 버퍼 공간에 쉘 코드와 NOP로 채우고 4바이트는 main함수의 BP이므로 역시 NOP으로 채우고 다음 만나는 4바이트가 return address이므로 이곳에 쉘코드가 있는 곳의 address를 넣어주면 쉘코드를 실행시킬 수 있을 것이다.

 

그렇다면 이 쉘 코드가 있는 곳의 address찾는 것이 가장 큰 문제가 된다.


고전적인 방법

가장 고전적인 방법으로는 추측하는 것이다.

몇 번의 시행착오를 거치면서 쉘이 떨어질 때까지 계속 공격을 시도애햐만 한다.

쉘 코드가 실행되는 확률을 좀 더 높이기 위해서, 또한 buffer를 채우기 위해서 NOP를 사용하는데 보통 NOP는 0x90 값을 많이 쓴다.

NOP는 No Operation의 약자이다. 즉 아무런 실행을 하지 않는 다는 것이다.

NOP의 역할은 기계어 코드가 다른 코드와 섞이지 않게 하는 것이다.

예를 들어 하나의 함수가 Oxab로 끝났다고 치자. 그리고 다음에 나오는 함수가 0xcdef로 시작한다고 할 때, 이 프로그램은 하나의 함수가 0xab를 수행하고 끝내기를 바란다. 하지만 뒤에 나오는 0xcd를 만나 0xabcd라는 instruction과 0xef라는 전혀 다른 의미의 두 개의 instruction으로 오해가 될 수 있다는 것이다. CPU는 instruction set에 해당값이 있다면 하나의 instruction 단위를 거기서 잘라 인지하게 된다. 따라서 instruction이 섞이지 않게 하기 위해 instruction을 끊기 위한 목적으로 NOP가 사용된다. CPU는 NOP를 만나면 아무런 수행도 하지 않고 유효한 instruciton을 만날 때까지 다음 instruction을 찾기 위해 한 바이트씩 이동 한다.

buffer overflow 공격에서 NOP는 바로 이러한 특성을 이용하여 쉘 코드가 있는 곳까지 아무런 수행을 하지 않고 흘러 들어가게 만드는 목적으로 사용된다.

즉, CPU는 NOP를 만나면 유효한 명령이 있는 쉘 코드의 시작접이 나올 때까지 한 바이트씩 EIP를 이동시키게 되는 것이다.

 

그래서 고전적인 방법에서는 쉘 코드 앞을 NOP로 채우고 return address를 NOP로 채워져 있는 영역 어딘가의 주소로 바꾸면 operation의 흐름은 NOP를 타고 쉘코드가 있는 곳까지 흘러 들어 갈수 있게 되는 것이다.

 

이 방법은 매우 힘들고 노가다를 해야하기 때문에 지금은 거의 사용되지 않는다.

이보다 훨씬 효과적이고 쉬운 방법들이 많이 나왔기 때문이다.

반응형

'Security > Pwnable' 카테고리의 다른 글

FTZ Level 12  (0) 2021.08.09
FTZ Level 11  (0) 2021.08.09
Buffer Overflow 원리 - 쉘코드  (0) 2021.08.06
Buffer Overflow 원리 - Buffer overflow의 이해  (0) 2021.08.06
Buffer Overflow 원리 - 프로그램 구동시의 segment (2)  (0) 2021.08.06