bof
A stack canary blocks the naive overflow, so the write has to be placed around it rather than through it.
드디어 오버플로우 문제다!
python3 -c 'print("A"*36 + "\xbe\xba\xfe\xca")' | ./bof
32 bit 인 걸 확인하고, 32 뒤에 값을 넣으니 이런 메세지가 뜬다.
이 메시지는 Stack canary 가 켜져 있다는 뜻이다. 즉, 현재 컴파일된 바이너리는 -fstack-protector 가 활성화되어 있다. 그래서 key 를 덮기 전에 canary 값이 깨졌고, 프로그램이 abort 된 것이다.
그러니 이건 간단한 오버플로우 문제가 아니라, Stack protector 를 우회하는 게 키이다. Canary 끄고 다시 컴파일해보려 했지만 permission denied 당했다. 즉 우회가 이 문제에 중요한 거 같다.
main 함수와 func 함수를 gdb 로 분석해보자.
overflowme 에서 key 까지는 52바이트가 떨어져 있음. gets() 입력 버퍼는 [ebp-0x2c] 에 위치하고, key 값은 [ebp+0x8] 에 존재한다. 따라서 offset 은:
0x2c (buffer → ebp) + 0x8 (ebp → key) = 0x34 (52 bytes)
즉, key 를 덮기 위해서는 총 52바이트가 필요하다.
52바이트(아무 값) + 4바이트(0xcafebabe, 리틀엔디안: \xbe\xba\xfe\xca)
==> 'A'*52 + '\xbe\xba\xfe\xca'
그런데 이렇게는 막혔다. 카나리가 깨졌다고 나온다.
python3 -c 'print("a"*52 + "\xbe\xba\xfe\xca")'
알고 보니 Python 3에서 "A"*52 + "\xbe\xba\xfe\xca" 이건 바이트열이 아니라 유니코드 문자열이다. 즉 "\xbe" 는 “0xBE 한 바이트”가 아니라, U+00BE 라는 문자로 취급된다. 예를 들면:
\xbe→ Unicode 문자 ¾\xba→ Unicode 문자 º\xfe→ Unicode 문자 þ\xca→ Unicode 문자 Ê
Python 2의 문자열은 거의 “바이트”였고, Python 3의 문자열은 “유니코드 텍스트” 였음..
그래서 ..
그 후








