728x90
check
- 64 bit ELF
- Canary
- NX
analyze
pseudo code (IDA)
- if 문의 조건으로 들어간 isoc99_scanf("%ld %ld %ld", &v4, &v5, &v6) != 3 은 scanf에 인자로 들어가는 값이 3개가 안되는 경우를 의미한다. scanf의 리턴 값은 scanf를 통해 입력받은 값의 개수를 나타내는데, 이 때 scanf내에서 사용한 포맷스트링과 실제 입력값이 같지 않은 경우는 리턴 값에 포함시키지않는다. 따라서, 현재의 경우에는 정수값이 아닌 문자, 문자열등을 입력하게 되면 while문을 break하게 된다.
- 배열 v7은 int64 타입의 11개의 인덱스를 가지는 배열로, 한 인덱스당 8byte를 갖는다. 하지만, 실제 v7의 크기를 살펴보면 rbp-60h로 rbp로부터 0x60 즉, 96byte만큼 떨어져있다는 것을 알 수 있다. 다시 말해 v7[0]~v7[10]에 더해서 v7[11]까지 있다는 것이다.
v7[0] | ... | v7[10] | v7[11] | rbp(12) | RET(13) |
8byte | 72byte | 8byte | 8byte | 8byte | win() 주소 |
실행
실행해보면 알 수 있듯, 인덱스 체킹을 엄격하게 하고 있지 않다. 따라서, 인덱스 값(v6)으로 처음 배열을 선언할 때 정한 10을 넘는 위치까지 접근할 수 있다.
win 함수의 주소 구하기
from pwn import *
p = process("./challenge")
elf = ELF("./challenge")
win = elf.symbols['win']
print("win @" + hex(win))
Exploit
SMALL
'System > PWNABLE' 카테고리의 다른 글
[pwnable.kr / Toddler's Bottle] fd (0) | 2022.11.17 |
---|---|
[HackCTF] Register (0) | 2021.04.29 |
[ROP Emporium] write4 (재) (0) | 2021.04.17 |
[HackCTF] Unexploitable_1 (0) | 2021.04.17 |
[ROP Emporium] callme (0) | 2021.04.02 |