Hero CTF 2023 - Rope Dancer (srop, stack pivoting)
A circus has just opened near you and you would love to work there as a rope dancer. Perhaps you could access their recruitment criteria to maximize your chances of being selected?
Host : nc static-03.heroctf.fr 5002
Format : Hero{flag}
Author : SoEasY
medium
- [31 solves / 460 points]
Analysis
1 | Arch: amd64-64-little |
1 | char buf[16]; // [rsp+0h] [rbp-10h] |
처음에 buf
에 입력을 받고 전역 변수인 motivation_letter
에도 매우 넉넉하게 입력을 받는다. 보호기법이 아무것도 걸려있지 않기 때문에 단순하게 생각해야한다.
pie
가 걸려있지 않아서 전역 변수 주소를 바로 알 수 있고, 값을 적은 곳의 주소를 계산할 수 있다. (오프셋을 계산할 수 있다.)
처음에 buf
에 입력을 받을 때 명백한 bof
가 발생한다. 하지만 길이가 짧기 때문에 어딘가에 payload
를 저장하고 그 곳으로 뛸 생각을 1차적으로 해야한다.
motivation_letter
에 입력받는 사이즈가 크기 때문에 적절해보였다. 여기에 rop_payload
를 저장하고 뛰어야겠다. 그리고 execve
함수 인자 /bin/sh
를 저장해야겠다.
sigreturn rop
를 할 때 가장 주의해야 할 점은 rax
레지스터의 크기를 잊지 않고 0xf
로 맞춰주고 syscall ; ret
를 실행해야한다는 것이다.
stack pivoting
할 때 가젯 덩어리들 보면서 단순하게 leave ; ret
이 안보여서 당황할 수도 있다.
1 | .text:0000000000401114 mov rsp, rbp |
이 문제는 어셈블리로 쓰여졌기 때문에 위 어셈블리가 leave ; ret
임을 눈치채야 한다.
Solve
stack pivoting 하는 법
- rbp를 jump하고 싶은 주소 -8로 세팅 (rop 가젯이 있는 곳 - 8)
- ret를 leave_ret주소로 변경
Exploit Code
1 | from pwn import * |