Tamu CTF 2023 - Pointers (pwn, 2bytes overflow)
I’ve been messing with pointers lately which never goes wrong, right?
Author: anomie
- [90 solves / 421 points]
Analysis
바이너리와 소스코드를 제공해준다.
1 |
|
vuln
함수를 IDA로 살펴보면 아래와 같다.
1 | ssize_t vuln() |
2byte overflow가 발생한다. 후에 void (*poggers)() = func_ptrs[0];
을 통해 lose
함수가 호출된다. 이 대신 vuln
함수의 overflow를 통해 win
함수가 호출되는 것이 목표이다.
Solve
처음에 출력해주는 함수 포인터 주소를 0x7ffebafcc630
라고 하자. 이는 lose
함수 주소가 저장되어있고 +8한 0x7ffebafcc638
에는 win
함수 주소가 저장되어있다.
1 | → 0x5589074ca2c4 <main+74> mov rax, QWORD PTR [rbp-0x20] |
rbp-0x20
주소에 저장된 값을 rax
에 넣는다. 이 값이 전달되어 rdx
에 들어가고 결국 call rdx
를 실행한다. 결국 rbp
에는 0x7ffebafcc638 + 0x20
값이 들어가야 한다.
Exploit Code
1 | from pwn import * |
Flag
1 | gigem{small_overflows_are_still_effective} |