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 34 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