bof

A stack canary blocks the naive overflow, so the write has to be placed around it rather than through it.

2026.08.18 Pwn original post

드디어 오버플로우 문제다!

Figure 1

Figure 2

python3 -c 'print("A"*36 + "\xbe\xba\xfe\xca")' | ./bof

32 bit 인 걸 확인하고, 32 뒤에 값을 넣으니 이런 메세지가 뜬다.

Figure 3

이 메시지는 Stack canary 가 켜져 있다는 뜻이다. 즉, 현재 컴파일된 바이너리는 -fstack-protector 가 활성화되어 있다. 그래서 key 를 덮기 전에 canary 값이 깨졌고, 프로그램이 abort 된 것이다.

그러니 이건 간단한 오버플로우 문제가 아니라, Stack protector 를 우회하는 게 키이다. Canary 끄고 다시 컴파일해보려 했지만 permission denied 당했다. 즉 우회가 이 문제에 중요한 거 같다.

main 함수와 func 함수를 gdb 로 분석해보자.

Figure 4

Figure 5

Figure 6

Figure 7

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의 문자열은 “유니코드 텍스트” 였음..

그래서 ..

Figure 8

그 후

Figure 9