시스템 해킹

 1576, 1/79 회원가입  로그인  
   pk920207
   궁금합니다. bufferoverflow 공격질문 (질문 2개)

http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=1669 [복사]


(공격의 방법이 각각 틀릴수 있으니 제가 사용하는 공격의 방식을 약간 설명드리겠습니다.)

1번질문 : NOP 을 이용한 bufferoverflow

strcpy를 통해 입력하는 buffer에 NOP과 쉘코드를 넣어준다.
그러면 buffer는 \x90\x90\x90\x90\x90...shellcode /ebp /ret 의 형태가 된다.
여기서 ret의 값을 버퍼오버플로우로 변조해 \x90이 들어가있는 곳에 주소를 입력해주면
프로그램은 strcpy를 진행한 후 ret의 주소에 따라 \x90이 많이 들어가 있는곳의 한 위치로 이동하게되고
NOP은 아무것도 하지 않는 명령어이므로 한바이트씩 계속 이동해 쉘코드를 실행하게 된다.

여기서 쉘코드가 있는 곳의 주소를 바로 알아낸다면 더없이 좋겠지만 찾기가 어렵다고 들었습니다.
그리하여
int sp()
{__asm__("movl %esp,%eax");}
void main()
{
int esp();
esp=sp();
printf("%p\n",esp);
}
를 통해 esp의 값을 알아내어 공격시 변조할 ret에 이 주소값을 넣어주고 여러번 공격하면 성공하게 된다는 건데요.
질문이
위의 코드는 변조한 ret이 NOP사이에 걸쳐지게 하기 위해 주소값을 알아내려고 만든 코드인데
왜 esp의 값을 사용하나요? 무슨 관련이 있나요?


2번질문 : 환경변수 버퍼오버플로우 기법에서
공격에 관한 설명으로는
export attack=`perl -e 'print "\x90"x100,"shellcode";'`
위와 같이 attack이라는 환경변수에 쉘코드를 넣고.
getenv(); 함수를 사용한 코드를 통해 attack의 주소를 알아냅니다.
그리고 (예시)
./bufferoverflow `perl -e 'print "a"x23,"\xaa\xbb\xcc\xdd";'`
(bufferoverflow = 취약프로그램, 23=예시로 제공하는 버퍼.., \xaa\xbb\xcc\xdd=attack의 주소값(예시))
를 통해 ret값을 attack 환경변수로 돌려주므로써 권한을 획득하는 공격입니다.

여기서 이해 안가는 부분이
export attack=`perl -e 'print "\x90"x100,"shellcode";'` 에서
"\x90"x100 이부분 입니다.  NOP을 왜 100개나 넣어주는 건가요?

답변 부탁드립니다. 정말 알고싶습니다.

  Hit : 5287     Date : 2013/04/29 08:39



    
potatos 음.. 첫 번째 질문은 저도 예전에 배울 떄 이해가 잘안되는 부분이었는데 똑같은 분이 계시는 군요..ㅋㅋ
esp값을 넣어주는 이유는 esp가 스택의 어느 부분을 가리키고 있는데 그 스택을 가르키는 놈을 적어주는 겁니다.
운이 좋으면 nop썰매타고 바로 쉘을 실행하겠지요.

두번쨰는 nop은 많이 넘을수록 좋습니다.
쓰레기값이여서 실행되도 중지되지않고 바로 다음 nop을 실행시키면서 쉘코드를 만나면 쉘을 실행합니다.
2013/05/01  
pjm2108 esp가 스택의 가장 아랫부분을 가리키고 있기 때문입니다. 어셈블리로 관찰하면 쉽게 이해 됩니다.
ebp는 스택의 시작부분, esp는 스택의 끝부분을 나타내는 레지스터라고 말하고 시작합시다.

push ebp
mov ebp, esp
sub esp, 40h
..중략
add esp, 40h
mov esp, ebp
pop ebp
ret

이게 함수를 call 하면 이동한 루틴의 기본 형태입니다. stdcall이냐 fastcall이냐 뭐 이런거에 따라 달라진다는데, 일단은 저런 형태이구요. sub esp, 40h를 눈여겨 보시면 됩니다. 이건 스택의 크기가 40h 라는 의미입니다.

원래 esp가 ebp였음을 기억하면, esp에서 -40h 했으니, 스택의 가장 아랫부분을 가리키고 있다는 것이 이해되죠?

한마디로 말하면 스택은 [esp ---------<------- ebp][ret] 이라고 보시면 됩니다.
방향이 이상할 수 있는데, 만약 int a; 를 하셔서 지역변수를 선언하면 ... 아 스택에 대한건 끊을께요.
아무튼 esp가 스택의 마지막 부분을 가리키고 있기 때문에 이를 통해 offset을 추측하겠다! 라는 겁니다.
위의 40h는 어떤 지역변수도 선언되지 않았을 때 입니다. 만약 int 형 지역변수가 하나 추가되면 -44h 하겠죠..
2013/05/04