[pwnable.xyz] add
System/PWNABLE

[pwnable.xyz] add

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