profile image

L o a d i n g . . .

DEBUGGING (IDA, GDB 사용)

우리는 이미 tomato.c 소스가 있지만, 보통 소스는 잘 주지 않기에 없다는 가정하에 디버깅을 해보겠다.

 

 

  • IDA로 취약점 발견

헥스레이라는 강력한 기능을 제공하는 디스어셈블러이다. 헥스레이는 바이너리를 디컴파일해서 원본 코드와 흡사한 소스를 떨궈준다. F5 단축키를 누르면 다음과 같이 디컴파일한 소스(pseudocode)가 나온다.

 


IDA에서 8번째 라인을 보면, buffer overflow 취약점이 나는 것을 쉽게 확인할 수 있다.

 

strcpy를 할 때 복사 버퍼의 길이를 검증하지 않기에 버퍼 크기인 10보다 더 넣어줘서 bof를 일으켜 num의 값을 1로 바꾸면 될 것으로 보인다.

 

(strcpy는 버퍼 오버플로우 취약점이 발생할 가능성이 농후하기 때문에 strcpy_s로 대체해 사용하길 권고)

 

 

 

  • GDB ( 발견한 취약점으로 동적 분석 )

 

취약점이 발생한 strcpy를 call할 때 스택을 보겠다. strcpy 함수를 call하기 전에 스택에 매개인자들을 넣어준다.
0x0804851e에 breakpoint를 걸고 strcpy가 실행되기 전후의 스택을 보겠다.

 

 

breakpoint 건 후, 명령행인자(argv[1])에 aaaaaaaa를 넘기고 실행한다.

 

 

strcpy 호출 전 후

strcpy 실행 후 dest에 argv[1] 즉, "aaaaaaaa" 가 잘 들어간 것을 확인할 수 있다.

strcpy를 통해 argv[1] 으로 받은 인자가 dest 버퍼에 잘 복사되는데 이때 버퍼 크기보다 더 넣어 bof 를 일으켜 dest 버퍼 뒤의 값인 v5 값을 바꾸면 쉘을 획득할 수 있을 것이다.

 

 

main의 stack frame

 

main 함수의 일부분

esp+0x1c값(v5)이 0x1이면 system 함수가 실행되고 같지 않으면 0x0804854a <+100> :    mov  eax, 0x0으로 분기한다.

따라서 bof를 통해 v5 값을 1로 바꾸어 주면 쉘을 띄울 수 있다.

 

 

 

EXPLOIT

버퍼의 크기인 10만큼은 더미값인 A로 주고, 그 뒤의 v5 값으로 0x00000001 값을 argv[1]의 인자로 넘겨 쉘을 획득하였따!!!

 

1. hex 값을 입력하기 위해서는 평소 command line에서 입력하듯이 할 수 없다. 그래서 python이나 perl과 같은 언어를 쓰면된다. python으로는 hex 값을 표현할 수 있기 때문이다.

 

2. python에서 -c 옵션을 활용하면 command 라인에서 출력을 할 수 있다.

 

3. 그리고 `(백틱)은 쉘 커맨드의 출력 값을 리턴해주는 용도로 활용된다. shell command를 `으로 감싸서 tomato 바이너리의 명령행인자로 넘기면 명령어의 출력 값이 입력 값으로 넘어간다.

 

 

참고
bpsecblog.wordpress.com/2016/05/20/gdb_memory_3/
복사했습니다!